近来大家对这个项目比较关注,也有好些人催我继续更新这个系列,因为博主前段时间一直在准备推免的事情,后来也一直在刷题,所以真的没有时间写,现在趁着这个暑假的小尾巴,更新一波,能写到哪里也不一定,但是我会确保每一步都不会让你走弯路的,也谢谢大家的支持喽。
上一篇写到数据增强,数据增强应该算是数据预处理的一部分,而数据预处理对于模型的训练的重要性,相必大家也都清楚,从我自己的经验来说,进行完数据增强之后可以提高比较大的识别率,特别是那些训练样本数量较少的类别,提升更加明显。做好数据增强,就可以训练模型了,当然前提是已经配置好了运行的环境。
配置这个运行的环境真的不容易,最好是装双系统或者就在Ubuntu系统上运行,千万千万别想用虚拟机,太慢了,我给大家列一个环境的清单吧,大家自己配置一下,或者可以使用我在这个系列第一篇文章中推荐的易学智能GPU云平台,能省很多事,也不算太贵,看需求啦。
如果自己配置的话,清单如下:
安装Ubuntu16.04系统(建议双系统,教程我的博客也有,当然看别人的也行)
在Ubuntu16.04系统上安装python3.6.5环境(好像可以通过安装anaconda3安装?我有点忘了,见谅)
安装tensorflow框架,keras框架,CUDA框架,显卡驱动,opencv框架等等,版本千万要注意!我也不好直接给出版本,因为这个和你本机的硬件有关,尤其这个CUDA框架,用于调用GPU进行并行计算的,如果没有使用GPU进行计算,那效率真的会低得可怜的。
博主我配置这个环境配了两天左右呢,大家也要多点耐心呀,哈哈哈哈哈哈。
别希望能使用CPU跑!你等不到结果出来的那一天的。为了说服各位,我特意试了试在windows下的效率,每个epoch四分多钟,要训练40个epoch,具体多久我就不去算了哈。
代码如下:
from keras.preprocessing import image
import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import BatchNormalization
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import regularizers
import matplotlib.pyplot as plt
import os,shutil
from matplotlib import pyplot as plt
from keras.models import load_model
import numpy as np
train_dir=r'E:\BaiduNetdiskDownload\fer2013\fer2013_dataAug\train'
val_dir=r'E:\BaiduNetdiskDownload\fer2013\fer2013_dataAug\val'
test_dir=r'E:\BaiduNetdiskDownload\fer2013\fer2013_dataAug\test'
train_datagen=ImageDataGenerator()
test_datagen=ImageDataGenerator()
train_generator=train_datagen.flow_from_directory(
train_dir,
target_size=(48,48),
batch_size=128,
class_mode='categorical'
)
validation_generator=test_datagen.flow_from_directory(
val_dir,
target_size=(48,48),
batch_size=128,
class_mode='categorical'
)
test_generator=test_datagen.flow_from_directory(
test_dir,
target_size=(48,48),
batch_size=128,
class_mode='categorical'
)
#kernel_regularizer=regularizers.l2(0.01),
model = Sequential()
model.add(Conv2D(64, kernel_size=(5, 5), strides=(1, 1),
activation='relu',
padding='same',input_shape=(48,48,3)))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.4))
model.add(Conv2D(128, kernel_size=(5, 5), strides=(1, 1),
activation='relu',
padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.4))
model.add(Conv2D(256, kernel_size=(5, 5), strides=(1, 1),
padding='same',
activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Flatten())
model.add(Dropout(0.3))
model.add(Dense(2048, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(512, activation='relu'))
model.add(Dense(7, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.rmsprop(lr=0.0001), #need to train a lot of epochs
metrics=['accuracy'])
history=model.fit_generator(
train_generator,
steps_per_epoch=650,
epochs=40,
validation_data=validation_generator,
validation_steps=32
)
model.save('myModel_DataGenerator_myfile_Three.h5')
acc=history.history['acc']
val_acc=history.history['val_acc']
loss=history.history['loss']
val_loss=history.history['val_loss']
epochs=range(1,len(acc)+1)
plt.figure("acc")
plt.plot(epochs,acc,'r-',label='Training acc')
plt.plot(epochs,val_acc,'b',label='validation acc')
plt.title('The comparision of train_acc and val_acc')
plt.legend()
plt.show()
plt.figure("loss")
plt.plot(epochs,loss,'r-',label='Training loss')
plt.plot(epochs,val_loss,'b',label='validation loss')
plt.title('The comparision of train_loss and val_loss')
plt.legend()
plt.show()
train_dir,val_dir,test_dir分别是数据增强后的训练集合数据,验证集数据和测试集数据的文件路径,数据都应该为图片,验证集数据和测试集数据无需数据增强。这个数据集合我有处理完的版本,直接可以拿来使用,有需要的留下邮箱我看到消息会给你发送资源的,请注意查收。压缩包长这样,解压后里边三个文件夹,意思应该也不需要我多解释,train文件夹,val文件夹,test文件夹里边都是有七个子文件夹,按照序号0-6顺序分类,代码会根据图片所属的文件夹自动判定类别的,是keras框架所提供的功能,大家不用深入研究。
训练完模型会对模型进行绘制一个学习曲线和损失函数曲线,同时还会利用keras框架,对当前训练好的模型进行保存,所使用的语句为model.save('myModel_DataGenerator_myfile_Three.h5'),默认在当前脚本的文件夹下,保存好的模型可以在下次使用的时候直接调用,无需再次训练。