用keras进行猫狗识别(一)

版权声明:董瑞 https://blog.csdn.net/qq_39226755/article/details/89435687

Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:

  • 简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
  • 支持CNN和RNN,或二者的结合
  • 无缝CPU和GPU切换

对于新手来说,keras可以说是非常的友好,我们不需要大量的代码,就能实现我们所需要的功能,而且keras案例也比较多,非常适合我们去学习。

作为在kaggle中游乐场级的案例(最简单),而且听起来也非常有趣,所以我对它下手了。

数据集可以直接去kaggle下载,因为里边的图片太多了,所以我抽调了一些图片进行学习
图片分配方式
训练集:各1000张
验证集:各500张
测试集:各500张
代码直接贴下,因为基本上每行代码都写上了注释,所以就不过多解释了,如果哪里有疑问,也欢迎提出来

from keras import layers
from keras import models
#设置文件目录
#训练集
trainDir ='./train/'
trainDogDir = './train/train_dog/'
trainCatDir = './train/train_cat/'
#验证集
valDir = './check/'
valDogDir = './check/check_dog/'
valCatDir = './check/check_cat/'
#测试集
testDir = './test/'
testDogDir = './test/test_dog/'
testCatDir = './test/test_cat/'

#创建模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
#卷积层,输出空间的维数为32,也可以说是输出特征图的深度为32,提取信息的窗口大小(3,3),卷积核的大小也为(3,3)
#激活函数relu,输入图片大小(150,150,3)
model.add(layers.MaxPooling2D((2, 2)))
#池化层,窗口大小为(2,2),缩小特征图的尺寸
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
#扁平层,将多维的输入转化为一维的输出
model.add(layers.Dense(512, activation='relu'))
#全连接层,将提取的特征组合,得出结果
model.add(layers.Dense(1, activation='sigmoid'))

#设置损失函数,优化器,模型在训练和测试时的性能指标
from keras import optimizers

model.compile(loss='binary_crossentropy',
  optimizer=optimizers.RMSprop(lr=1e-4),
  metrics=['acc'])

#配置图片生成器
from keras.preprocessing.image import ImageDataGenerator
#将图片像素缩小为[0,1]之间的浮点数
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

#创建图片生成器
train_generator = train_datagen.flow_from_directory(
 trainDir,#图片地址
 target_size=(150, 150),#将图片调整为(150,150)大小
 batch_size=20,#设置批量数据的大小为20
 class_mode='binary')#设置返回标签的类型
val_generator = test_datagen.flow_from_directory(
 valDir,
 target_size=(150, 150),
 batch_size=20,
 class_mode='binary')

#拟合模型
history = model.fit_generator(
  train_generator,
  steps_per_epoch=100,#迭代进入下一轮次需要抽取的批次
  epochs=30,#数据迭代的轮数
  validation_data=val_generator,
  validation_steps=50)#验证集用于评估的批次

#保存模型
model.save('cats_and_dogs_small_1.h5')


#画出结果
import matplotlib.pyplot as plt

#查看变量,发现history.history中就只有这四个值,分别是准确度,验证集准确度,损失,验证集损失
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(1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.savefig('acc.png')
plt.show()
#损失
plt.figure(2)
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.savefig('loss.png')
plt.show()

在这里插入图片描述
在这里插入图片描述
因为没有调参数,通过打印出的图片可以发现过拟合了

猜你喜欢

转载自blog.csdn.net/qq_39226755/article/details/89435687