06 如何保存模型以及使用图像数据增强

import keras
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import plot_model
import os
import time

"""
(1). 如何保存模型
保存模型,训练好之后就可以保存了
save_dir = os.path.join(os.getcwd(), 'saved_models') # 存放文件夹地址
model_name = 'keras_cifar10_trained_model.h5' # 模型名称,用.h5保存
if not os.path.isdir(save_dir): # 文件夹地址是否存在
    os.makedirs(save_dir) # 如果不存在,则创建地址
model_path = os.path.join(save_dir, model_name) # 模型的存放地址
# 利用model.save(地址)保存
model.save(model_path)

(2). 流程
# 1. 超参数
# 2.加载数据
# 3.搭建模型
# 4.编译模型
# 5.训练数据
# 6.保存模型
# 7.预测模型

(3). 生成器使用
datagen  = ImageDataGenerator()
train_generator = datagen.flow()
model.fit_generator()
"""
# 1. 超参数
start = time.time()
batch_size = 128
num_classes = 10
epochs = 5
data_augmentation = True  # 数据增强
num_predictions = 20

# 2.加载数据
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
# 制作标签
y_train = keras.utils.to_categorical(y=y_train, num_classes=num_classes)
y_test = keras.utils.to_categorical(y=y_test, num_classes=num_classes)

# 3.搭建模型
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3, 3),
                 padding='same', activation='relu',
                 input_shape=x_train.shape[1:]))  # 即取后面几个
model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))

model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(Dropout(rate=0.25))

model.add(Flatten())
model.add(Dense(units=512, activation='relu'))
model.add(Dropout(rate=0.5))

model.add(Dense(units=num_classes, activation='softmax'))

# 4.编译模型
opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
model.compile(loss='categorical_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])

# 5.训练模型(是否使用数据增强)
if not data_augmentation:
    print('不使用数据增强')
    model.fit(x=x_train, y=y_train,
              batch_size=batch_size,
              epochs=epochs,
              validation_data=(x_test, y_test),
              shuffle=True)

else:  # 图像数据增强的训练办法
    print("使用图像数据增强")
    # 实例化一个图像数据增强器
    datagen = ImageDataGenerator(
        featurewise_center=False,  # 将输入数据的均值设置为 0,逐特征进行
        samplewise_center=False,  # 将每个样本的均值设置为 0
        featurewise_std_normalization=False,  # 将输入除以数据标准差,逐特征进行。
        samplewise_std_normalization=False,  # 将每个输入除以其标准差
        zca_whitening=False,  # 应用 ZCA 白化
        rotation_range=0,  # 随机旋转的度数范围,0-180度
        width_shift_range=0.1,  # 浮点数(总宽度的比例)。随机水平移动的范围
        height_shift_range=0.1,  # 浮点数(总高度的比例)。随机垂直移动的范围。
        horizontal_flip=True,  # 布尔值。随机水平翻转
        vertical_flip=False,  # 布尔值。随机垂直翻转。
    )
    # 用这个图像数据增强器去计算训练集;验证集、测试集不需要,只用在训练集上
    datagen.fit(x_train)  # 转换过后的有.fit/.flow等等方法

    # 生成训练生成器,每次产生批量的数据
    train_generator = datagen.flow(x=x_train, y=y_train, batch_size=batch_size)
    # 生成器与模型并行运行,以提高效率。 例如,这可以让你在 CPU 上对图像进行实时数据增强,以在 GPU 上训练模型。
    model.fit_generator(generator=train_generator,
                        epochs=epochs, validation_data=(x_test, y_test), workers=4)
    # works:使用的最大进程数量

# 6.保存模型
save_dir = os.path.join(os.getcwd(), 'saved_models')
model_name = 'keras_cifar10_trained_model.h5'  # 模型保存地址
if not os.path.isdir(save_dir):
    os.makedirs(save_dir)
model_path = os.path.join(save_dir, model_name)
model.save(model_path)
plot_model(model=model, to_file='models/cifar10_cnn.png')

# 7. 预测模型
scores = model.evaluate(x=x_test, y=y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])

end = time.time()
print("训练完成时间:", end-start, "s")
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值