【Geron-机器学习实战】学习笔记 1-Keras 神经网络示例

【Geron-机器学习实战】学习笔记 1-Keras 神经网络示例Keras神经网络示例神经网络MLP解决了XOR问题反向传播算法首先进行预测(正向传递)并测量误差,然后反向经过每个层以测量来自每个连接的误差贡献(反向传递),最后调整连接权重以减少错误(梯度下降步骤)

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/')
    

随机搜索

  • 使用 GridSearchCVRandomizedSearchCV 搜索超参数空间
  • 以随机搜索为例:
    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层
    • 梯度裁剪
  • 优化器 keras.optimizers

    • momentum, nesterov, RMSprop, Adam…
      optimizer = keras.optimizers.SGD(learning_rate=0.001,
       momentum=0.9)
      

      在这里插入图片描述

  • 学习率调度

    • ReduceLROnPlateau, ExponentialDecay…
    • 幂调度,指数调度,分段恒定调度,性能调度,1周期调度…

默认DNN配置

  • 视情况灵活修改
    在这里插入图片描述

预训练-迁移学习

在这里插入图片描述

  • 训练若干epochs,然后解冻重用的层。再次编译并继续进行训练,来微调任务B的重用层。解冻后的训练应降低学习率,避免损坏重用的权重
    layer.trainable = False
    

今天的文章【Geron-机器学习实战】学习笔记 1-Keras 神经网络示例分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87315.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注