Keras-黑白手写数字识别

这次主要记录一下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()
``

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值