卷积神经网络——猫狗分类

目录

实验目的:
1.按照网上教程,利用TensorFlow和Keras,自己搭建卷积神经网络完成狗猫数据集的分类实验(将关键步骤注释出来)。
附加问题:解释什么是overfit(过拟合)?什么是数据增强?如果单独只做数据增强,精确率提高了多少?然后再添加的dropout层,是什么实际效果?
2.用Vgg19网络模型完成狗猫分类,写出实验结果。
实验环境:Anaconda,jupyter notebook,python3.x虚拟环境的安装
参考资料:【TensorFlow&Keras】入门猫狗数据集实验–理解卷积神经网络CNN
windows10(64位)Anaconda3+Python3.6搭建Tensorflow(cpu版本)及keras+用Jupyter notebook运行Kaggle狗猫数据集+提高模分类模型精度

一、搭建环境,完成猫狗分类

这里推荐一个jupyter_contrib_nbextensions插件,可以很方便地编辑jupyter

一)安装TensorFlow和Keras

有两种方法可以安装:

1.Anaconda中安装

安什么包最好自己搜索一下,免得版本不相容。

卷积神经网络——猫狗分类

; 2.cmd中安装

专业人士谁用UI啊,都用cmd

Files->New->Teminal

卷积神经网络——猫狗分类
使用命令
pip install tensorflow
pip install keras

然后测试

import tensorflow as tf
tf.__version__

import keras
keras.__version__

卷积神经网络——猫狗分类

二)猫狗分类实验

1.先制作数据集

常用的是kaggle网站的数据集(参考资料里面找猫狗数据集)
图片分类:

import os, shutil
#训练文件路径,数据不能压缩
original_dataset_dir = 'E:/01work_area/hml/hml13/kaggle_Dog&Cat/train'

#存储我们数据集的位置
base_dir = 'E:/01work_area/hml/hml13/kaggle_Dog&Cat/find_cats_and_dogs'
os.mkdir(base_dir)

#我们训练的路径,验证和测试拆分开做
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)

#训练用的猫片存放的路径
train_cats_dir = os.path.join(train_dir, 'cats')
os.mkdir(train_cats_dir)

#训练用的狗的图片存放的路径
train_dogs_dir = os.path.join(train_dir, 'dogs')
os.mkdir(train_dogs_dir)

#验证用的猫片存放的路径
validation_cats_dir = os.path.join(validation_dir, 'cats')
os.mkdir(validation_cats_dir)

#验证用的狗的图片存放的路径
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
os.mkdir(validation_dogs_dir)

#测试用的猫片存放的路径
test_cats_dir = os.path.join(test_dir, 'cats')
os.mkdir(test_cats_dir)

#测试用的狗的图片存放的路径
test_dogs_dir = os.path.join(test_dir, 'dogs')
os.mkdir(test_dogs_dir)

#将前面的1000张猫片复制到 train_cats_dir
fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(train_cats_dir, fname)
    shutil.copyfile(src, dst)

#将接下来的500张猫片复制到 validation_cats_dir
fnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(validation_cats_dir, fname)
    shutil.copyfile(src, dst)

#将接下来的500张猫片复制到 test_cats_dir
fnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(test_cats_dir, fname)
    shutil.copyfile(src, dst)

#将前面的1000张狗的图片复制到 train_dogs_dir
fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(train_dogs_dir, fname)
    shutil.copyfile(src, dst)

#将后面的500张狗的图片复制到 validation_dogs_dir
fnames = ['dog.{}.jpg'.format(i) for i in range(1000, 1500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(validation_dogs_dir, fname)
    shutil.copyfile(src, dst)

#将后面的500张狗的图片复制到 test_dogs_dir
fnames = ['dog.{}.jpg'.format(i) for i in range(1500, 2000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(test_dogs_dir, fname)
    shutil.copyfile(src, dst)

分类后会有几个目录,分别是find_cats_and_dogs,里面有test,train,validation。自己去验证,我不多讲。

#统计图片数量
print('total training cat images:', len(os.listdir(train_cats_dir)))
print('total training dog images:', len(os.listdir(train_dogs_dir)))
print('total validation cat images:', len(os.listdir(validation_cats_dir)))
print('total validation dog images:', len(os.listdir(validation_dogs_dir)))
print('total test cat images:', len(os.listdir(test_cats_dir)))
print('total test dog images:', len(os.listdir(test_dogs_dir)))

根据图片数量进一步验证数据集。

卷积神经网络——猫狗分类

2.卷积神经网络CNN

(1)网络模型搭建

from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((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'))
model.summary()
#model.summary()输出模型各层的参数状况

卷积神经网络——猫狗分类
(2)读取文件数据,进行预处理
from keras import optimizers

#model.compile()优化器
#(loss:计算损失,这里用的是交叉熵损失,metrics: 列表,包含评估模型在训练和测试时的性能的指标)
model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])
from keras.preprocessing.image import ImageDataGenerator

所有图像将按1/255重新缩放
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        # 这是目标目录
        train_dir,
        # 所有图像将调整为150x150
        target_size=(150, 150),
        batch_size=20,
        # 因为我们使用二元交叉熵损失,我们需要二元标签
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

卷积神经网络——猫狗分类
#在某个点上中断迭代循环
for data_batch, labels_batch in train_generator:
    print('data batch shape:', data_batch.shape)
    print('labels batch shape:', labels_batch.shape)
    break

卷积神经网络——猫狗分类

(3)训练模型

#开始训练
history = model.fit_generator(
      train_generator,
      steps_per_epoch=100,
      epochs=30,
      validation_data=validation_generator,
      validation_steps=50)

需要训练很久(根据电脑而异)

卷积神经网络——猫狗分类
(4)保存模型
model.save('E:/01work_area/hml/hml13/cats_and_dogs_small_1.h5')

后面的我做不了了,电脑太慢太卡了。

三)附加问题

二、Vgg19实现猫狗分类

Original: https://blog.csdn.net/qqq080/article/details/117660671
Author: 管它的
Title: 卷积神经网络——猫狗分类

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/665735/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球