题目

分析

在手写数字识别的网络中有十个输出值,网络是通过找到最大的输出值的概率来判断识别的数字是多少。比如识别结果1对应着输出值当然,根据题意这里的1是指值大于0.99,0是指值小于0.01。如果要将最后的结果转换成四位的二进制表示,上述输出值最后需要转换成。解题思路其实就等价于设计一个两层的网络,输入值就是那十个数,输出值就是对应的四位二进制数,然后对这个网络进行训练就能够得到合适的权重和偏置。

代码

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
72
73
74
75
76
77
78
79
80
81
82
83
84
import torch
import numpy as np
import torch.nn as nn
import torch.optim as optim

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

# 获取对应的输入值和输出值并放到相应的列表中
x = data[:, :10]
y = data[:, 10:14]

# 搭建一个两层的网络
class net(nn.Module):
def __init__(self):
super(net, self).__init__()

self.Conn_layers = nn.Sequential(
nn.Linear(10, 4),
nn.Sigmoid()
)

def forward(self, x):
output1 = self.Conn_layers(x)

# 转换成二维列表
output = output1.reshape(-1, 4)

return output

# 初始化网络对象
net = net()

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

# 初始化一个交叉熵损失函数对象
loss_function = nn.BCELoss()

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

# 开始迭代训练
for epoch in range(10000):

# 获取输出值
out = net(x)

# 获取损失
loss = loss_function(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()))

# 获取网络每一层参数
for layer in net.modules():
if isinstance(layer, nn.Linear):

# 打印权重和偏置
print("weight is {}".format(layer.weight.detach().numpy()))
print("bias is {}".format(layer.bias.detach().numpy()))

结果

结果如下所示:

从out里的值可以看到值是0.9以上的可以看做1,可以通过输入数据的后四位值来对结果进行检验。