keras使用总结

项目源代码:https://github.com/zhongqianli/learning_keras

使用深度学习框架时的主要步骤:数据准备、模型设计、模型配置、模型训练、模型评估、模型保存与部署、模型可视化。将keras、tensorflow、caffe都学了一遍,每种框架都有各自适合的应用场景,其中keras最简单易用,适合快速的原型实现。本文将介绍如何使用keras训练深度学习模型。

一、读取数据

(1)数据准备

本文使用手写体数字识别数据库mnist。keras通过mnist.load_data()即可读取训练样本和测试样本,将读取数据的细节隐藏了。为了说明keras如何读取自己采集的数据,我为mnist的10个label建立对应名称的子文件夹[0 1 2 3 4 5 6 7 8 9],并将mnist的图像归一化为32x32保存到对应文件夹中。文件夹目录结构为:
mnist.32x32/train/[0 1 2 3 4 5 6 7 8 9]
mnist.32x32/test/[0 1 2 3 4 5 6 7 8 9]

(2)数据读取与数据增强

keras提供了ImageDataGenerator类实现数据读取和数据增强。使用generator的方法读取数据的好处是节省计算机资源,因为数据量很大时可能无法一次性将数据全部读入。主要的数据增强方法:平移、翻转、旋转、随机裁剪、人工噪声。
数据读取代码如下:

from keras.preprocessing.image import ImageDataGenerator  
def load_mnist_data_from_directory_generator(dirpath, target_size = (256, 256), batch_size=32, color_mode='rgb', class_mode='categorical', classes=None):  
    train_datagen = ImageDataGenerator(rescale=1 / 255.0)  
    test_datagen = ImageDataGenerator(rescale=1 / 255.0)
    train_generator = train_datagen.flow_from_directory(
        '{0}/train'.format(dirpath),
        target_size=target_size,
        batch_size=batch_size,
        class_mode=class_mode,
        color_mode=color_mode,
        classes=classes)

    test_generator = test_datagen.flow_from_directory(
        '{0}/test'.format(dirpath),
        target_size=target_size,
        batch_size=batch_size,
        class_mode=class_mode,
        color_mode=color_mode,
        classes=classes)
    return train_generator, test_generator

二、模型设计

这里以LeNet为例,采用函数式API设计模型。

def LeNet(input_shape, num_classes):
    inputs = Input(input_shape, name='input_1')
    x = Conv2D(6, (5, 5), activation='relu', name='conv1')(inputs)
    x = MaxPool2D((2, 2), name='max_pooling2d_1')(x)
    x = Conv2D(16, (5, 5), activation='relu', name='conv2')(x)
    x = MaxPool2D((2, 2), name='max_pooling2d_2')(x)
    x = Flatten(name='flatten_1')(x)
    x = Dense(120, activation='relu', name='fc1')(x)
    x = Dense(84, activation='relu', name='fc2')(x)
    predictions = Dense(num_classes, activation='softmax', name='predictions')(x)
    model =  Model(inputs=inputs, outputs=predictions)
    return model

三、模型编译

需要指定优化器、损失函数、评估函数。

model = LeNet(input_shape, num_classes)
optimizer = optimizers.SGD(lr=0.01)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

四、模型训练

此处需要指定epochs。batch_size在flow_from_directory中指定。通过TensorBoard实现可视化。通过ModelCheckpoint实现检查点的保存,用于恢复中断的模型训练。

tensorboard = keras.callbacks.TensorBoard(log_dir=log_dir)
checkpointer = keras.callbacks.ModelCheckpoint(filepath=ckpt_filepath)

history = model.fit_generator(generator=train_generator,
                    steps_per_epoch=len(train_generator),
                    epochs=epochs,
                    verbose=1,
                    callbacks=[tensorboard, checkpointer],
                    validation_data=test_generator,
                    validation_steps=len(test_generator),
                    initial_epoch=initial_epoch)

tensorboard可视化结果:
graphs:
Image text

五、模型评估

评估模型的性能

score_evaluate = model.evaluate_generator(generator=test_generator, steps=len(test_generator))
print(score_evaluate)

六、模型保存与导入

model.save(model_name)
model =  keras.models.load_model(model_name)

七、其他技巧

(1)从checkpoint恢复中断的模型训练

假设模型保存为ckpt_filepath = ckpt_dir + ‘/weights.{epoch:02d}-{val_loss:.2f}.h5’,恢复中断的模型训练:

ckpt_filelist = glob.glob('{0}/weights.*.h5'.format(ckpt_dir))
if len(ckpt_filelist) == 0:
    model = mnist_lenet(input_shape, num_classes)
else:
    filename = ckpt_filelist[-1]
    model = keras.models.load_model(filepath=filename)
    initial_epoch = int(filename.split('weights.')[-1].split('-')[0])
    print('restore from {0}, initial_epoch = {1}'.format(filename, initial_epoch))

(2)模型可视化

除了用tensorboard,还可以使用model.summary()和plot_model。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值