用小数据集训练分类器

仍旧是照着书敲程序出现超多问题的一天 还好慢慢都解决了
用小数据集训练猫狗分类器
1.首先是在kaggle上面下载数据集 链接就不放了,书里都有的,下载过程会遇到麻烦就是手机收不到验证码,后来解决办法是在手机号前面加上860就可以完美解决,验证码好像还是从浙江发过来的感觉蛮神奇。
2.下载之后的路径和书里的路径什么的不太一样要自己改一改,不要书里写的什么就无脑的照着敲上去,额,也可能只有我这么干。。。
3.因为把学习率learning rate 也就是程序的这一行`

optimizer=optimizers.RMSprop(lr=1e-4),

lr写成了1r,没错我就是蠢蠢的照着书敲没带脑子然后一直出错直到后来突然意识到这个问题
所以 ,脑子是个好东西啊
4.因为生成小数据集的程序和训练一开始是写在一起的,每次出错再重新运行就很坑,就会提示已经生成了小数据集,后来直接把小数据集这部分程序单独拎出来写 ,训练网络部分放在一起,不用每次运行再删除cats-vs-dogs-small真是开心
5.“Could not interpret optimizer identifier” error in Keras
这个错误主要是models 和optimizer 来源不是同一个keras,把Tensorflow keras 和 keras API弄混了,后来把所有导入包都直接写成了 import keras 问题解决
6.还有最后一个沙雕问题就是dog训练集复制数据时候,我写错了路径,因为猫狗复制数据都是相同操作,所以当时直接复制的代码,结果忘记把cats改成dogs,运行结果精度损失都直接是直线,后来查看文件夹发现狗的训练集里压根没图,才发现问题所在

# 将前1000张狗的图像复制到train_cats_dir
fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname) # original_dataset_dir/fname
    dst = os.path.join(train_dogs_dir,fname) #  train_cats_dir/fname  # 这里开始写成了cats
    # shutil.copyfile(文件1,文件2):不用打开文件,直接用文件名进行覆盖copy
    shutil.copyfile(src,dst)

终于跑出来个结果真是不容易 万事开头难啊

第一部分生成数据集

# 生成训练集测试集验证集
# 使用kaggle猫狗分类的数据集
# 只提取前1000张图片做训练集,再取500张图片做测试集

import os, shutil

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

# 原始数据集解压目录的路径
original_dataset_dir = 'F:/XLX-file/dogs-vs-cats/train'

# 保存较小数据集的目录
base_dir = 'F:/XLX-file/dogs-vs-cats/dogs-vs-cats-small'
# 创建路径
os.mkdir(base_dir)

# os.path.join 文件路径拼接   从最后一个/ 开始拼接

# 训练集目录
# base_dir/train
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张猫的图像复制 0-999
fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname) # original_dataset_dir/fname
    dst = os.path.join(train_cats_dir,fname) #  train_cats_dir/fname
    # shutil.copyfile(文件1,文件2):不用打开文件,直接用文件名进行覆盖copy
    shutil.copyfile(src,dst)

# 将接下来的500张猫的图像复制到validation_cats_dir   1000-1499
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    1500-1999
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_cats_dir
fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir,fname) # original_dataset_dir/fname
    dst = os.path.join(train_dogs_dir,fname) #  train_cats_dir/fname
    # shutil.copyfile(文件1,文件2):不用打开文件,直接用文件名进行覆盖copy
    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)

第二部分训练过程

import os
base_dir = 'F:/XLX-file/dogs-vs-cats/dogs-vs-cats-small'
train_dir = os.path.join(base_dir,'train')
validation_dir = os.path.join(base_dir,'validation')
test_dir = os.path.join(base_dir,'test')
# 构建网络

# import tensorflow as tf
# from tensorflow import keras
import keras
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(32,(3,3),activation = 'relu',input_shape = (150,150,3)))
model.add(keras.layers.MaxPooling2D((2,2)))
model.add(keras.layers.Conv2D(64,(3,3),activation= 'relu'))
model.add(keras.layers.MaxPooling2D((2,2)))
model.add(keras.layers.Conv2D(128,(3,3),activation='relu'))
model.add(keras.layers.MaxPooling2D((2,2)))
model.add(keras.layers.Conv2D(128,(3,3),activation='relu'))
model.add(keras.layers.MaxPooling2D((2,2)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(512,activation='relu'))
model.add(keras.layers.Dense(1,activation='sigmoid'))

# 编译模型
from keras import optimizers
model.compile(loss= 'binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])

# 数据预处理
# 将jpg格式转换成张量
# 1.读取jpg 2.jpg转换成rgb 3.像素网格转换为浮点数张量 4.
# keras 图像辅助处理工具 keras.preprocessing.image
# ImageDataGenerator用以生成一个batch的图像数据,支持实时数据提升。
# 训练时该函数会无限生成数据,直到达到规定的epoch次数为止。
from keras.preprocessing.image import ImageDataGenerator

# rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
train_datagen = ImageDataGenerator(rescale=1./255)# 将所有图像乘以1/255缩放  ???这个时候的图像是jpg还是rgb???
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'
)
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=100,
    epochs=30,
    validation_data=validation_generator,
    validation_steps=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_loss,'b',label='Validation_acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.savefig("Training and validation accuracy01.png")
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.savefig("Training and validation loss01.png")
plt.show()

运行结果
在这里插入图片描述
第二个图是精度写错标题了啊。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值