pytorch简易学习之第一节课之简单神经网络解决异或门问题

提起一个神经网络的框架学习,第一步肯定是要实现简单的神经网络,一般来说,一个最简单二层的神经网络可以解决简单的异或门问题。所以今天第一个简单学习就从使用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对象,将其打印出来结果:

pytorch简易学习之第一节课之简单神经网络解决异或门问题_第1张图片

第二步,构建简单的神经网络

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)

可以看下神经网络和实际值的对比:

pytorch简易学习之第一节课之简单神经网络解决异或门问题_第2张图片


你可能感兴趣的:(pytorch学习)