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

实验目的:
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
//没有pip,就要按提示先安装pip,后面如果报错
//Could not import PIL.Image. The use of `load_img` requires PIL.
//自己再安装pillow包,建议先安装包,再实验

然后测试

import tensorflow as tf
tf.__version__

import keras
keras.__version__
//我不知道keras为什么会有错,重新创个最新环境再安装就不会有错

在这里插入图片描述

二)猫狗分类实验

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实现猫狗分类

  • 2
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值