当前位置: 首页 > wzjs >正文

广州营销型网站建设团队抚顺市+网站建设

广州营销型网站建设团队,抚顺市+网站建设,郑州人流医院排名,waP六感程序建设网站文章目录 动机思路代码生成数据集的代码(c)数据集生成结果pytorch dataset 文件模型设计其他一些杂七杂八的代码训练函数训练过程代码测试过程代码 最终结果 动机 因为看到文献说神经网络(这里指多层线性层 激活函数)能够实现非线性的运算从而比简单的…

文章目录

  • 动机
  • 思路
  • 代码
    • 生成数据集的代码(c++)
    • 数据集生成结果
    • pytorch dataset 文件
    • 模型设计
    • 其他一些杂七杂八的代码
      • 训练函数
      • 训练过程代码
      • 测试过程代码
  • 最终结果

动机

因为看到文献说神经网络(这里指多层线性层 + 激活函数)能够实现非线性的运算从而比简单的单层输入加单层输出网络全面,虽然在脑海中能有大致的拟合思路。
将输入的两个数通过隐含层进行拆分二进制,从而进行异或操作,但是实践出真知,因此打算自己来写一下试一下。

思路

  1. 一开始,我的模型设计就是输入两个数字的输入层,一个隐藏层,在一个输出异或结果的输出层,具体如下(Linear(2,32),Relu,Linear(32,32),Relu,Linear(32,1))但是经过实际运行,效果超级不好。
  2. 原因细想一下很简单,因为异或操作的本质是位运算,我这样子设计网络的原因比较粗暴,我希望神经网络在输入层的时候将两个数都拆解成16位的二进制数,然后在隐藏层实现异或操作,最后在输出层输出异或结果,但是太理想化,没有良好的loss函数约束,神经网络很难学到这样子复杂的位运算操作。(因为这里我图省事直接用了mse的loss,神经网络很难通过两个数之间的差值来理解位运算。
  3. 后来我就想明白了,我直接把输入的两个数直接拆解成了16 + 16 位的二进制数,网络重新设计成了(Linear(32,64),Relu,Linear(64,64),Relu,Linear(64,16),Sigmoid)。同时损失函数我使用了Bce来进行约束,这样任务实际上就变成了用两个数的二进制表示来预测他们的异或结果的二进制表示,并且使用Bce可以正确的指导神经网络来拟合异或操作。结果也很好,代码如下。

代码

生成数据集的代码(c++)

代码图省事乱写的,能用就行。得到生成的数据集文件train.txt,val.txt,test.txt

#include "bits/stdc++.h"using namespace std;map<pair<int, int>, bool> m;int main() {//写入文件string train_file = "train.txt";string val_file = "val.txt";string test_file = "test.txt";int train_num = 40000;int val_num = 10000;int test_num = 10000;//生成训练集 随机两个数的异或freopen(train_file.c_str(), "w", stdout);srand(time(0));for (int i = 0; i < train_num; i += 1) {//随机生成1 - 30000 之间的两个数int a = rand() % 30000 + 1;int b = rand() % 30000 + 1;pair<int, int> p = make_pair(a, b);if (m[p]) {i--;continue;}cout << a << " " << b << " " << (a ^ b) << endl;}//生成验证集freopen(val_file.c_str(), "w", stdout);srand(time(0));for (int i = 0; i < val_num; i += 1) {//随机生成1 - 30000 之间的两个数int a = rand() % 30000 + 1;int b = rand() % 30000 + 1;pair<int, int> p = make_pair(a, b);if (m[p]) {i--;continue;}cout << a << " " << b << " " << (a ^ b) << endl;}//生成测试集freopen(test_file.c_str(), "w", stdout);srand(time(0));for (int i = 0; i < test_num; i += 1) {//随机生成1 - 30000 之间的两个数int a = rand() % 30000 + 1;int b = rand() % 30000 + 1;pair<int, int> p = make_pair(a, b);if (m[p]) {i--;continue;}cout << a << " " << b << " " << (a ^ b) << endl;}return 0;
}

数据集生成结果

在这里插入图片描述

pytorch dataset 文件

也很简单,就是读入一下转成二进制的数组表示就ok了

import torch
from torch.utils.data import Datasetclass xor(Dataset):def __init__(self, split='train',bit_dim=16):self.data = []with open(f'./dataset_file/xor/{split}.txt', 'r') as f:for line in f:# 假设数据格式为 a,b,cparts = line.strip().split(' ')a = float(parts[0])b = float(parts[1])c = float(parts[2])# 将数据转换为bit_dim位二进制a = [int(x) for x in bin(int(a))[2:]]b = [int(x) for x in bin(int(b))[2:]]c = [int(x) for x in bin(int(c))[2:]]while len(a) < bit_dim:a = [0] + awhile len(b) < bit_dim:b = [0] + bwhile len(c) < bit_dim:c = [0] + cx = a + bself.data.append((x, c))def __len__(self):return len(self.data)def __getitem__(self, idx):x, c = self.data[idx]return torch.tensor(x), torch.tensor(c)

模型设计

这里为什么要把隐藏层的层数设为64呢
具体的可以看这篇 多层感知机是如何解决异或问题的? - 鸽我哥哥的回答 - 知乎
https://www.zhihu.com/question/263676843/answer/1549135982

按照上面这个回答的原理,对于两个1位的异或问题,需要2维度的隐含层,那么对于我们这个问题而言,就相当于是两个16位的异或问题,至少需要32维度的隐含层,但是经过我的实际测试,在隐含层维度位32维的时候,能预测,但是预测的不准,通过增加隐含层的维度后,效果显著提升(至少升到40维)。因此为了凑2进制的数,我把隐含层的维度设计成了64维,其实在网上加也一样,因为到后来神经网络已经完全拟合了异或的操作,训练集,验证集,测试集全对了。

import torch
import torch.nn as nnclass xorModel(nn.Module):def __init__(self):super(xorModel, self).__init__()self.fc1 = nn.Linear(32, 64)self.xor = nn.Linear(64, 64)self.output = nn.Linear(64, 16)self.relu = nn.LeakyReLU()self.sigmoid = nn.Sigmoid()# self.output = nn.Linear(16, 1)def forward(self, x):x = x.flatten(start_dim=1)x = self.fc1(x)x = self.relu(x)x = self.xor(x)x = self.relu(x)x = self.output(x)x = self.sigmoid(x)return x

其他一些杂七杂八的代码

训练函数

def train_model(model, train_loader, val_loader, epochs=50, lr=0.01):# criterion = nn.MSELoss()  # 推荐的损失函数criterion = nn.BCELoss()  # 推荐的损失函数optimizer = torch.optim.Adam(model.parameters(), lr=lr)for epoch in range(epochs):model.train()epoch_loss = 0.0for inputs, targets in train_loader:#将inputs和targets变成inputs, targets = inputs.to(device).float(), targets.to(device).float()optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs.squeeze(), targets)loss.backward()optimizer.step()epoch_loss += loss.item()epoch_loss /= len(train_loader)print(f"[train] Epoch {epoch + 1}/{epochs}, Loss: {epoch_loss:.7f}")model.eval()val_loss = 0.0with torch.no_grad():for inputs, targets in val_loader:inputs, targets = inputs.to(device).float(), targets.to(device).float()outputs = model(inputs)loss = criterion(outputs.squeeze(), targets)val_loss += loss.item()val_loss /= len(val_loader)print(f"[val] Epoch {epoch + 1}/{epochs}, Loss: {val_loss:.7f}")print("Finished Training")

训练过程代码

train_data = xor('train')
val_data = xor('val')train_loader = DataLoader(train_data, batch_size=256, shuffle=True)
val_loader = DataLoader(val_data, batch_size=256, shuffle=False)model = xorModel()
model.to(device)train_model(model, train_loader, val_loader, epochs=100, lr=0.01)

测试过程代码

# 测试模型
test_data = xor('test')
test_loader = DataLoader(test_data, batch_size=256, shuffle=False)model.eval()
correct = 0
total = 0
with torch.no_grad():for inputs, targets in test_loader:inputs, targets = inputs.to(device).float(), targets.to(device).float()outputs = model(inputs)predicted = (outputs > 0.5).float()correct_bits = (predicted == targets)correct_samples = correct_bits.all(dim=1).sum().item()  # 按列检查是否所有位都正确correct += correct_samplestotal += targets.size(0)# print(f"Predicted: {predicted}, Ground Truth: {targets}")print(f"Accuracy: {correct / total * 100:.4f} %")

最终结果

从80个epoch开始就已经完全拟合了。
在这里插入图片描述
最后的测试集准确率也100%
在这里插入图片描述

这样一个小小的实现两个16位二进制数的异或操作神经网络就完成啦

http://www.dtcms.com/wzjs/810592.html

相关文章:

  • 北京+网站建设中国科技成就作文800字
  • 网页给别人做的 网站后续收费杭州搜索推广公司
  • 该网站正在建设html5制作网页的步骤
  • 撰写网站栏目规划网站的建设特色
  • 网站友情链接自动上链移动网站建站
  • 可以用手机做网站吗江西哪里有做电商网站的公司
  • 自学python的网站国外创意网站欣赏
  • 左右布局的网站广东品牌网站建设平台
  • aspnet网站开发书wordpress自定义文章类型置顶
  • 国外免费做网站软件哪些网站可以做帮助文档
  • 比较公司网站与营销网站的不同哪个网站可以做中文云文字
  • 企业外贸网站如何将网站建设得更好
  • 网站内链代码新浪博客搬家到wordpress
  • 网站建设公司 2018聊城网页设计公司
  • 做网站跟app的区别怎么做网站点击率监控工具
  • 建设工程检测预约网站做网站云服务器2m宽带够用吗
  • 流程网站单页设计用什么软件
  • 网站 cms 免费wordpress商业模板
  • app官网谷歌seo推广招聘
  • 婚恋网站女孩子做美容编程scratch
  • 网站建设都包括精美的微网站
  • 崇明建设机械网站中铁三局招聘身材好
  • 社区教育网站建设项目计划书山东省建设厅网站地址
  • h网站开发wordpress观点
  • 网站页面设计如何快速定稿网站怎么做推广和宣传语
  • 提供邢台网站优化wordpress设置文章页关键词
  • 网站开发图片压缩上传报酬动漫设计与制作专业学校
  • 罗湖网站开发网站seo网络优化
  • 江门网站建设方案网站开发工程师前景怎么样
  • 厚街镇网站仿做小型加工厂管理软件