你是真新镇宝可梦研究所的一名研究员大木博士给了一份宝可梦数据集给你让你帮他训练一个模型来区分妙蛙种子、小火龙、杰尼龟、皮卡丘和超梦。tensorflow首先根据pokmonpy批量读取图像路径并生成每张图像的路径和标签使用numpy随机函数将数据打乱顺序。使用迁移学习构建一个简单的卷积神经网络包含卷积层、池化层和全连接层。对于卷积操作可以采用具有不同过滤器数量和大小的多个卷积层以进一步增强模型的性
import tensorflow as tf import numpy as np import os from sklearn.model_selection import train_test_split from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.applications.vgg16 import VGG16 from tensorflow.keras.layers import Dense, Flatten, Dropout from tensorflow.keras.models import Sequential, Model from tensorflow.keras.optimizers import Adam from tensorflow.keras.callbacks import TensorBoard, ModelCheckpoint
读取图片路径和标签
def load_data(): datapath = "./pokemon" imgpaths = [] labels = [] for dirname in os.listdir(datapath): label = int(dirname.split("_")[0]) for filename in os.listdir(os.path.join(datapath, dirname)): imgpaths.append(os.path.join(datapath, dirname, filename)) labels.append(label) imgpaths = np.array(imgpaths) labels = np.array(labels) return imgpaths, labels
随机打乱数据
def shuffle_data(imgpaths, labels): indices = np.arange(len(imgpaths)) np.random.shuffle(indices) imgpaths = imgpaths[indices] labels = labels[indices] return imgpaths, labels
划分训练集、测试集和验证集
def split_data(imgpaths, labels): x_train, x_test, y_train, y_test = train_test_split(imgpaths, labels, test_size=0.2, stratify=labels, random_state=42) x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.2, stratify=y_train, random_state=42) return x_train, y_train, x_val, y_val, x_test, y_test
数据增强
def data_augmentation(x_train): datagen_train = ImageDataGenerator(rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, horizontal_flip=True, vertical_flip=False) datagen_train.fit(x_train) return datagen_train
加载预训练模型VGG16
def load_pretrained_model(): base_model = VGG16(include_top=False, weights='imagenet', input_shape=(224,224,3)) x = base_model.output x = Flatten()(x) x = Dense(1024, activation='relu')(x) x = Dropout(0.5)(x) predictions = Dense(5, activation='softmax')(x) model = Model(inputs=base_model.input, outputs=predictions) for layer in base_model.layers: layer.trainable = False return model
训练模型
def train_model(model, x_train, y_train, x_val, y_val): datagen_train = data_augmentation(x_train) optimizer = Adam(lr=0.001) model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy']) tensorboard = TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_images=False) checkpoint = ModelCheckpoint(filepath='./models/model.h5', monitor='val_accuracy', save_best_only=True) history = model.fit(datagen_train.flow(x_train, y_train, batch_size=32), validation_data=(x_val, y_val), epochs=50, callbacks=[tensorboard, checkpoint]) return history
主函数
def main(): imgpaths, labels = load_data() imgpaths, labels = shuffle_data(imgpaths, labels) x_train, y_train, x_val, y_val, x_test, y_test = split_data(imgpaths, labels) model = load_pretrained_model() history = train_model(model, x_train, y_train, x_val, y_val)
if name == 'main': main(
原文地址: https://www.cveoy.top/t/topic/eCk4 著作权归作者所有。请勿转载和采集!