《python深度学习》笔记3 dog and cat

本文详细介绍了一种基于卷积神经网络(CNN)的猫狗图片分类方法,从数据准备到模型搭建,再到模型训练与评估,全程实战操作。通过划分训练集、验证集和测试集,使用ImageDataGenerator进行数据增强,最终实现高精度的猫狗分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os,shutil

#原解压目录
original_dataset_dir='E:/dataset/dogvscaat/train'
#F创建一个小一点的目录
base_dir='E:/dataset/dogvscaat/smalldata'
os.mkdir(base_dir)
#训练集、验证集、测试集目录
#os.path.join(),连接
#os.mkdir(),创建目录
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,'dogs0')
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)

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)

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)

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)

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)

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(validation_dogs_dir, fname)
    shutil.copyfile(src, dst)

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(test_dogs_dir, fname)
    shutil.copyfile(src, dst)

#将猫狗分类的小型卷积神经网络实例化
from keras import layers
from keras import models
model=models.Sequential()
model.add(layers.Conv2D(32,(3,3),strides=1,activation='relu',input_shape=(150,150,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3),strides=1,activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),strides=1,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'])

#使用ImageDataGenerator从目录中读取图像
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,#目标目录
                                                  target_size=(150,150),#将所有图像的大小调整为150*150
                                                  batch_size=20,
                                                  class_mode='binary')#因为用了'binary_crossentropy',所以用二进制标签
validation_generator=test_datagen.flow_from_directory(validation_dir,#目标目录
                                                  target_size=(150,150),#将所有图像的大小调整为150*150
                                                  batch_size=20,
                                                  class_mode='binary')#因为用了'binary_crossentropy',所以用二进制标签

#利用批量生成器拟合模型
history=model.fit_generator(train_generator,#第一个参数要是生成器
                            steps_per_epoch=100,#运行了steps_per_epoch次梯度下降
                            epochs=30,
                            validation_data=validation_generator,
                            validation_steps=50)

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

#绘制训练过程中的损失曲线和精度曲线
#使用教程:
#https://www.runoob.com/w3cnote/matplotlib-tutorial.html
import matplotlib.pyplot as plt
acc=history.history['acc']
val_acc=history.history['val_acc']
loss=history.history['loss']
val_loss=history.history['val_loss']

epochs=range(0,len(acc))

plt.plot(epochs,acc,'bo',label='Training acc')
plt.plot(epochs,val_acc,'b',label='Validation acc')
plt.title('Training and validation acc')
plt.legend()#加图例

plt.figure()

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.show()

#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值