PyTorch 实现异或XOR运算

1. 异或运算

 2. 实现


 1 # 利用Pytorch解决XOR问题
 2 import torch
 3 import torch.nn as nn
 4 import torch.nn.functional as F
 5 import torch.optim as optim
 6 import numpy as np
 7 
 8 data = np.array([[1, 0, 1], [0, 1, 1],
 9                  [1, 1, 0], [0, 0, 0]], dtype='float32')
10 x = data[:, :2]
11 y = data[:, 2]
12 
13 
14 # 初始化权重变量
15 def weight_init_normal(m):
16     classname = m.__class__.__name__ #是获取类名,得到的结果classname是一个字符串
17     if classname.find('Linear') != -1:  #判断这个类名中,是否包含"Linear"这个字符串,字符串的find()方法,检索这个字符串中是否包含另一个字符串
18         m.weight.data.normal_(0.0, 1.)
19         m.bias.data.fill_(0.)
20 
21 
22 class XOR(nn.Module):
23     def __init__(self):
24         super(XOR, self).__init__()
25         self.fc1 = nn.Linear(2, 3)   # 隐藏层 3个神经元
26         self.fc2 = nn.Linear(3, 4)   # 隐藏层 4个神经元
27         self.fc3 = nn.Linear(4, 1)   # 输出层 1个神经元
28 
29     def forward(self, x):
30         h1 = F.sigmoid(self.fc1(x))  # 之前也尝试过用ReLU作为激活函数, 太容易死亡ReLU了.
31         h2 = F.sigmoid(self.fc2(h1))
32         h3 = F.sigmoid(self.fc3(h2))
33         return h3
34 
35 
36 net = XOR()
37 net.apply(weight_init_normal) #相当于net.weight_init_normal()
38  #apply方式的调用是递归的,即net这个类和其子类(如果有),挨个调用一次weight_init_normal()方法。
39 x = torch.Tensor(x.reshape(-1, 2))
40 y = torch.Tensor(y.reshape(-1, 1))
41 
42 # 定义loss function
43 criterion = nn.BCELoss()  # MSE
44 # 定义优化器
45 optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9)  # SGD
46 # 训练
47 for epoch in range(500):
48     optimizer.zero_grad()   # 清零梯度缓存区
49     out = net(x)
50     loss = criterion(out, y)
51     print(loss)
52     loss.backward()
53     optimizer.step()  # 更新
54 
55 # 测试
56 test = net(x)
57 print("input is {}".format(x.detach().numpy()))
58 print('out is {}'.format(test.detach().numpy()))

来源:(1条消息) PyTorch——解决异或问题XOR_我是大黄同学呀的博客-CSDN博客_pytorch 异或

稍微改了一下网络结构,添加少量注释,理解第16-17,37行。

结构如下:

 A Neural Network Playground (tensorflow.org)

原文地址:https://www.cnblogs.com/vvzhang/p/14063429.html