python pytorch 纯算法实现前馈神经网络训练(数据集随机生成)-续

news/2024/10/19 12:39:06/

python pytorch 纯算法实现前馈神经网络训练(数据集随机生成)-续

上一次的代码博主看了,有两个小问题其实,一个是,SGD优化的时候,那个梯度应该初始化为0,还一个是我并没有用到随机生成batch。
博主修改了代码,并且加入了accuracy图像绘制的代码。代码如下:


#coding=gbkimport torch
from torch.autograd import Variable
from torch.utils import data
import matplotlib.pyplot as pltdim=5
batch=32
neuron_num=10
def generate_data():torch.manual_seed(3)X1=torch.randint(0,4,(1000,dim))X2=torch.randint(6,10,(1000,dim))Y1=torch.randint(0,1,(1000,))Y2=torch.randint(1,2,(1000,))print(X1)print(X2)print(Y1)print(Y2)X_data=torch.cat([X1,X2],0)Y_label=torch.cat([Y1,Y2],0)print(X_data)print(Y_label)return X_data,Y_labeldef sampling(X_data,Y_label,batch):data_size=Y_label.size()#print(data_size)index_sequense=torch.randperm(data_size[0])return index_sequensedef loss_function_crossEntropy(Y_predict,Y_real):if Y_real==1:return -torch.log(Y_predict)else:return -torch.log(1-Y_predict)X_data,Y_label=generate_data()
index_sequense=sampling(X_data,Y_label,batch)def test():l=loss_function_crossEntropy(torch.tensor([0.1]),torch.tensor([1]))print(l)def neuron_net(X,W,b):result=torch.matmul(X.type(dtype=torch.float32),W)+bresult=torch.relu(result).reshape(1,result.size(0))#print(result)#print(result.size())return resultdef grad(X,W,b,y_predict,y_real,W2,b2):g1=y_real/y_predict+(y_real-1)/(1-y_predict)result=torch.matmul(X.type(dtype=torch.float32),W)+bresult=torch.relu(result).reshape(1,result.size(0))g2=y_predict*(1-y_predict)g3=neuron_net(X,W,b)g4=W2C=torch.matmul(X.type(dtype=torch.float32),W)+ba=[]for i in C:if i<=0:a.append(0)else:a.append(1)g5=torch.tensor(a)g6=Xgrad_w=g1*g2*g3grad_b=g1*g2#print("grad_w",grad_w)#print(grad_b)grad_w2=g1*g2*g4grad_w2=grad_w2.reshape(1,10)grad_w2=grad_w2*g5#  print(grad_w2.size())grad_w2=grad_w2.reshape(10,1)g6=g6.reshape(1,5)grad_b2=grad_w2grad_w2=torch.matmul(grad_w2.type(dtype=torch.float32),g6.type(dtype=torch.float32))# print(grad_b2.size())return grad_w,grad_b,grad_w2,grad_b2#print(g1,g2,g3,g4,g5,g6)#print(grad_w2)#print(grad_b2)def flat_dense(X,W,b):return torch.sigmoid(torch.matmul(X.type(dtype=torch.float32),W)+b)W=torch.randn(dim,neuron_num)
b=torch.randn(neuron_num)
W2=torch.randn(neuron_num,1)
b2=torch.randn(1)def net(X,W,b,W2,b2):result=neuron_net(X,W,b)ans=flat_dense(result,W2,b2)return  ansy_predict=net(X_data[0],W,b,W2,b2)
print(y_predict)grad_w,grad_b,grad_w2,grad_b2=grad(X_data[0],W,b,y_predict,Y_label[0],W2,b2)loss_list=[]
accuracy_list=[]
learn_rating=0.01
epoch=2000
def train():index=0global W,W2,b,b2for i in range(epoch):W_g=torch.zeros(dim,neuron_num)b_g=torch.zeros(neuron_num)W2_g=torch.zeros(neuron_num,1)b2_g=torch.zeros(1)loss=torch.tensor([0.0])co=0for j in range(32):try:y_predict=net(X_data[index_sequense[index]],W,b,W2,b2)grad_w,grad_b,grad_w2,grad_b2=grad(X_data[index_sequense[index]],W,b,y_predict,Y_label[index_sequense[index]],W2,b2)#   print(grad_w2.size(),W_g.size())grad_w2=torch.t(grad_w2)W_g=W_g+grad_w2grad_b2=grad_b2.reshape(10)#print("b_g",b_g)#print("grad_b2",grad_b2)b_g=grad_b2+b_gW2_g=W2_g+torch.t(grad_w)b2_g=b2_g+torch.t(grad_b)#   print("fdafaf",grad_w,grad_b,grad_w2,grad_b2)loss=loss+loss_function_crossEntropy(y_predict,Y_label[index_sequense[index]])# print( Y_label[index],y_predict[0][0])if (Y_label[index_sequense[index]]==1) &( y_predict[0][0]>0.5):co=co+1if (Y_label[index_sequense[index]]==0) &( y_predict[0][0]<=0.5):co=co+1index=index+1except:index=0print("loss:",loss[0])print("accuracy:",co/32)loss_list.append(loss[0])accuracy_list.append(co/32)W_g=W_g/batchb_g=b_g/batchW2_g=W2_g/batchb2_g=b2_g/batch#print(W.size())#print(b.size())#print(W2.size())#print(b2.size())W=W+learn_rating*W_g#   print("b*********************",b,b_g)b=b+learn_rating*(b_g)#print(W2_g.size())#print(b2_g.size())W2=W2+learn_rating*W2_gb2=b2+learn_rating*b2_g#print(W.size())#print(b.size())#print(W2.size())#print(b2.size())train()
epoch_list=list(range(epoch))
plt.plot(epoch_list,loss_list,label='SGD')
plt.title("loss")
plt.legend()plt.show()epoch_list=list(range(epoch))
plt.plot(epoch_list,accuracy_list,label='SGD')
plt.title("loss")
plt.legend()
plt.show()

可一下跑出的结果:
在这里插入图片描述
在这里插入图片描述
可以看到这样看下来,效果就很不错了。


http://www.ppmy.cn/news/884378.html

相关文章

windows 指纹识别不可用

提示 我们这边出现了问题。请再次尝试。 1 右键管理员运行cmd&#xff0c;输入net stop wbiosrvc&#xff1b; 2 C:\Windows\System32\WinBioDatabase下面把文件全删&#xff1b; 3 设置-->登录选项-->Windows Hello 指纹 重新录入指纹即可。

原创工具14Finger-全能web指纹识别与分享平台

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源

很蛋碎的问题&#xff0c;对于不是在自己电脑上生成的文件&#xff0c;FlashPlayer会认为是不安全的。 因此把别人的工程拷贝到Flashbuilder里时 往往不能运行&#xff0c;生成的swf无权访问本地的framework。 原因&#xff1a; Adobe Flash Player会把不是信任目录下的swf都…

14Finger指纹识别平台搭建

一、14Finger简介 ​ 14Finger是一款功能齐全的Web指纹扫描和分享平台&#xff0c;基于vue3django前后端分离的web架构&#xff0c;并集成了长亭出品的rad爬虫的功能&#xff0c;内置了一万多条互联网开源的指纹信息。 repo: https://github.com/b1ackc4t/14Finger 基于强大的…

BUG:只有仅限于文件系统的SWF 文件和可信的本地 SWF 文件可以访问本地资源

在没有网络环境下的本地文件 目前在用Flex Builder 3设计了一个网站首页&#xff0c;之后想将其在无WEB服务器下运行&#xff08;像静态网页一样&#xff09;&#xff0c;结果出现如标题所示SWF访问本地文件出错&#xff0c;在网络上搜到一些办法&#xff0c;这里给出URL&#…

获取flash里的真实url地址,将swf文件下载保存下来

点击下载&#xff1a;UrlActionEditor-v4.04 这个软件可以看到&#xff0c;swf文件里的url。 看图&#xff1a; 看到http://fla.78baby.com/flashupfile/fads/这个地址了吧&#xff0c;这个就是真实的地址&#xff0c;下面我们看看一个具体页面的flash 上面embed标签里的 bofa…

【Win10安装ccs报错】提示临时目录路径包含可能破坏安装的Unicode字符。

问题描述&#xff1a;win10安装css&#xff0c;因为电脑用户名为中文而出现的bug 建议&#xff1a; 全篇浏览一次本文后再决定 选取多篇教程综合考虑。 修改日志&#xff1a; 2022/9/5&#xff1a;更改并且具体了原有解决方法&#xff0c;增加了另一种更加稳妥的解决方法。 202…

用虚拟打印机MacroMedia FlashPaper 制作swf文件

有时候进入一个网站&#xff0c;浏览网站中的文章时是这样的界面 不难发现&#xff0c;这是一种浏览文章的框框&#xff0c;而它的左上角就有macromediaFLASHPAPER的标志。 在我看来&#xff0c;flashPaper就是一个虚拟打印机&#xff0c;它可以把你打印的文档&#xff08;包…