自己训练卷积模型实现猫狗

原数据集:包含 25000张猫狗图像,两个类别各有12500

新数据集:猫、狗 (照片大小不一样)

  • 训练集:各1000个样本
  • 验证集:各500个样本
  • 测试集:各500个样本

# 将图像复制到训练、验证和测试的目录

import os,shutil

orginal_dataset_dir = ‘kaggle_original_data/train‘
base_dir = ‘cats_and_dogs_small‘
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(orginal_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(orginal_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(orginal_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(orginal_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(orginal_dataset_dir,fname)
    dst = os.path.join(validation_dogs_dir,fname)
    shutil.copyfile(src,dst)

#将接下来的500张狗的图像复制到test_cats_dir
fnames = [‘dog.{}.jpg‘.format(i) for i in range(1500,2000)]
for fname in fnames:
    src = os.path.join(orginal_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),activation=‘relu‘,input_shape=(150,150,3)))
model.add(layers.MaxPool2D((2,2)))

model.add(layers.Conv2D(64,(3,3),activation=‘relu‘))
model.add(layers.MaxPool2D((2,2)))

model.add(layers.Conv2D(128,(3,3),activation=‘relu‘))
model.add(layers.MaxPool2D((2,2)))

model.add(layers.Conv2D(128,(3,3),activation=‘relu‘))
model.add(layers.MaxPool2D((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从目录中读取图像
#ImageDataGenerator可以快速创建Python生成器,能够将硬盘上的图像文件自动转换为预处理好的张量批量
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),
    batch_size = 20,
    class_mode = ‘binary‘  #因为使用了binary_crossentropy损失,所以需要用二进制标签
)

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

data batch shape: (20, 150, 150, 3)
labels batch shape: (20,)

#利用批量生成器拟合模型
history = model.fit_generator(
    train_generator,
    steps_per_epoch = 50,
    epochs = 30,
    validation_data = validation_generator,
    validation_steps = 50#需要从验证生成器中抽取50个批次用于评估
)

#保存模型
  model.save(‘cats_and_dogs_small_1.h5‘)

 
#绘制损失曲线和精度曲线
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(1,len(acc)+1)

plt.plot(epochs,acc,‘bo‘,label=‘Training_acc‘)
plt.plot(epochs,val_acc,‘b‘,label=‘Validation_acc‘)
plt.title(‘Traing and validation accuracy‘)
plt.legend()

plt.figure()

plt.plot(epochs,loss,‘bo‘,label=‘Training loss‘)
plt.plot(epochs,val_loss,‘b‘,label=‘Validation_loss‘)
plt.title(‘Traing and validation loss‘)
plt.legend()

plt.show()
 

#因为数据样本较少,容易过拟合,因此我们使用数据增强来减少过拟合

#利用ImageDataGenerator来设置数据增强
datagen = ImageDataGenerator(
    rotation_range = 40,
    width_shift_range = 0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range = 0.2,
    horizontal_flip = True,
    fill_mode = ‘nearest‘
)

 

#显示几个随机增强后的训练图像
from keras.preprocessing import image

fnames = [os.path.join(train_cats_dir,fname) for fname in os.listdir(train_cats_dir)]
# [‘cats_and_dogs_small\\train\\cats\\cat.0.jpg‘,‘cats_and_dogs_small\\train\\cats\\cat.1.jpg‘,...]

img_path = fnames[3]#选择一张图像进行增强
# ‘cats_and_dogs_small\\train\\cats\\cat.3.jpg‘

img = image.load_img(img_path,target_size=(150,150))#读取图像并调整大小

x = image.img_to_array(img) # ==> array(150,150,3)

x = x.reshape((1,)+x.shape) # ==> array(1,150,150,3)

i = 0
for batch in datagen.flow(x,batch_size=1):
    plt.figure(i)
    implot = plt.imshow(image.array_to_img(batch[0]))
    i += 1
    if i % 1 == 0:
        break

plt.show()

#向模型中添加一个Dropout层,添加到密集连接分类器之前
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation=‘relu‘,input_shape=(150,150,3)))
model.add(layers.MaxPool2D((2,2)))

model.add(layers.Conv2D(64,(3,3),activation=‘relu‘))
model.add(layers.MaxPool2D((2,2)))

model.add(layers.Conv2D(128,(3,3),activation=‘relu‘))
model.add(layers.MaxPool2D((2,2)))

model.add(layers.Conv2D(128,(3,3),activation=‘relu‘))
model.add(layers.MaxPool2D((2,2)))

model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512,activation=‘relu‘))
model.add(layers.Dense(1,activation=‘sigmoid‘))

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

 

#利用数据增强生成器训练卷积神经网络
train_datagen = ImageDataGenerator(
    rescale = 1./255,
    rotation_range = 40,
    width_shift_range = 0.2,
    height_shift_range = 0.2,
    shear_range = 0.2,
    zoom_range = 0.2,
    horizontal_flip = True,
)

test_datagen = ImageDataGenerator(rescale = 1./255)

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size = (150,150),
    batch_size = 20,
    class_mode = ‘binary‘  #因为使用了binary_crossentropy损失,所以需要用二进制标签
)

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

history = model.fit_generator(
    train_generator,
    steps_per_epoch = 50,
    epochs = 30,
    validation_data = validation_generator,
    validation_steps = 50#需要从验证生成器中抽取50个批次用于评估
)

model.save(‘cats_and_dogs_small_2.h5‘)

 
#绘制损失曲线和精度曲线
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(1,len(acc)+1)

plt.plot(epochs,acc,‘bo‘,label=‘Training_acc‘)
plt.plot(epochs,val_acc,‘b‘,label=‘Validation_acc‘)
plt.title(‘Traing and validation accuracy‘)
plt.legend()

plt.figure()

plt.plot(epochs,loss,‘bo‘,label=‘Training loss‘)
plt.plot(epochs,val_loss,‘b‘,label=‘Validation_loss‘)
plt.title(‘Traing and validation loss‘)
plt.legend()

plt.show()

 

原文地址:https://www.cnblogs.com/nxf-rabbit75/p/9963208.html

时间: 2024-10-11 07:45:31

自己训练卷积模型实现猫狗的相关文章

【猫狗数据集】使用预训练的resnet18模型

数据集下载地址: 链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw提取码:2xq4 创建数据集:https://www.cnblogs.com/xiximayou/p/12398285.html 读取数据集:https://www.cnblogs.com/xiximayou/p/12422827.html 进行训练:https://www.cnblogs.com/xiximayou/p/12448300.html 保存模型并继续进行训练:htt

卷积神经网络入门(1) 识别猫狗

一下来自知乎 按照我的理解,CNN的核心其实就是卷积核的作用,只要明白了这个问题,其余的就都是数学坑了(当然,相比较而言之后的数学坑更难). 如果学过数字图像处理,对于卷积核的作用应该不陌生,比如你做一个最简单的方向滤波器,那就是一个二维卷积核,这个核其实就是一个模板,利用这个模板再通过卷积计算的定义就可以计算出一幅新的图像,新的图像会把这个卷积核所体现的特征突出显示出来.比如这个卷积核可以侦测水平纹理,那卷积出来的图就是原图水平纹理的图像. 现在假设要做一个图像的分类问题,比如辨别一个图像里是

猫狗图像识别

这里,我们介绍的是一个猫狗图像识别的一个任务.数据可以从kaggle网站上下载.其中包含了25000张毛和狗的图像(每个类别各12500张).在小样本中进行尝试 我们下面先尝试在一个小数据上进行训练,首先创建三个子集:每个类别各1000个样本的训练集.每个类别各500个样本的验证集和每个类别各500个样本的测试集. import os, shutil original_dataset_dir = '/media/erphm/DATA/kaggle猫狗识别/train'    # 原始文解压目录b

pytorch实现kaggle猫狗识别

参考:https://blog.csdn.net/weixin_37813036/article/details/90718310 kaggle是一个为开发商和数据科学家提供举办机器学习竞赛.托管数据库.编写和分享代码的平台,在这上面有非常多的好项目.好资源可供机器学习.深度学习爱好者学习之用.碰巧最近入门了一门非常的深度学习框架:pytorch(如果你对pytorch不甚了解,请点击这里),所以今天我和大家一起用pytorch实现一个图像识别领域的入门项目:猫狗图像识别.深度学习的基础就是数据

华为云EI ModelArts,从0到1开发训练AI模型,通过“极快”和“极简”实现普惠AI

华为云EI ModelArts,从0到1开发训练AI模型,通过"极快"和"极简"实现普惠AI现如今 AI 技术.概念火爆.落地应用更是繁多,但开发呢?是否困难?到底有多痛?据了解,大部分 AI 开发者的工作时间并不长,并且十有八九可能不是"科班出身".从编写的教材.录制的课程中就可以看出,所有的教学都不可避免地带有很强的的学术性,即便有意避免研究导向,仍然离产业界的需求相去甚远.并且随着新一波人工智能的热潮,人们发现手里的数据多了,电脑运算的更快

[转] 轻松使用多种预训练卷积网络抽取图像特征

选自GitHub,机器之心整理. 最近 GitHub 有一个非常有意思的项目,它可以使用多种预训练 TensorFLow 模型计算图像特征.对于每一个模型,它们都会输出最后的全连接层,即 AlexNet 的第七个全连接层.VGG_19 的第 8 个全连接层等.这些层级将最终抽取出图像的特征,并能进一步用于图像分类和聚类等.机器之心简要地介绍了该项目,并测试了使用Inception_V1预训练模型抽取图像特征. 项目地址:https://github.com/cameronfabbri/Compu

使用keras,手动搭建卷积模型

####本文使用keras,手动搭建卷积模型 1 import numpy as np 2 import tensorflow as tensorflow 3 4 from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D 5 from keras.layers import Dropout, Flatten, Dense 6 from keras.models import Sequential 7 8 #初始化一

针对回归训练卷积神经网络

针对回归训练卷积神经网络 此示例使用: Image Processing Toolbox Deep Learning Toolbox Statistics and Machine Learning Toolbox Try it in MATLAB 此示例说明如何使用卷积神经网络拟合回归模型来预测手写数字的旋转角度. 卷积神经网络(CNN 或 ConvNet)是深度学习的基本工具,尤其适用于分析图像数据.例如,您可以使用 CNN 对图像进行分类.要预测连续数据(例如角度和距离),可以在网络末尾包含

NABCD模型(猫咪记单词)

项目需求分析与建议-NABCD模型(猫咪记单词) N (Need 需求) 对于现在的学生,尤其是大学生来说,学习英语是一件非常重要的事.我们有四级六级托福雅思等各种各样的英语方面的考试.而学习英语,很重要的就是词汇量,那么如何提高词汇量呢,无疑就是背单词了.但是单纯的背单词太过单调乏味,很难坚持下来.所以寻找一些合适的,更易于接受的背单词学习英语的方法就很有必要了. A (Approach 做法) 为了解决这个单纯的背单词枯燥难以坚持的问题,我们设计了猫咪记单词.学生们每天接触的最多的不是书,而