图像识别之猫狗识别
·
猫狗识别
- 数据预处理:图像数据处理,准备训练和验证数据集
- 卷积网络模型:构建网络架构
- 过拟合问题:观察训练和验证效果,针对过拟合问题提出解决方法
- 数据增强:图像数据增强方法与效果
- 迁移学习:深度学习必备训练策略
import os import warnings warnings.filterwarnings("ignore") import tensorflow as tf from tensorflow.keras.optimizers import Adam from tensorflow.keras.preprocessing.image import ImageDataGenerator # 指定好数据路径(训练和验证) # 数据所在文件夹 base_dir = './data/cats_and_dogs' train_dir = os.path.join(base_dir, 'train') validation_dir = os.path.join(base_dir, 'validation') # 训练集 train_cats_dir = os.path.join(train_dir, 'cats') train_dogs_dir = os.path.join(train_dir, 'dogs') # 验证集 validation_cats_dir = os.path.join(validation_dir, 'cats') validation_dogs_dir = os.path.join(validation_dir, 'dogs') # 构建卷积神经网络模型 # 几层都可以,大家可以随意玩 # 如果用CPU训练,可以把输入设置的更小一些,一般输入大小更主要的决定了训练速度 model = tf.keras.models.Sequential([ # 如果训练慢,可以把数据设置的更小一些 tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(128, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D(2, 2), # 为全连接层准备 tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), # 二分类sigmoid就够了 tf.keras.layers.Dense(1, activation='sigmoid') ]) # 配置训练器 model.compile(loss='binary_crossentropy', optimizer=Adam(lr=1e-4), metrics=['acc']) train_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( train_dir, # 文件夹路径 target_size=(64, 64), # 指定resize成的大小 batch_size=20, # 如果one-hot就是categorical,二分类用binary就可以 class_mode='binary') validation_generator = test_datagen.flow_from_directory( validation_dir, target_size=(64, 64), batch_size=20, class_mode='binary') # 训练网络模型 # 直接fit也可以,但是通常咱们不能把所有数据全部放入内存,fit_generator相当于一个生成器,动态产生所需的batch数据 # steps_per_epoch相当给定一个停止条件,因为生成器会不断产生batch数据,说白了就是它不知道一个epoch里需要执行多少个step history = model.fit_generator( train_generator, steps_per_epoch=100, # 2000 images = batch_size * steps epochs=20, validation_data=validation_generator, validation_steps=50, # 1000 images = batch_size * steps verbose=2) 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(len(acc)) plt.plot(epochs, acc, 'bo', label='Training accuracy') plt.plot(epochs, val_acc, 'b', label='Validation accuracy') plt.title('Training and validation accuracy') 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()
构建卷积神经网络模型
- 几层都可以,大家可以随意玩
- 如果用CPU训练,可以把输入设置的更小一些,一般输入大小更主要的决定了训练速度
数据预处理
- 读进来的数据会被自动转换成tensor(float32)格式,分别准备训练和验证
- 图像数据归一化(0-1)区间
更多推荐



所有评论(0)