目录
实验目的:
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/
转载文章受原作者版权保护。转载请注明原作者出处!