这次主要记录一下Keras神经网络的入门学习,使用是MLP神经网络,数据集使用的是MNIST手写数据集,代码的实现主要是来自李易的深度学习算法入门一书
step1 数据的处理
本部分包括数据的处理与分割,mnist数据集共有60000张手写数字图片,其中训练图片50000张,测试图片10000张,为方便数据的处理需要对数据进行归一化,将数据范围映射到0-1之间,其次需要在训练数据集中选择10000个作为验证集
#load data
def load_dataset():
(X_train,y_train),(X_test,y_test)=keras.datasets.mnist.load_data()
#归一化数据
X_train=X_train.astype(float)/255.
X_test=X_test.astype(float)/255.
#分割出10000个作为验证数据 负数表示倒数第几个元素
X_train,X_val=X_train[:-10000],X_train[-10000:]
y_train,y_val=y_train[:-10000],y_train[-10000:]
return X_train,y_train,X_val,y_val,X_test,y_test
需要注意的是mlp处理的是一维向量,因此我们需要将图片的二维向量使用reshape拉直成一维向量的形式,然后输出shape对数据形式进行检查,确保数据转换成功
X_train,y_train,X_val,y_val,X_test,y_test=load_dataset()
#为方便计算,将二维向量转为一维向量 每条数据一行
X_train_flat=X_train.reshape((X_train.shape[0],-1))
print(X_train_flat.shape)
X_val_flat=X_val.reshape((X_val.shape[0],-1))
print(X_val_flat.shape)
X_test_flat=X_test.reshape((X_test.shape[0],-1))
print(X_test_flat.shape)
step2 标签值的转换
需要注意的是我们处理的是分类问题,因此需要将标签值转换成one-hat向量。
#将Y标签转成独热编码
y_train_one_hot=keras.utils.to_categorical(y_train,10)
y_val_one_hot=keras.utils.to_categorical(y_val,10)
print(y_train_one_hot.shape)
print(y_train_one_hot[:3],y_train[:3])
step3 MLP模型的搭建
与前面的步骤相同,首先建立一个顺序模型,这里的是输出层和中间层使用relu作为激活函数,最后一层选择softmax作为激活函数这是因为在编写分类器时,最后一层多为dense层,dense层的神经元数量对应标签的数量当标签数量大于2时,使用softmax,否则则使用sigmoid。
这里激活函数的选择,只是从应用的角度,实际的原因与其数学特性 有关,在此不做赘述
model=Sequential()
model.add(Dense(256,input_shape=(784,),activation='relu',kernel_initializer=keras.initializers.he_normal(seed=None)))
model.add(Dense(256,activation='relu',kernel_initializer=keras.initializers.he_normal(seed=None)))
model.add(Dense(10,activation='softmax'))
model.summary()
model.compile(
loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy']
)
#设置模型检查点
filepath='weights-improvement-{epoch:02d}-{loss:.4f}-bigger.hdf5'
checkpoint=ModelCheckpoint(
filepath,
monitor='loss',
verbose=0,
save_best_only=True,
mode='min',
period=10
)
callbacks_list=[checkpoint]
model.fit(
X_train_flat,
y_train_one_hot,
epochs=40,
validation_data=(X_val_flat,y_val_one_hot),
callbacks=callbacks_list
)
print('model train success')
mp = "E://mymlstudy/number_model.h5"
model.save(mp)
损失函数的选择问题,在处理分类问题时需要使用分类损失函数,而具体损失函数的选择与类别个数有关,若为二分类问题则使用二进制交叉熵binary_crossentropy,否则则使用分类交叉熵categorical_crossentropy,此外在分类问题中还可打开准确率检测metrics=[‘accuracy’]
还需要说明模型检查点的设置问题,我们定义每10个epoch就自动保存一次模型参数文件,在fit函数中使用callbacks参数开启模型的断点续训能力
step4 结果预测
prediction=model.predict(X_test_flat,verbose=1)
print('the 23th number is ',np.argmax(prediction[25]),'the real number is:',y_test[25])
plt.imshow(X_test[25],cmap='Greys')
plt.show()
``