[Tensorflow2.0 keras]初始化(自定义)网络层参数

本文通过实例展示了在 Keras 中如何使用 kernel_initializer 和 bias_initializer 初始化 Dense 层参数,以达到预设网络权重的效果。当参数设置正确时,网络在训练初期就能达到最优解,减少了训练次数。另一方面,不正确的初始参数会增加训练时间,但依然能通过训练收敛到目标解。手动初始化网络参数对于优化训练过程和提高精度具有显著作用。
一、背景

二、初始化网络层参数
1. 思路

其实没有什么思路,因为keras中内置了初始化参数的接口
使用:

layers.Dense(...,kernel_initializer,bias_initializer,...)

中的kernel_initializerbias_initializer初始化Dense神经网络层中的参数,其中kernel_initializer初始化参数w,bias_initializer初始化参数b,变量类型为tensorflow.python.keras.initializers.*,例如tf.keras.initializers.ones()或者tf.keras.initializers.constant([2.0])

2.代码示例

下面给出一个拟合方程y=x+2的只含有一层全连接层的神经网络进行示范说明。
对于该网络,训练数据为一个实数x和对应的y, 其中y=x+2。
代码如下:

import tensorflow as tf
import numpy as np
from tensorflow.keras import layers
import pandas as pd
# 使用网络方式实现一个网络拟合一次函数 y = a*x+b,其中 a = 1, b= 2
# 构建网络
def buildModel():
	# 只有一层全连接层,存在两个参数w和b,并使用kernel_initializer初始化w参数为1.0
	# 使用bias_initializer参数为2.0
    model = tf.keras.Sequential([
        layers.Dense(1, kernel_initializer=tf.keras.initializers.ones(),
                     bias_initializer=tf.keras.initializers.constant([2.0]))
    ])
    # 定义优化器
    optimizer = tf.keras.optimizers.RMSprop(0.001)
    # 编译优化器
    model.compile(loss='mse',
                  optimizer=optimizer,
                  metrics=['mae', 'mse'])
    return model

# 生成训练,测试数据
def generateData():
    train_dataset = []
    test_dataset = []
    for i in range(0, 5):
        train_dataset.append([i, i + 2])
    for i in range(6, 10):
        test_dataset.append([i, i + 2])
    return np.array(train_dataset, dtype=np.float), np.array(test_dataset,dtype=np.float)

train_dataset, test_dataset = generateData()
# 构建Dataframe格式的dataset
train_dataset = pd.DataFrame(train_dataset)
test_dataset = pd.DataFrame(test_dataset)
# 用第2列(下标为1即y值)的数据作为label
train_labels = train_dataset.pop(1)
test_labels = test_dataset.pop(1)

# 训练1000个epoch
Epochs = 1000

model = buildModel()
# 开始训练
history = model.fit(train_dataset, train_labels, epochs=Epochs, validation_split=0.0, verbose=0)
# 训练结果
hist = pd.DataFrame(history.history)
print(hist)

运行结果如下所示:

     loss  mae  mse
0     0.0  0.0  0.0
1     0.0  0.0  0.0
2     0.0  0.0  0.0
3     0.0  0.0  0.0
4     0.0  0.0  0.0
..    ...  ...  ...
995   0.0  0.0  0.0
996   0.0  0.0  0.0
997   0.0  0.0  0.0
998   0.0  0.0  0.0
999   0.0  0.0  0.0
[1000 rows x 3 columns]

可以看到,由于我们设置了网络的初始参数w=1.0,b=2.0,即网络初始的参数就满足真实的结果y=1.0*x+2.0,因此训练时第一次的误差就是0.0,即可达到最优解,此时可以直接结束训练,但是此处为了继续观察驯良过程并未手动结束。
当我们修改网络的初始参数时,例如我们将相应的代码改为:

  model = tf.keras.Sequential([
        layers.Dense(1, kernel_initializer=tf.keras.initializers.ones(),
                     bias_initializer=tf.keras.initializers.constant([3.0]))
    ])

  使用w=1.0,b=3.0初始网络参数。重新训练后的结果如下:

         loss       mae       mse
0    1.000000  1.000000  1.000000
1    0.981136  0.990513  0.981136
2    0.967663  0.983669  0.967663
3    0.956508  0.977957  0.956508
4    0.946696  0.972899  0.946696
..        ...       ...       ...
995  0.000418  0.016978  0.000418
996  0.000399  0.016265  0.000399
997  0.000381  0.016228  0.000381
998  0.000363  0.015520  0.000363
999  0.000346  0.015484  0.000346

[1000 rows x 3 columns]

在epoch=0时,由于初始参数b=3.0,而真实的的偏移参数b应该为2.0,因此``loss=1.0 mae=1.0 mse=1.0```。经过1000次训练后误差可以减小到0.000346。

三、总结

上面两个实验结果对比可以表明,在使用keras构建神经网络时可以使用参数kernel_initializerbias_initializer初始化网络的w和b参数。手动初始化网络参数对于减小训练次数,提高网络训练精度具有重要意义。

四、参考

[1]. Layer weight initializers
[2]. keras系列(一):参数设置

### TensorFlowKeras 的集成概述 TensorFlow2.0 版本起已全面集成了 Keras,使其成为官方推荐的高级 API。这种集成不仅简化了开发流程,还增强了两者的兼容性和功能扩展能力[^3]。 #### 集成后的优势 通过 `tf.keras` 使用 Keras 构建模型可以充分利用 TensorFlow 提供的强大工具链,例如分布式训练支持、自动微分机制以及 TensorBoard 可视化等功能[^1]。此外,由于两者紧密耦合,在性能优化方面也更加高效。 #### 安装与配置 如果使用的是最新版 TensorFlow,则无需单独安装 Keras 库;只需确保正确导入即可: ```python import tensorflow as tf from tensorflow import keras ``` #### 创建简单的神经网络示例 下面展示如何利用 `tf.keras.Sequential` 方法快速搭建一个基础分类器: ```python # 导入必要的模块 import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten # 初始化顺序模型 model = Sequential([ Flatten(input_shape=(28, 28)), # 输入层展平操作 Dense(128, activation='relu'), # 全连接隐藏层ReLU激活函数 Dense(10, activation='softmax') # 输出层Softmax用于多类别预测 ]) # 编译模型设置损失函数、优化算法及评估指标 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) print(model.summary()) # 打印模型结构概览 ``` 上述代码片段定义了一个适用于 MNIST 数据集的手写数字识别任务的小型全连接网络架构。 #### 常见问题解答 1. **Q:** 如何判断当前使用的是否为内置版本? - A: 运行命令 `tensorflow.__version__` 查看具体编号信息,并确认其中包含 “keras” 字样说明已经加载成功[^2]。 2. **Q:** 是否存在不同实现间的差异需要注意的地方? - A: 是的,虽然大部分情况下二者行为一致,但在某些特殊场景下比如自定义回调(callbacks)或者复杂图构建时可能会遇到不一致性现象。建议查阅官方文档获取最精确指导。 3. **Q:** 如果项目之前依赖外部 standalone Keras 怎么办? - A: 推荐逐步迁移至新体系内完成重构工作。通常只需要调整少量路径声明就能顺利完成过渡过程.
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值