两个神经元之间的交流(神经网络python)

用两个神经元组成的神经网络去拟合一个y=x函数

下图为神经网络示意图

输入和输出之间权重为w,偏置为b

数据:[1,2],[2,4],[3,6],[4,8],[5,10],用这几个点去拟合神经网络,[x,y]格式,x是输入,y是输出

前向传播(一开始默认w = 0.236,b = -0.8626):

第一个点(1,2)开始计算,得出一个y‘

 

 可见y’离目标值y=2差很多。

 

计算loss

 

 

反向传播:

(更新参数)

更新权重:

  

 

 更新偏置:

 

 

 

L就是loss,学习率α设为0.1

(这里默认是线性的,没有激活函数)

 

用把所有的数据都这样算一遍后,输出权重和偏置:

 

训练次数越多,数据越好,权重w和偏置b就会越贴近 w = 2 ,b = 0

 以下是代码:

#导入包
import torch
import torch.nn as nn

#数据
data = torch.tensor([[[1],[2]],[[2],[4]],[[3],[6]],[[4],[8]],[[5],[10]]],dtype=torch.float)

#参数
epoches = 1
  

#搭建网络
class NNModel(torch.nn.Module):
    def __init__(self):
        
        super(NNModel,self).__init__()  #调用父类的初始化函数
        torch.manual_seed(50)           #设置随机数种子,防止预测的结果是随机数        
        self.layer1 = nn.Sequential(nn.Linear(1,1))

    def forward(self,mydata):
        mydata = self.layer1(mydata)

        return mydata


model = NNModel()                                      #实例化网络

criterion = nn.MSELoss()  
optimizer = torch.optim.SGD(model.parameters(), 0.1)   #设置优化函数和学习率
model.train()                                          #调整为训练模式

for e in range(epoches):                               #训练网络                             
    for i in data:
        x = i[0]
        y = i[1]              
        print(model.state_dict())                      #输出网络的权重参数  
        out = model(x)                                 #前向计算
        loss = criterion(out,y)                        #计算损失函数
        #print(loss)
        optimizer.zero_grad()
        loss.backward()                                #反向传播
        optimizer.step()
 
print(model.state_dict())

 

posted @ 2022-02-28 16:15  李里力离  阅读(232)  评论(0)    收藏  举报