用tensorflow实现猫和狗图片的识别

# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)

#测试版本号

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

# 保存较小数据集的目录
train_dir = '训练目录'   

validation_dir = '验证目录'

test_dir = '测试目录'

#应为全英文路径
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)))

# 将猫狗分类的小型卷积神经网络实例化
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()

# 配置模型用于训练
from keras import optimizers 
 
model.compile(loss='binary_crossentropy', 
              optimizer='adam',
              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, 
#     将所有图像的大小调整为 150×150
        target_size=(150, 150),   
        batch_size=20, 
#     因为使用了 binary_crossentropy损失,所以需要用二进制标签
        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

 拟合:利用批量生成器拟合模型
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_acc, 'b', label='Validation acc') 
plt.title('Training 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('Training 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)]
#选择一张图像继续增强
img_path = fnames[3]   
#读取图像并调整大小
img = image.load_img(img_path, target_size=(150, 150))   
#将其转换为形状 (150, 150, 3) 的 Numpy 数组
x = image.img_to_array(img)   
#将其形状改变为 (1, 150, 150, 3)
x = x.reshape((1,) + x.shape)   

#生成随机变换后的图像批量。循环是无限的,因此你需要在某个时刻终止循环
i = 0   
for batch in datagen.flow(x, batch_size=1): 
    plt.figure(i) 
    imgplot = plt.imshow(image.array_to_img(batch[0])) 
    i += 1 
    if i % 4 == 0: 
        break 
 
plt.show()

# 为了进一步降低过拟合,你还需要向模型中添加一个 Dropout 层,添加到密集连接分类器之前。
# 定义一个包含 dropout 的新卷积神经网络
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.Dropout(0.5)) 
model.add(layers.Dense(512, activation='relu')) 
model.add(layers.Dense(1, activation='sigmoid')) 
 
model.compile(loss='binary_crossentropy', 
              optimizer='adam', 
              metrics=['acc'])

此程序代码为小编两年前完成,可能存在一些错误,请各位大佬批判指正。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值