由于Keras模型相对其他深度学习框架而言封装性更好,个人认为初学者学习更为方便,于是本文基于keras框架搭建了Lenet-5、Alexnet、VGG16模型
将keras内置的mnist数据集作为测试数据,仅测试网络是否运行,其运行结果并不表示网络的优劣程度。代码如下:
from keras.datasets import mnist#导入keras内置的mnist数据集
from keras.utils.np_utils import to_categorical
def load_mnist_data():#训练集和验证集数据
(train_data,train_label),(test_data,test_label) = mnist.load_data()
train_data = train_data.reshape((60000, 28, 28, 1))
train_data = train_data.astype('float32') / 255
test_data = test_data.reshape((10000, 28, 28, 1))
test_data = test_data.astype('float32') / 255
train_label = to_categorical(train_label)
test_label = to_categorical(test_label)
return (train_data,train_label),(test_data,test_label)
代码如下:
from keras import models
from keras import layers
def create_Lenet():
model = models.Sequential()
model.add(layers.Conv2D(filters=6,kernel_size=(5,5),use_bias=True,activation='relu',input_shape = (28,28,1)))
model.add(layers.MaxPooling2D(pool_size=(2,2)))
model.add(layers.Conv2D(filters=16,kernel_size=(5,5),use_bias=True,activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2,2)))
model.add(layers.Conv2D(filters=120,kernel_size=(3,3),use_bias=True,activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(84,activation='relu'))
model.add(layers.Dense(10,activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['acc'])
return model
模型迭代10次后训练验证loss降为0.0398、验证acc为98.67%
原本的Alexnet模型分了两支,用两个GPU训练,由于条件受限仅使用一支。
Alexnet模型大致结构如下:
(注:原本在卷积层Conv_1和卷积层Conv_2后面应分别跟一个池化层,由于输入图像尺寸并不大,使得多次卷积之后特征尺寸小于卷积核尺寸,无法继续卷积,故将最开始的两个池化层删去)
代码如下:
def create_Alexnet():
model = models.Sequential()
model.add(layers.Conv2D(filters=48,padding='same',kernel_size=(11,11),strides=4,activation='relu',input_shape = (28,28,1)))
# model.add(layers.MaxPooling2D(pool_size=(3,3),strides=2))
model.add(layers.BatchNormalization())
model.add(layers.Conv2D(filters=128,padding='same',kernel_size=(5,5),activation='relu'))
# model.add(layers.MaxPooling2D(pool_size=(3,3),strides=2))
model.add(layers.BatchNormalization())
model.add(layers.Conv2D(filters=192,padding='same',kernel_size=(3,3),activation='relu'))
model.add(layers.Conv2D(filters=192,padding='same',kernel_size=(3,3),activation='relu'))
model.add(layers.Conv2D(filters=128,padding='same',kernel_size=(3,3),activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(3,3),strides=2))
model.add(layers.Flatten())
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10,activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['acc'])
return model
模型迭代10次后训练验证loss降为0.0832、验证acc为98.70%
VGG16模型大致结构如下:(2+2+3+3+3+3 = 16)
(注:本次调试减少了原VGG16各层卷积核个数(毕竟mnist数据集不需要数量过于庞大的卷积核))
代码如下:
def create_VGGnet():
model = models.Sequential()
model.add(layers.Conv2D(16, (3, 3), activation='relu', padding='same', input_shape=(28, 28, 1)))
model.add(layers.Conv2D(16, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D(2, 2))
model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D(2, 2))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D(2, 2))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D(2, 2))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(layers.Flatten())
model.add(layers.Dense(1024, activation='relu'))
model.add(layers.Dense(1024, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['acc'])
return model
模型迭代10次后,验证loss降为0.0424,验证Accuracy为99.05%
此处附上画图代码以及主函数代码
import matplotlib.pyplot as plt
def plot_results(history):
history_dict = history.history
loss_values = history_dict['loss']
val_loss_values = history_dict['val_loss']
epochs = range(1,len(loss_values)+1)
plt.plot(epochs,loss_values,'ro',label='Training_loss')
plt.plot(epochs,val_loss_values,'b',label = 'validation_loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
##训练精度和验证精度绘图
plt.clf()
acc = history_dict['acc']
val_acc = history_dict['val_acc']
plt.plot(epochs,acc,'ro',label='Training_acc')
plt.plot(epochs,val_acc,'b',label = 'Validation_acc')
plt.title('Training and Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
if __name__ == '__main__':
(train_data, train_label), (test_data, test_label) = load_mnist_data()
#LeNet = create_Lenet()
#AlexNet = create_Alexnet()
VGGNet = create_VGGnet()
history = VGGNet.fit(train_data,train_label,epochs=10,batch_size=512,validation_data=(test_data,test_label))
plot_results(history)