0
下载数据集并规范化
我们将在Keras API下下载MNIST数据集,并对其进行规范化。
from keras.datasets import mnist
from keras.utils import np. Utils
# Load dataset as train and test sets
(x train, y_ train), (x_ test, y_ test) = mnist.load_data()
# Set numeric type to float32 from uint8
x_ train = x_ train.astype(‘float32’)
x_ test= x_test.astype(‘float32’)
# Normalize value to [0, 1]
x_ train/= 255
x_ test/= 255
# Transform lables to one-hot encoding
y_ train = np_ utils.to_categorical(y_train, 10)
y_ test = np_ utils.to_categorical(y_test, 10)
# Reshape the dataset into 4D array
x_ train= x_train.reshape(x_train.shape[0], 28,28,1)
x_ test =x_test.reshape(x_test.shape[0], 28,28,1)
定义LeNet-5模型
使用顺序模型API创建模型对象的新实例。 然后按照前面讨论的LeNet-5架构,将层添加到神经网络。 最后,使用“ categorical_crossentropy”损失函数和“ SGD”成本优化算法来编译模型。 编译模型时,添加metrics = [“ accuracy”]作为参数之一以计算模型的准确性。
重要的是要强调,MNIST数据集中的每个图像的尺寸为28 X 28像素,因此我们将对LeNet-5输入使用相同的尺寸,而不是32 X 32像素。
from keras.models import Sequential
from keras import models, layers
import keras
#Instantiate an empty model
model Sequential()
# C1 Convolutional Layer
model.add(layers.Conv2D(6,kernel_size=(5,5),strides=(1,1),activation='tanh’,input_shape=(28,28,1),padding="same"))
# S2 Pooling Layer
model.add(layers.AveragePooling2D(pool_size=(2, 2) strides=(1, 1). padding=valid))
# C3 Convolutional Layer
model.add(layers.Conv2D(16, kernel_size=(5, 5), strides=(1, 1), activation='tanh', padding='valid'))
# S4 Pooling Layer
model.add(layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid')
# C5 Fully Connected Convolutional Layer
model.add(layers.Conv2D(120,kernel_size (5, 5), strides=(1, 1), activation='tanh', padding="valid))
#Flatten the CNN output so that we can connect it with fully connected layers
model.add(layers.Flatten())
# FC6 Fully Connected Layer
model.add(layers.Dense(84, activation='tanh))
#Output Layer with softmax activation
model.add(layers.Dense(10, activation=’softmax’)
# Compile the model
model.compile(loss=keras.losses.categorical_crossentropy,optimizer='SGD', metrics=["accuracy"])
我们可以通过调用model.fit函数来训练模型,并传入训练数据,预期输出,时期数和批大小。 此外,Keras提供了一种在每个时期结束时评估损失和准确性的工具。 为此,我们可以使用“ validation_split”参数来拆分训练数据,或者使用“ validation_data”参数来使用另一个数据集。 在每个时期之后,我们将使用我们的训练数据集来评估损失和准确性。
hist=model.fit(x=x_train,y=y_train,epochs=10,batch_size=128,validation_data=(x_test,y_test),verbose=1)
评估模型
我们可以通过调用model.evaluate并传递测试数据集和预期输出来测试模型。
test_score = model.evaluate(x_test, y_test)
print("Test loss {:.4f}, accuracy {:.2f}%” .format(test_score[0], test_score[1]* 100))
可视化训练过程
通过绘制每个时期后的训练准确性和损失以可视化训练过程。
import matplotlib.pyplot as plt
f, ax = plt.subplots()
ax.plot([None] + hist.history['acc’], 'o-’)
ax.plot([None] + hist.history['val_acc’], 'x-’)
# Plot legend and use the best location automatically: loc= 0.
ax.legend([‘Train acc’,’ Validation acc’], loc = 0)
ax.set_title(‘Training/Validation acc per Epoch’)
ax.set_xlabel('Epoch’)
ax.set_ylabel(‘acc’)
import matplotlib.pyplot as plt
f, ax = plt.subplots()
ax.plot([None] + hist.history[‘loss’], 'o-’)
ax.plot([None] + histhistory[‘val_loss’], 'x-’)
# Plot legend and use the best location automatically: loc= 0.
ax.legend([Train Loss', ‘Validation Loss’], loc = 0)
ax.set_ title(‘Training/Validation Loss per Epoch’)
ax.set_xlabel('Epoch’)
ax.set_ylabel(‘Loss')
参考https://www.datasciencecentral.com/profiles/blogs/lenet-5-a-classic-cnn-architecture
收藏