本实验可以实现使用卷积神经网络对自己的数据集(图片)进行训练并得出训练时的准确率与loss图,并利用测试集得到混淆矩阵、ROC曲线图和AUC。
编程环境为python3.7.4
代码文件结构如下:
Dataset文件夹用来存放数据集
Log文件夹用来存放准确率和loss曲线图
Model文件夹用来存放训练好的卷积神经网络模型,训练好后以后使用可以直接调用模型,不必每次都训练
Main为主程序
Dataset文件夹里面有训练集train和测试集test两个文件夹,train文件夹数据用来训练卷积神经网络,test文件夹数据用来测试训练好的卷积神经网络的性能
程序中的主要代码:
本实验使用的图片是128*128的单通道图片,故需要将数据集reshape成128*128*1
定义卷积神经网络结构:
def build_model(self):
self.model = Sequential()
self.model.add(
Convolution2D(filters=32,
kernel_size=(5, 5),
padding='same',
dim_ordering='tf',
input_shape=self.dataset.X_train.shape[1:],
)
)
self.model.add(BatchNormalization())
self.model.add(Activation('relu'))
self.model.add(
MaxPooling2D(
pool_size=(2, 2),
strides=(2, 2),
padding='same'
)
)
self.model.add(Convolution2D(filters=64, kernel_size=(5, 5), padding='same'))
self.model.add(BatchNormalization())
self.model.add(Activation('relu'))
self.model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'))
self.model.add(Dropout(0.15))
self.model.add(Flatten())
self.model.add(Dense(512))
self.model.add(BatchNormalization())
self.model.add(Activation('relu'))
self.model.add(Dropout(0.5))
self.model.add(Dense(128))
self.model.add(BatchNormalization())
self.model.add(Activation('relu'))
self.model.add(Dropout(0.5))
self.model.add(Dense(self.dataset.num_classes))
self.model.add(BatchNormalization())
self.model.add(Activation('softmax'))
self.model.summary()
本实验使用的优化器是adadelta (有很多可选的优化器,例如RMSprop,Adagrad)损失函数为categorical_crossentropy也可以选其他的
epochs、batch_size为可调的参数,epochs为训练多少轮、batch_size为每次训练多少个样本,本实验训练3轮,每次20张图片(正常情况都会训练几十轮才会得到不错的识别效果)
使用tensorboard得到的准确率与loss曲线图的地址为E:classification\log(需要定义为自己的地址)
训练结果如图
验证得到的ROC如图
使用tensorboard得到准确率与loss曲线图的步骤:
终端输入tensorboard --logdir=E:classification\log
等运行完成 打开浏览器在在地址栏输入
即可看到如下图: