如何用Keras搭建符合指定结构的简单神经网络?
搭建符合要求的MNIST分类神经网络
需求回顾
- 输入:与MNIST数字同形状的张量(MNIST单张图片为28×28的灰度图)
- 网络结构要求:
- 第一个隐藏层:输出300维向量,激活函数为sigmoid
- 第二个隐藏层:输出300维向量,激活函数为relu
- 输出层:对应MNIST 10分类任务,使用softmax激活函数
修正后的完整代码
import keras import tensorflow as tf from keras.datasets import mnist from keras.utils.np_utils import to_categorical from keras import optimizers from keras.models import Sequential from keras.layers import Dense, Activation, Flatten # 加载并预处理MNIST数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 将像素值归一化到0-1区间,提升模型训练稳定性 x_train = x_train / 255.0 x_test = x_test / 255.0 # 将标签转为独热编码,适配多分类损失函数 y_train = to_categorical(y_train, num_classes=10) y_test = to_categorical(y_test, num_classes=10) # 搭建神经网络模型 model = Sequential() # 先把28×28的二维输入张量展平为一维向量(784维) model.add(Flatten(input_shape=(28, 28))) # 第一个隐藏层:300个神经元,对应300维输出,激活函数sigmoid model.add(Dense(300)) model.add(Activation('sigmoid')) # 第二个隐藏层:300个神经元,对应300维输出,激活函数relu model.add(Dense(300)) model.add(Activation('relu')) # 输出层:10个神经元对应10分类,激活函数softmax model.add(Dense(10)) model.add(Activation('softmax')) # 编译模型(用于后续训练) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 查看模型结构详情 model.summary()
关键参数说明
输入层处理:
MNIST输入是28×28的二维张量,而Dense层仅接受一维输入,因此用Flatten层将二维张量展平为784维的一维向量,input_shape=(28,28)对应单张MNIST图片的原始形状。Dense层的units参数:
- 第一个隐藏层
Dense(300):units参数代表神经元数量,直接决定输出维度,设置为300满足需求的300维输出。 - 第二个隐藏层
Dense(300):同样设置units=300,匹配需求的300维输出要求。 - 输出层
Dense(10):MNIST是0-9的10分类任务,因此设置units=10,对应每个类别的预测概率。
- 第一个隐藏层
激活函数的使用:
Activation('sigmoid'):Keras内置实现和你给出的公式1/(1 + np.exp(-x))逻辑完全一致,无需自定义。Activation('relu'):对应公式max(0.0, x),内置实现经过优化,比自定义更高效稳定。Activation('softmax'):内置实现会自动处理数值溢出问题,比你给出的自定义代码更适合实际训练场景。
内容的提问来源于stack exchange,提问作者user19825372
相关产品推荐
相关产品推荐

