Keras 神经网络示例
神经网络
- MLP解决了XOR问题
- 反向传播算法首先进行预测(正向传递)并测量误差,然后反向经过每个层以测量来自每个连接的误差贡献(反向传递),最后调整连接权重以减少错误(梯度下降步骤)。
使用Keras实现
顺序API
-
示例
model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), # 图像展平为一维数组 keras.layers.Dense(300, activation="relu"), keras.layers.Dense(100, activation="relu"), keras.layers.Dense(10, activation="softmax") # 多分类用softmax,二分类用sigmoid ])
-
查看模型结构
model.summary() from keras.utils.vis_utils import plot_model # 打印模型图片 plot_model(model, "my_fashion_mnist_model.png", show_shapes=True)
-
查看指定层的权重和偏置
hidden1 = model.layers[1] weights, biases = hidden1.get_weights()
-
编译模型
model.compile(loss="sparse_categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])
-
训练模型
history = model.fit(X_train, y_train, epochs=30, validation_data=(X_valid, y_valid))
-
绘制训练和验证曲线
import pandas as pd pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.gca().set_ylim(0, 1) save_fig("keras_learning_curves_plot") plt.show()
-
如果对模型的性能不满意,可以按照学习率、优化器、模型超参数(如层数、每层神经元数、激活函数类型)、batch_size的顺序调参
-
在测试集上对其进行评估泛化误差
model.evaluate(X_test, y_test)
-
进行预测
X_new = X_test[:3] y_proba = model.predict(X_new) y_proba.round(2)
函数API
input_ = keras.layers.Input(shape=X_train.shape[1:])
hidden1 = keras.layers.Dense(30, activation="relu")(input_)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_, hidden2])
output = keras.layers.Dense(1)(concat)
model = keras.models.Model(inputs=[input_], outputs=[output])
input_A = keras.layers.Input(shape=[5], name="wide_input")
input_B = keras.layers.Input(shape=[6], name="deep_input")
hidden1 = keras.layers.Dense(30, activation="relu")(input_B)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_A, hidden2])
output = keras.layers.Dense(1, name="main_output")(concat)
aux_output = keras.layers.Dense(1, name="aux_output")(hidden2)
model = keras.models.Model(inputs=[input_A, input_B],
outputs=[output, aux_output])
子类API
- 对 Model类 进行子类化,在构造函数中创建所需的层,在 call() 方法中执行所需的计算
class WideAndDeepModel(keras.models.Model): def __init__(self, units=30, activation="relu", **kwargs): super().__init__(**kwargs) self.hidden1 = keras.layers.Dense(units, activation=activation) self.hidden2 = keras.layers.Dense(units, activation=activation) self.main_output = keras.layers.Dense(1) self.aux_output = keras.layers.Dense(1) def call(self, inputs): input_A, input_B = inputs hidden1 = self.hidden1(input_B) hidden2 = self.hidden2(hidden1) concat = keras.layers.concatenate([input_A, hidden2]) main_output = self.main_output(concat) aux_output = self.aux_output(hidden2) return main_output, aux_output model = WideAndDeepModel(30, activation="relu")
保存和还原模型
- 注意!不适用于子类API
model.save("my_model.h5") model = keras.models.load_model("my_model.h5")
回调函数
- 善于使用 callback 定期保存 checkpoint
model.compile(loss="mse", optimizer=keras.optimizers.SGD(learning_rate=1e-3)) checkpoint_cb = keras.callbacks.ModelCheckpoint("my_keras_model.h5", save_best_only=True) early_stopping_cb = keras.callbacks.EarlyStopping(patience=10,restore_best_weights=True) history = model.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks=[checkpoint_cb, early_stopping_cb]) model = keras.models.load_model("my_keras_model.h5") # 调用最佳模型 mse_test = model.evaluate(X_test, y_test)
- keras.callbacks 包中还有许多其他回调函数。按需要查阅官方文档使用。如 ReduceLROnPlateau 等
- 如果需要额外的控制,可以编写自己的自定义回调。显示训练过程中验证损失与训练损失之间的比率的示例如下(检测过拟合):
class PrintValTrainRatioCallback(keras.callbacks.Callback): def on_epoch_end(self, epoch, logs): print("\nval/train: {:.2f}".format(logs["val_loss"] / logs["loss"])) val_train_ratio_cb = PrintValTrainRatioCallback() history = model.fit(X_train, y_train, epochs=1, validation_data=(X_valid, y_valid), callbacks=[val_train_ratio_cb])
- TensorBoard 可视化
logging = keras.callbacks.TensorBoard(log_dir='logs/')
随机搜索
- 使用 GridSearchCV 或 RandomizedSearchCV 搜索超参数空间
- 以随机搜索为例:
from scipy.stats import reciprocal from sklearn.model_selection import RandomizedSearchCV # 调参范围 param_distribs = { "n_hidden": [0, 1, 2, 3], "n_neurons": np.arange(1, 100) .tolist(), "learning_rate": reciprocal(3e-4, 3e-2) .rvs(1000).tolist(), } rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3, verbose=2) #模型,参数范围,采样数,交叉验证数... rnd_search_cv.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks=[keras.callbacks.EarlyStopping(patience=10)])
- 可以查找最佳参数、分数和模型信息
rnd_search_cv.best_params_ rnd_search_cv.best_score_ rnd_search_cv.best_estimator_
- 一些可以优化超参数的库:Hyperopt, Hyperas, Scikit-Optimize 等
tircks
-
解决过拟合:
- 权重衰减:L2正则化等
- dropout
- 降低模型复杂度
- 数据增强
- 早停
-
梯度消失和梯度爆炸问题
- Glorot, He, Xavier 初始化等等
keras.layers.Dense(10, activation="relu", kernel_initializer="he_normal")
- 非饱和激活函数 Leaky ReLU, ELU, SELU
- 批归一化-BN层
- 梯度裁剪
- Glorot, He, Xavier 初始化等等
-
优化器 keras.optimizers
- momentum, nesterov, RMSprop, Adam…
optimizer = keras.optimizers.SGD(learning_rate=0.001, momentum=0.9)
- momentum, nesterov, RMSprop, Adam…
学习率调度
- ReduceLROnPlateau, ExponentialDecay…
- 幂调度,指数调度,分段恒定调度,性能调度,1周期调度…
默认DNN配置
- 视情况灵活修改
预训练-迁移学习
- 训练若干epochs,然后解冻重用的层。再次编译并继续进行训练,来微调任务B的重用层。解冻后的训练应降低学习率,避免损坏重用的权重
layer.trainable = False
今天的文章【Geron-机器学习实战】学习笔记 1-Keras 神经网络示例分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87315.html