# 神经网络模式输出是怎么定义的呢?
# 你的输出其实不是“结果”,而是“10个概率倾向
你的网络结构是:
- 输入层:784(28×28像素)
- 隐藏层:200
- 输出层:10(重点)
👉 输出层 10 个神经元分别代表:
| 输出索引 | 含义 |
|---|---|
| 0 | 数字0的概率 |
| 1 | 数字1的概率 |
| ... | ... |
| 7 | 数字7的概率 |
| 9 | 数字9的概率 |
# 案例识别图片7
查询手写图片7的神经网络的结果是:
array([
0.094, # 0
0.032, # 1
0.061, # 2
0.082, # 3
0.103, # 4
0.047, # 5
0.019, # 6
0.733, # 7 ← 最大
0.101, # 8
0.091 # 9
])
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
这个是手写定义好的吗?是在哪一个阶段进行定义的呢?
# 为什么 0.733 就代表“7”?
因为你后面用了:
label = numpy.argmax(outputs)
1
argmax 的意思是:
找最大值所在的索引
所以:
max = 0.733 → index = 7
1
预测结果 = 7
# 这两行和你那个数组是完全等价的
我们拆开看:
先创建全 0.01
numpy.zeros(output_nodes) + 0.01
1
得到:
[0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
1
再把“正确标签位置”改成 0.99
targets[int(all_values[0])] = 0.99
1
如果标签是 7:
targets[7] = 0.99
1
结果变成:
[0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.99, 0.01, 0.01]
1
# 所以你真正的代码“等价于你写的数组”
你看到的那个数组:
[0.01, 0.01, ..., 0.99, ..., 0.01]
1
是“运行时动态生成的”,不是你手写的。
# 为什么要这样写,而不是直接写数组?
因为训练数据有 60000 条(MNIST):
如果你手写:
每一条数据都写一个10维数组 (不可能)
1
所以必须用:
zeros + index赋值 ✔(自动生成)
1
# 你代码真正做的是“自动生成标签向量”
每一条数据循环都会执行:
label = 7
→ 自动生成:
[0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.99, 0.01, 0.01]
1
2
3
2
3
# 你困惑的本质(很关键)
你以为:
“这个数组是不是写死在数据里?”
其实是:
“这个数组是训练代码现场生成的”
# 你可以这样理解整个流程
原始数据:
7, 0,0,0, ... 255像素
1
代码转换:
targets = zeros(10)
targets[7] = 0.99
1
2
2
神经网络学习:
“看到这种图片 → 输出第7个最大”
# 如果你想验证(建议你试一下)
你可以在代码里加一句:
print(targets)
1
你会看到每一条训练数据都会变成不同的“10维向量”。
# 一句话总结
你没有手写那个数组,但你的这两行代码每次运行都会自动生成同样结构的数组。
如果你下一步想搞懂这个,我可以帮你讲一个更关键的点:
为什么 0.99 / 0.01,而不是 1 / 0?(这其实是神经网络训练稳定性的核心技巧)
← 神经网络