图像分类模型训练 - 使用 TensorFlow 和 Keras
import os import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers from keras.layers.core import Dropout
定义训练集和测试集路径
train_dir = 'C:/Users/28938/Desktop/shengdu/Data/train' test_dir = 'C:/Users/28938/Desktop/shengdu/Data/test'
定义类别标签
class_names = ['MEN_Coats', 'MEN_Hood', 'MEN_Suits', 'WOMEN_Dress', 'WOMEN_Hood']
定义图像尺寸和批次大小
img_height = 224 img_width = 224 batch_size = 32
从目录中读取训练集和测试集
train_ds = keras.preprocessing.image_dataset_from_directory( train_dir, validation_split=0.2, subset='training', seed=42, image_size=(img_height, img_width), batch_size=batch_size ) val_ds = keras.preprocessing.image_dataset_from_directory( train_dir, validation_split=0.2, subset='validation', seed=42, image_size=(img_height, img_width), batch_size=batch_size ) test_ds = keras.preprocessing.image_dataset_from_directory( test_dir, seed=42, image_size=(img_height, img_width), batch_size=batch_size )
定义函数以展示图像
def plotImages(img_arr): fig, axes = plt.subplots(1, 5, figsize=(20,20)) axes = axes.flatten() for img, ax in zip( img_arr, axes): ax.imshow(img) ax.axis('off') plt.tight_layout() plt.show()
定义数据增强器
data_augmentation = keras.Sequential( [ layers.experimental.preprocessing.RandomFlip('horizontal', input_shape=(img_height, img_width, 3)), layers.experimental.preprocessing.RandomRotation(0.1), layers.experimental.preprocessing.RandomZoom(0.1), ] )
定义模型输入
input_shape = (img_height, img_width, 3)
建立模型
model = keras.Sequential([ data_augmentation, layers.experimental.preprocessing.Rescaling(1./255), layers.Conv2D(32, 3, padding='same', activation='relu', input_shape=input_shape), layers.MaxPooling2D(), layers.Dropout(0.2), layers.Conv2D(64, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Dropout(0.2), layers.Conv2D(128, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Dropout(0.2), layers.Flatten(), layers.Dense(256, activation='relu'), layers.Dense(len(class_names)) ])
编译模型
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
打印模型结构
model.summary()
显示前5张图像
plt.figure(figsize=(10, 10)) for images, labels in train_ds.take(1): for i in range(5): ax = plt.subplot(5, 5, i + 1) plt.imshow(images[i].numpy().astype('uint8')) plt.title(class_names[labels[i]]) plt.axis('off')
设定训练参数
epochs = 15
开始训练模型
#history = model.fit(train_ds, validation_data=val_ds, epochs=epochs) batch_size = 16 history = model.fit(train_ds, validation_data=val_ds, epochs=epochs, batch_size=batch_size)
对模型进行评估
test_loss, test_acc = model.evaluate(test_ds) print('Test accuracy:', test_acc)
对模型进行预测
predictions = model.predict(test_ds)
绘制模型准确度和损失随时间变化的曲线
acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs_range = range(epochs) plt.figure(figsize=(8, 8)) plt.subplot(2, 1, 1) plt.plot(epochs_range, acc, label='Training Accuracy') plt.plot(epochs_range, val_acc, label='Validation Accuracy') plt.legend(loc='lower right') plt.title('Training and Validation Accuracy') plt.subplot(2, 1, 2) plt.plot(epochs_range, loss, label='Training Loss') plt.plot(epochs_range, val_loss, label='Validation Loss') plt.legend(loc='upper right') plt.title('Training and Validation Loss') plt.show()
原文地址: https://www.cveoy.top/t/topic/oy8I 著作权归作者所有。请勿转载和采集!