我正在尝试学习Keras。我在这里看到了用于识别手写数字的机器学习代码这里(也给出了这里)。它似乎从头开始编写了前馈、SGD和反向传播方法。我只想知道是否可以使用Keras编写这个程序?朝这个方向迈出的第一步将不胜感激。
回答:
你可以先用这个来了解MNIST数据集如何用于多层感知器(MLP)。Keras MNIST教程。随着你的进展,你可以研究卷积神经网络(CNN)如何在MNIST数据集上工作。
我将描述你附在评论中的Keras代码的过程
# 步骤1:组织数据
batch_size = 128 # 这将60k张图像分成128张一批,通常人们使用100。你可以自己决定
num_classes = 10 # 你的最终层。基本上是0到9(10个类别)
epochs = 20 # 20次'运行'。你可以增加或减少以查看准确性的变化。通常MNIST的准确性在10-20个epochs时达到峰值。
# 数据,划分为训练和测试集
(x_train, y_train), (x_test, y_test) = mnist.load_data() # x_train - 你的训练图像,y_train - 训练标签;x_test - 测试图像,y_test - 测试标签。通常人们在50k训练图像,10k测试图像上进行训练。
x_train = x_train.reshape(60000, 784) # 每个MNIST图像是28x28像素。所以你将它展平为28x28 = 784的数组。60k训练图像
x_test = x_test.reshape(10000, 784) # 同样,10k测试图像
x_train = x_train.astype('float32') # 用于浮点数
x_test = x_test.astype('float32')
x_train /= 255 # 用于归一化。每张图像的'黑暗度'范围在0-255之间,所以你希望将其范围缩小到0 - 1以供神经网络使用
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# 将类别向量转换为二进制类别矩阵
y_train = keras.utils.to_categorical(y_train, num_classes) # 独热编码。所以当你的神经网络训练好后,你对5(示例)的预测将看起来像这样 [0000010000](最终层)。
y_test = keras.utils.to_categorical(y_test, num_classes)
# 步骤2:创建MLP模型
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,))) # 第一隐藏层,512个神经元,激活函数relu,输入784数组
model.add(Dropout(0.2)) # 在训练过程中,层有20%的概率'关闭'某些神经元
model.add(Dense(512, activation='relu')) # 与上面相同
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax')) # 最终层,10个神经元,softmax是一个概率函数,用于给出输入图像的最佳概率
model.summary()
# 步骤3:创建模型编译
model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
# 10个类别 - 使用categorical_crossentropy。如果是2个类别,可以使用binary_crossentropy;优化器 - RMSprop,你可以将其更改为ADAM,SGD等;度量 - 准确性
# 步骤4:训练模型
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
# 训练在这里进行。在每个批次大小上进行20次运行,然后在测试集上验证你的结果。
# 步骤5:查看你在测试数据上的结果
score = model.evaluate(x_test, y_test, verbose=0)
# 打印出分数
print('Test loss:', score[0])
print('Test accuracy:', score[1])