提起一个神经网络的框架学习,第一步肯定是要实现简单的神经网络,一般来说,一个最简单二层的神经网络可以解决简单的异或门问题。所以今天第一个简单学习就从使用pytorch实现异或门神经网络开始吧。
第一步。就是prepare for data,就是解决数据。
x=np.zeros([4,2]) y=np.zeros([4,1]) for i in range(0,4): x1=(int)(i/2) x2=i%2 x[i]=np.array([x1,x2]) y[i]=[x1^x2]; input_x=Variable(torch.Tensor(x)) input_x=input_x.float() y=Variable(torch.from_numpy(y)) y=y.float()
这里的input_x,y就是我们要处理的数据。输入input_x就是简单的二维数组,y即为输出结果。
这里都为pytorch 的tensor对象,将其打印出来结果:
第二步,构建简单的神经网络
class network(torch.nn.Module): def __init__(self,in_num,hidden_num,out_num): super(network,self).__init__() self.input_layer=torch.nn.Linear(in_num,hidden_num) self.sigmoid=torch.nn.Sigmoid() self.output_layer=torch.nn.Linear(hidden_num,out_num) self.softmax=torch.nn.LogSoftmax() def forward(self,input_x): h_1 = self.sigmoid(self.input_layer(input_x)) h_2 = self.sigmoid(self.output_layer(h_1)) return h_2这里torch.nn.Lineral, Linear 是module的子类,是参数化module的一种,与其名称一样,表示着一种线性变换。Linear的创建需要两个参数,inputSize 和 outputSize
inputSize:输入节点数
outputSize:输出节点数
注意,整个网络的输出就是forward的返回值,可以理解为前向传播计算。
第一个input_layer代表输入层到隐层的连接,第二个output_layer代表隐层到输出层的连接。
第三步训练
net=network(2,4,1) loss_function=torch.nn.BCELoss() optimizer = torch.optim.SGD(net.parameters(), lr=1e-1, momentum=0.9) for i in range(10000): out=net(input_x) loss=loss_function(out,y) print ("loss is %f"%loss.data.numpy()) optimizer.zero_grad() loss.backward() optimizer.step()
使用的损失函数是方差值,这里要提到就是在pytorch的训练过程就是,用损失函数计算输出值与实际值的偏差,使用梯度下降的方法去更新网络的参数。
最后如果要计算测试值,直接将测试值转换为tensor对象,然后直接调用。
out=net(input_x) print(out) print(y)
可以看下神经网络和实际值的对比: