0


基于kaggle数据集的猫狗识别(超详细版本)

目录

下载kaggle数据集

kaggle猫狗识别数据集共包含25000张JPEG数据集照片,其中猫和狗的照片各占12500张。数据集大小经过压缩打包后占543MB。
数据集可以从kaggle官方网站下载,链接如下:

  1. https://www.kaggle.com/c/dogs-vs-cats/data

如果嫌官网下载麻烦,也可以从博主之前分享的百度网盘链接中直接获取:

网盘分享—博客链接,点击>>>

在下载的kaggle数据集基础上,创建一个新的小数据集,其中包含三个子集。

猫和狗的数据集:各 1000 个样本的训练集、各 500 个样本的验证集、各 500 个样本的测试集。

创建新的小数据集

下面的网络所使用的数据集不是从kaggle网站中直接下载下来的完整数据集,而是基于kaggle完整数据集的部分小数据集。

  1. import os, shutil
  2. # 下载的kaggle数据集路径
  3. original_dataset_dir = '/Users/Downloads/kaggle_original_data'
  4. # 新的小数据集放置路径
  5. base_dir = '/Users/cats_and_dogs_small'
  6. os.mkdir(base_dir)
  7. train_dir = os.path.join(base_dir, 'train')
  8. os.mkdir(train_dir)
  9. validation_dir = os.path.join(base_dir, 'validation')
  10. os.mkdir(validation_dir)
  11. test_dir = os.path.join(base_dir, 'test')
  12. os.mkdir(test_dir)
  13. train_cats_dir = os.path.join(train_dir, 'cats')
  14. os.mkdir(train_cats_dir)
  15. train_dogs_dir = os.path.join(train_dir, 'dogs')
  16. os.mkdir(train_dogs_dir)
  17. validation_cats_dir = os.path.join(validation_dir, 'cats')
  18. os.mkdir(validation_cats_dir)
  19. validation_dogs_dir = os.path.join(validation_dir, 'dogs')
  20. os.mkdir(validation_dogs_dir)
  21. test_cats_dir = os.path.join(test_dir, 'cats')
  22. os.mkdir(test_cats_dir)
  23. test_dogs_dir = os.path.join(test_dir, 'dogs')
  24. os.mkdir(test_dogs_dir)
  25. fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]
  26. for fname in fnames:
  27. src = os.path.join(original_dataset_dir, fname)
  28. dst = os.path.join(train_cats_dir, fname)
  29. shutil.copyfile(src, dst)
  30. fnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)]
  31. for fname in fnames:
  32. src = os.path.join(original_dataset_dir, fname)
  33. dst = os.path.join(validation_cats_dir, fname)
  34. shutil.copyfile(src, dst)
  35. fnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)]
  36. for fname in fnames:
  37. src = os.path.join(original_dataset_dir, fname)
  38. dst = os.path.join(test_cats_dir, fname)
  39. shutil.copyfile(src, dst)
  40. fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]
  41. for fname in fnames:
  42. src = os.path.join(original_dataset_dir, fname)
  43. dst = os.path.join(train_dogs_dir, fname)
  44. shutil.copyfile(src, dst)
  45. fnames = ['dog.{}.jpg'.format(i) for i in range(1000, 1500)]
  46. for fname in fnames:
  47. src = os.path.join(original_dataset_dir, fname)
  48. dst = os.path.join(validation_dogs_dir, fname)
  49. shutil.copyfile(src, dst)
  50. fnames = ['dog.{}.jpg'.format(i) for i in range(1500, 2000)]
  51. for fname in fnames:
  52. src = os.path.join(original_dataset_dir, fname)
  53. dst = os.path.join(test_dogs_dir, fname)
  54. shutil.copyfile(src, dst)
  55. print('total training cat images:', len(os.listdir(train_cats_dir)))
  56. print('total training dog images:', len(os.listdir(train_dogs_dir)))
  57. print('total validation cat images:', len(os.listdir(validation_cats_dir)))
  58. print('total validation dog images:', len(os.listdir(validation_dogs_dir)))
  59. print('total test cat images:', len(os.listdir(test_cats_dir)))
  60. print('total test dog images:', len(os.listdir(test_dogs_dir)))

以上程序会生成各个文件夹路径,并将对应的训练集、验证集、测试集复制进去生成新的小数据集。

以上程序输出结果如下:

  1. total training cat images: 1000
  2. total training dog images: 1000
  3. total validation cat images: 500
  4. total validation dog images: 500
  5. total test cat images: 500
  6. total test dog images: 500

构建猫狗分类的小型卷积神经网络

猫狗分类的网络架构

  1. # 网络架构
  2. from keras import layers
  3. from keras import models
  4. model = models.Sequential()
  5. model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
  6. model.add(layers.MaxPooling2D((2, 2)))
  7. model.add(layers.Conv2D(64, (3, 3), activation='relu'))
  8. model.add(layers.MaxPooling2D((2, 2)))
  9. model.add(layers.Conv2D(128, (3, 3), activation='relu'))
  10. model.add(layers.MaxPooling2D((2, 2)))
  11. model.add(layers.Conv2D(128, (3, 3), activation='relu'))
  12. model.add(layers.MaxPooling2D((2, 2)))
  13. model.add(layers.Flatten())
  14. model.add(layers.Dense(512, activation='relu'))
  15. model.add(layers.Dense(1, activation='sigmoid'))
  16. print(model.summary())

输出的特征图的维度随层变化的情况如下:

  1. Model: "sequential"
  2. _________________________________________________________________
  3. Layer (type) Output Shape Param #
  4. =================================================================
  5. conv2d (Conv2D) (None, 148, 148, 32) 896
  6. _________________________________________________________________
  7. max_pooling2d (MaxPooling2D) (None, 74, 74, 32) 0
  8. _________________________________________________________________
  9. conv2d_1 (Conv2D) (None, 72, 72, 64) 18496
  10. _________________________________________________________________
  11. max_pooling2d_1 (MaxPooling2 (None, 36, 36, 64) 0
  12. _________________________________________________________________
  13. conv2d_2 (Conv2D) (None, 34, 34, 128) 73856
  14. _________________________________________________________________
  15. max_pooling2d_2 (MaxPooling2 (None, 17, 17, 128) 0
  16. _________________________________________________________________
  17. conv2d_3 (Conv2D) (None, 15, 15, 128) 147584
  18. _________________________________________________________________
  19. max_pooling2d_3 (MaxPooling2 (None, 7, 7, 128) 0
  20. _________________________________________________________________
  21. flatten (Flatten) (None, 6272) 0
  22. _________________________________________________________________
  23. dense (Dense) (None, 512) 3211776
  24. _________________________________________________________________
  25. dense_1 (Dense) (None, 1) 513
  26. =================================================================
  27. Total params: 3,453,121
  28. Trainable params: 3,453,121
  29. Non-trainable params: 0
  30. _________________________________________________________________

模型的配置

from tensorflow.keras import optimizers
model.compile(loss=‘binary_crossentropy’,
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=[‘acc’])

图像的预处理

  1. # 图像预处理
  2. from keras.preprocessing.image import ImageDataGenerator
  3. train_datagen = ImageDataGenerator(rescale=1./255)
  4. test_datagen = ImageDataGenerator(rescale=1./255)
  5. # 此处改成自己的路径
  6. train_dir='D:\\0 keras shujuji\\kaggle\\modle_date\\train'
  7. validation_dir='D:\\0 keras shujuji\\kaggle\\modle_date\\validation'
  8. train_generator = train_datagen.flow_from_directory(train_dir,
  9. target_size=(150, 150),
  10. batch_size=20,
  11. class_mode='binary')
  12. validation_generator = test_datagen.flow_from_directory(validation_dir,
  13. target_size=(150, 150),
  14. batch_size=20,
  15. class_mode='binary')

利用批量生成器拟合模型

  1. history = model.fit_generator(train_generator,
  2. steps_per_epoch=100,
  3. epochs=30,
  4. validation_data=validation_generator,
  5. validation_steps=50)

##保存模型

  1. model.save('cats_and_dogs_small_1.h5')

绘制精度和损失

  1. import matplotlib.pyplot as plt
  2. acc = history.history['acc']
  3. val_acc = history.history['val_acc']
  4. loss = history.history['loss']
  5. val_loss = history.history['val_loss']
  6. epochs = range(1, len(acc) + 1)
  7. plt.plot(epochs, acc, 'bo', label='Training acc')
  8. plt.plot(epochs, val_acc, 'b', label='Validation acc')
  9. plt.title('Training and validation accuracy')
  10. plt.legend()
  11. plt.figure()
  12. plt.plot(epochs, loss, 'bo', label='Training loss')
  13. plt.plot(epochs, val_loss, 'b', label='Validation loss')
  14. plt.title('Training and validation loss')
  15. plt.legend()
  16. plt.show()

结果显示

在这里插入图片描述

把本节(构建猫狗分类的小型卷积神经网络)各个子程序结合在一起就可以显示结果了,需要修改 模型的预处理 一节中的数据集放置路径

随机增强后的训练图像显示

  1. from keras.preprocessing import image
  2. import os
  3. import matplotlib.pyplot as plt
  4. from keras.preprocessing.image import ImageDataGenerator
  5. datagen = ImageDataGenerator(
  6. rotation_range=40,
  7. width_shift_range=0.2,
  8. height_shift_range=0.2,
  9. shear_range=0.2,
  10. zoom_range=0.2,
  11. horizontal_flip=True,
  12. fill_mode='nearest')
  13. # 自己的train_cats_dir数据集路径
  14. train_cats_dir='D:\\modle_date\\train\\cats'
  15. fnames = [os.path.join(train_cats_dir, fname) for fname in os.listdir(train_cats_dir)]
  16. img_path = fnames[3]
  17. img = image.load_img(img_path, target_size=(150, 150))
  18. x = image.img_to_array(img)
  19. x = x.reshape((1,) + x.shape)
  20. i = 0
  21. for batch in datagen.flow(x, batch_size=1):
  22. plt.figure(i)
  23. imgplot = plt.imshow(image.array_to_img(batch[0]))
  24. i += 1
  25. if i % 4 == 0:
  26. break
  27. plt.show()

结果显示

在这里插入图片描述

这一节(随机增强后的训练图像显示)的代码也可以单独出结果

使用数据增强的卷积神经网络

网络架构

  1. # 网络架构
  2. from keras import layers
  3. from keras import models
  4. from tensorflow.keras import optimizers
  5. from keras.preprocessing.image import ImageDataGenerator
  6. model = models.Sequential()
  7. model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
  8. model.add(layers.MaxPooling2D((2, 2)))
  9. model.add(layers.Conv2D(64, (3, 3), activation='relu'))
  10. model.add(layers.MaxPooling2D((2, 2)))
  11. model.add(layers.Conv2D(128, (3, 3), activation='relu'))
  12. model.add(layers.MaxPooling2D((2, 2)))
  13. model.add(layers.Conv2D(128, (3, 3), activation='relu'))
  14. model.add(layers.MaxPooling2D((2, 2)))
  15. model.add(layers.Flatten())
  16. model.add(layers.Dropout(0.5))
  17. model.add(layers.Dense(512, activation='relu'))
  18. model.add(layers.Dense(1, activation='sigmoid'))

模型的编译

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

利用数据增强生成器重新训练网络

  1. # 自己的数据集路径
  2. train_dir='D:\\kaggle\\modle_date\\train'
  3. validation_dir='D:\\kaggle\\modle_date\\validation'
  4. train_datagen = ImageDataGenerator(rescale=1./255,
  5. rotation_range=40,
  6. width_shift_range=0.2,
  7. height_shift_range=0.2,
  8. shear_range=0.2,
  9. zoom_range=0.2,
  10. horizontal_flip=True,)
  11. test_datagen = ImageDataGenerator(rescale=1./255)
  12. train_generator = train_datagen.flow_from_directory(train_dir,
  13. target_size=(150, 150),
  14. batch_size=32,
  15. class_mode='binary')
  16. validation_generator = test_datagen.flow_from_directory(validation_dir,
  17. target_size=(150, 150),
  18. batch_size=32,
  19. class_mode='binary')

修改后的拟合函数

拟合函数这里改动了下,原来的steps_per_epoch=100,运行时会出错,原因是数据集量变小,结合运行错误提示,上限可以到63,因此这里改为steps_per_epoch=63;同理, validation_steps也应该随着改变,改为 validation_steps=32,以下代码已做更正。

  1. history = model.fit_generator(train_generator,
  2. # steps_per_epoch=100,
  3. steps_per_epoch=63, # 取上限63
  4. epochs=100,
  5. validation_data=validation_generator,
  6. validation_steps=32) # 改为32

模型的保存

  1. model.save('cats_and_dogs_small_2.h5')

结果输出

  1. import matplotlib.pyplot as plt
  2. acc = history.history['acc']
  3. val_acc = history.history['val_acc']
  4. loss = history.history['loss']
  5. val_loss = history.history['val_loss']
  6. epochs = range(1, len(acc) + 1)
  7. plt.plot(epochs, acc, 'bo', label='Training acc')
  8. plt.plot(epochs, val_acc, 'b', label='Validation acc')
  9. plt.title('Training and validation accuracy')
  10. plt.legend()
  11. plt.figure()
  12. plt.plot(epochs, loss, 'bo', label='Training loss')
  13. plt.plot(epochs, val_loss, 'b', label='Validation loss')
  14. plt.title('Training and validation loss')
  15. plt.legend()
  16. plt.show()

结果展示

经过一百个轮次,模型训练完毕
在这里插入图片描述
模型的精度和损失图像:
在这里插入图片描述

将本节(使用数据增强的卷积神经网络)子代码汇总后就可以编译出以上结果。

代码参考:deep learning with python


本文转载自: https://blog.csdn.net/ximu__l/article/details/125885974
版权归原作者 Dream_Bri 所有, 如有侵权,请联系我们删除。

“基于kaggle数据集的猫狗识别(超详细版本)”的评论:

还没有评论