(1)读取data3数据集

import numpy as np
import os
import cv2

data_dir = '/path/to/data3'
classes = ['airplane', 'car', 'bird']

# 读取数据集
data = []
labels = []
for i, c in enumerate(classes):
    path = os.path.join(data_dir, c)
    for img in os.listdir(path):
        img_path = os.path.join(path, img)
        img_arr = cv2.imread(img_path)
        img_arr = cv2.resize(img_arr, (224, 224))
        data.append(img_arr)
        labels.append(i)
data = np.array(data)
labels = np.array(labels)

(2)进行随机裁剪,翻转等操作,使数据量翻倍

from keras.preprocessing.image import ImageDataGenerator

# 数据增强
datagen = ImageDataGenerator(
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    vertical_flip=True,
    fill_mode='nearest')

# 对每张图片进行数据增强,增加数据量
aug_data = []
aug_labels = []
for i in range(data.shape[0]):
    img = data[i]
    label = labels[i]
    img = img.reshape((1,) + img.shape)
    for batch in datagen.flow(img, batch_size=1):
        aug_data.append(batch[0])
        aug_labels.append(label)
        if len(aug_data) % 5 == 0:
            break
aug_data = np.array(aug_data)
aug_labels = np.array(aug_labels)

(3)设置读取函数

def data_generator(data, labels, batch_size):
    num_samples = len(data)
    while True:
        indices = np.random.choice(num_samples, batch_size)
        batch_data = data[indices]
        batch_labels = labels[indices]
        yield batch_data, batch_labels

(4)建立管道读取

batch_size = 32
train_gen = data_generator(aug_data, aug_labels, batch_size)
val_gen = data_generator(data, labels, batch_size)

(5)洗牌,设定合理batch_size

num_train_samples = len(aug_data)
num_val_samples = len(data)

train_steps_per_epoch = num_train_samples // batch_size
val_steps_per_epoch = num_val_samples // batch_size

(6)预读取数据

from keras.utils import to_categorical

# 预读取数据
train_data = np.concatenate([data, aug_data])
train_labels = np.concatenate([labels, aug_labels])

# 将标签转为one-hot编码
train_labels = to_categorical(train_labels, num_classes=len(classes))
val_labels = to_categorical(labels, num_classes=len(classes))

(7)合理设定超参数

lr = 1e-4
epochs = 50

(8)创建vgg16模型类

from keras.models import Model
from keras.layers import Input, Dense, Flatten
from keras.applications.vgg16 import VGG16

def create_model():
    input_tensor = Input(shape=(224, 224, 3))
    base_model = VGG16(weights='imagenet', include_top=False, input_tensor=input_tensor)
    x = base_model.output
    x = Flatten()(x)
    x = Dense(512, activation='relu')(x)
    predictions = Dense(len(classes), activation='softmax')(x)
    model = Model(inputs=base_model.input, outputs=predictions)
    return model

(9)设置正向传播方法

from keras.optimizers import Adam

model = create_model()
model.compile(optimizer=Adam(lr=lr), loss='categorical_crossentropy', metrics=['accuracy'])

model.fit_generator(train_gen, 
                    steps_per_epoch=train_steps_per_epoch, 
                    epochs=epochs,
                    validation_data=val_gen, 
                    validation_steps=val_steps_per_epoch)

原文地址: https://www.cveoy.top/t/topic/Ne6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录