基于tensorflow2、LeNet的手写数字识别项目
基于tensorflow2、LeNet的手写数字识别
在基于之前的一篇博客,这里使用最经典的卷积神经网络LeNet再次实现一下
具体的步骤和之前一致,仅仅网络变了;
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 数据处理
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255., x_test / 255.
x_train = tf.expand_dims(x_train, -1)
x_test = tf.expand_dims(x_test, -1)
y_train = np.float32(tf.keras.utils.to_categorical(y_train, num_classes=10))
y_test = np.float32(tf.keras.utils.to_categorical(y_test, num_classes=10))
batch_size = 256
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(batch_size).shuffle(batch_size * 10)
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(batch_size)
# 模型搭建
input_img=tf.keras.Input([28,28,1])
conv1=tf.keras.layers.Conv2D(filters=6,kernel_size=5,padding='SAME',activation=tf.nn.sigmoid)(input_img)
pool1=tf.keras.layers.AvgPool2D(pool_size=2,strides=2)(conv1)
conv2=tf.keras.layers.Conv2D(filters=16,kernel_size=5,activation=tf.nn.sigmoid)(pool1)
pool2=tf.keras.layers.AvgPool2D(pool_size=2,strides=2)(conv2)
flat=tf.keras.layers.Flatten()(pool2)
dense=tf.keras.layers.Dense(units=120,activation=tf.nn.sigmoid)(flat)
dense1=tf.keras.layers.Dense(units=84,activation=tf.nn.sigmoid)(dense)
dense2=tf.keras.layers.Dense(units=10,activation=tf.nn.sigmoid)(dense1)
model=tf.keras.Model(inputs=input_img,outputs=dense2)
model.summary()
# 模型训练
model.compile(optimizer=tf.optimizers.Adam(lr=1e-3),loss=tf.losses.categorical_crossentropy,metrics=['accuracy'])
model.fit(train_dataset,epochs=10)
# model.save('./model.h5')
score=model.evaluate(test_dataset)
print('last score:',score)
使用LeNet训练的模型,训练过程及评估如下:
我们的其他超参数均和之前一致epoch=10,lr=0.001,唯一改变了网络,可见这个似乎比之前的略差一点,可能是epoch不够。
接下来将epoch改为30,结果如下:
可见比epoch=10准确率又高了。
后续可以自行调参,欢迎评论留言讨论!!!!