Keras 2.3 功能整理

最近看到一些开源模型基于Keras实现,之前没系统了解过Keras,去读了官方文档,将一些不错的功能模块整理出来。
建议学习Keras的同学还是去读官方文档,本文相当于我学习后的个人笔记,很多功能不提及,只提及一些个人认为好用的、易忘的功能。

models

Keras定义model的方式有2种:Sequential 和 Model

from keras.models import Sequential,Model

# Sequential 序列式
model1 = Sequential([
    Dense(32, input_shape=(784,)),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])

# Sequential 添加式
model2 = Sequential()
model2.add(Dense(32, input_dim=784))
model2.add(Activation('relu'))

# model api式
inputs = Input(shape=(784,))
output_1 = Dense(64, activation='relu')(inputs)
output_2 = Dense(64, activation='relu')(output_1)
predictions = Dense(10, activation='softmax')(output_2)

定义好后 model 有几个通用的方法:

# 编译 compile
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 训练 fit
hist = model.fit(data, label, epochs=10, batch_size=32)

# 评估 evaluate
score = model.evaluate(x_test, y_test, batch_size=128)

# 预测 predict

layers

layers里主要常用的方法有 :
Input:实例化输入张量
Dense:全连接
Embedding:对第一层输入的emb
Activation:激活函数
Dropout:随机失活

Conv1D/Conv2D:卷积
MaxPooling1D/MaxPooling2D:池化

# Input
x = Input(shape=(32,))
y = Dense(16, activation='softmax')(x)
model = Model(x, y)

# Embedding
model2 = Sequential()
model2.add(Embedding(1000, 64, input_length=10))
model2.add(Dense(64))
model2.add(Activation('tanh'))
model2.add(Dropout(0.5))
# 现在 model.output_shape == (None, 10, 64),其中 None 是 batch 的维度

# conv
cnn = Sequential()
cnn.add(Conv2D(32, 3, padding='same', strides=2,input_shape=(28, 28, 1)))
cnn.add(LeakyReLU(0.2))
cnn.add(Dropout(0.3))

save/load

# 权重
weights = model.get_weights()
model.set_weights(weights)

# 结构 json
from keras.models import model_from_json

json_string = model.to_json()
model = model_from_json(json_string)

# 结构 yaml
from keras.models import model_from_yaml

yaml_string = model.to_yaml()
model = model_from_yaml(yaml_string)

# 模型
from keras.models import  save_model,load_model

model.save('my_model.h5') 
load_model('DeepFM.h5')

# deepctr中
from deepctr.layers import custom_objects

save_model(model, 'my_model.h5') 
model = load_model('DeepFM.h5',custom_objects)

绘图

模型可视化

from keras.utils import plot_model

plot_model(model, show_shapes=True,show_layer_names=True,dpi=96,to_file='model.png')

model.summary()

绘制epoch输出的历史变化

# epoch历史绘图

import matplotlib.pyplot as plt

history = model.fit(x, y, validation_split=0.25, epochs=50, batch_size=16, verbose=1)

# 绘制训练 & 验证的准确率值
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

# 绘制训练 & 验证的损失值
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

分布式

数据并行
数据并行包括在每个设备上复制一次目标模型,并使用每个模型副本处理不同部分的输入数据。Keras 有一个内置的实用函数 keras.utils.multi_gpu_model,它可以生成任何模型的数据并行版本,在多达 8 个 GPU 上实现准线性加速。

from keras.utils import multi_gpu_model

# 实例化基础模型(或者「模版」模型)。
# 我们推荐在 CPU 设备范围内做此操作,
# 这样模型的权重就会存储在 CPU 内存中。
# 否则它们会存储在 GPU 上,而完全被共享。
with tf.device('/cpu:0'):
    model = Xception(weights=None,
                     input_shape=(height, width, 3),
                     classes=num_classes)

# 将 `model` 复制到 8 个 GPU 上。
# 假定你的机器有 8 个可用的 GPU。
parallel_model = multi_gpu_model(model, gpus=8)
parallel_model.compile(loss='categorical_crossentropy',
                       optimizer='rmsprop')

# 这个 `fit` 调用将分布在 8 个 GPU 上。
# 由于 batch size 为 256,每个 GPU 将处理 32 个样本。
parallel_model.fit(x, y, epochs=20, batch_size=256)

# 通过模版模型存储模型(共享相同权重):
model.save('my_model.h5')

设备并行
设备并行性包括在不同设备上运行同一模型的不同部分。对于具有并行体系结构的模型,例如有两个分支的模型,比如双塔结构,这种方式很合适。

# 模型中共享的 LSTM 用于并行编码两个不同的序列
input_a = keras.Input(shape=(140, 256))
input_b = keras.Input(shape=(140, 256))

shared_lstm = keras.layers.LSTM(64)

# 在一个 GPU 上处理第一个序列
with tf.device_scope('/gpu:0'):
    encoded_a = shared_lstm(tweet_a)
# 在另一个 GPU上 处理下一个序列
with tf.device_scope('/gpu:1'):
    encoded_b = shared_lstm(tweet_b)

# 在 CPU 上连接结果
with tf.device_scope('/cpu:0'):
    merged_vector = keras.layers.concatenate([encoded_a, encoded_b],
                                             axis=-1)

你可能感兴趣的:(Keras 2.3 功能整理)