【Keras学习笔记】手写识别
新建模型
1、model = keras.Sequential()
创建了一个 Keras 顺序模型(Sequential Model)
2、model.add(layers.Flatten())
这行代码向 model 中添加了一个 Flatten(扁平化)层
为什么需要这一层?
本例的训练参数是2828像素的手写图片,但是Dense的输入是一维的,所以我们需要这一层将2828像素的手写图片转化为784维向量(一维数组),再输入到下一层
3、model.add(layers.Dense(64, activation=‘relu’))
这行代码向 model 中添加了一个 Dense(全连接)层。
Rectified Linear Unit这是目前最常用的激活函数,尤其是隐藏层。
为什么上一层输出784个参数,这一层的输入是64?
其实是一个理解误区,可以举例来解释:
假设输入一张图,Flatten后变成784个数字组成的购物清单,Dense层有64个收银员,每个收银员都要检查全部784件商品(乘以不同权重),最后给出一个是否需要补货的评分(激活值)。
64个神经元最终训练结果不会得到相同或者类似的w和b吗?
64个神经元 几乎不可能 训练出完全相同的w和b
为什么最终训练结果不会得到相同或者类似的w和b?
- 训练开始前,每个神经元的权重向量 w和偏置 b 都是独立地、随机初始化的
- 随机梯度下降的本质,比喻:盲人摸象式下山法,每次随机摸一块石头(一个样本),仅凭这块石头的倾斜方向就迈一步。虽然每次方向可能不准,但长期统计来看,你摸的石头够多、方向平均后仍是“下山”的大趋势
relu 是怎么样的一个函数
ReLU的函数规则只有一句:“正数放行,负数归零”。
数学公式:f(x) = max(0, x)
输入 x > 0 时:输出 = x(原样通过)
输入 x ≤ 0 时:输出 = 0(直接关闭)
ReLU激活函数并不直接处理784个参数本身,而是作用于神经网络层中每个神经元的输入值(即线性变换后的结果)
4、model.add(layers.Dense(10, activation=‘softmax’))
每个神经元代表一个输出类别(Class)。数字 10 对应注释和 MNIST 中的 10 个类别(数字 0-9)。
Softmax 激活函数: 这是多分类(Multi-class classification) 任务输出层的标准选择。它作用在整个层输出的 10 个值上。