使用keras完成飞机车鸟数据集1读取data3数据集2进行随机裁剪翻转等操作使数据量翻倍3设置读取函数4建立管道读取5洗牌设定合理batch_size6预读取数据7合理设定超参数8创建vgg16模型类9设置正向传播方法
(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 著作权归作者所有。请勿转载和采集!