keras入门教程_02_如何保存模型以及使用图像数据增强
keras入门教程_02_如何保存模型以及使用图像数据增强
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")

浙公网安备 33010602011771号