# 神经网络模式输出是怎么定义的呢?

# 你的输出其实不是“结果”,而是“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

这个是手写定义好的吗?是在哪一个阶段进行定义的呢?

# 为什么 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

# 你困惑的本质(很关键)

你以为:

“这个数组是不是写死在数据里?”

其实是:

“这个数组是训练代码现场生成的”


# 你可以这样理解整个流程

原始数据:

7, 0,0,0, ... 255像素
1

代码转换:

targets = zeros(10)
targets[7] = 0.99
1
2

神经网络学习:

“看到这种图片 → 输出第7个最大”


# 如果你想验证(建议你试一下)

你可以在代码里加一句:

print(targets)
1

你会看到每一条训练数据都会变成不同的“10维向量”。


# 一句话总结

你没有手写那个数组,但你的这两行代码每次运行都会自动生成同样结构的数组


如果你下一步想搞懂这个,我可以帮你讲一个更关键的点:

为什么 0.99 / 0.01,而不是 1 / 0?(这其实是神经网络训练稳定性的核心技巧)

Last Updated: 8/25/2026, 6:54:52 AM