题目

网络设计

根据题意可以做出如下设计:

手算

手算结果如下:

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import torch
import numpy as np
import torch.nn as nn
import torch.optim as optim

# 初始化数据
data = np.array([[1, 0, 1], [0, 1, 1],
[1, 1, 0], [0, 0, 0]], dtype='float32')

# 将输入输出值导入对应的列表
x = data[:, :2]
y = data[:, 2]

# 定义异或网络类
class XOR_net(nn.Module):
def __init__(self):
super(XOR_net, self).__init__()

self.Conn_layer = nn.Sequential(
nn.Linear(2, 2),
nn.ReLU(),
nn.Linear(2, 1)
)

def forward(self, x):
output1 = self.Conn_layer(x)
output = output1.reshape(-1, 1)

return output

# 定义一个异或网络对象
net = XOR_net()

# 将输入输出数值转换成tensor张量
x = torch.Tensor(x.reshape(-1, 2))
y = torch.Tensor(y.reshape(-1, 1))

# 定义一个均方损失函数对象
criterion = nn.MSELoss(reduction='mean')

# 初始化参数对象
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)

# 进行迭代训练
for epoch in range(1000):
out = net(x)
loss = criterion(out, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()

# 定义一个测试网络
test = net(x)

# 打印输入输出值
print("input is {}".format(x.detach().numpy()))
print('out is {}'.format(test.detach().numpy()))

# 层数脚下表
i = 0

# 打印每层的权重和偏执
for layer in net.modules():

# 打印对应层的权重和偏执
if isinstance(layer, nn.Linear):
print("weight_{} is {}".format(i, layer.weight.detach().numpy()))
print("bias_{} is {}".format(i, layer.bias.detach().numpy()))

# 层数计数加一
i += 1

结果

代码运行结果如下:

不足的一点就是relu激活函数十分不稳定,所以有时可能得不到理想的结果。