1. 思路

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

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

中的kernel_initializer和bias_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_initializer和bias_initializer初始化网络的w和b参数。手动初始化网络参数对于减小训练次数,提高网络训练精度具有重要意义。

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

在tensorflow中,经常会遇到参数初始化问题,比如在训练自己的词向量时,需要对原始的embeddigs矩阵进行初始化,更一般的,在全连接神经网络中,每层的权值w也需要进行初始化。 tensorlfow中应该有一下几种初始化方法 1. tf.constant_initializer() 常数初始化 2. tf.ones_initializer() 全1初始化 3. tf.zeros_initializer() 全0初始化 4. tf.random_uniform_initializer() 均匀分布初始化 5. tf.random_normal_initializer() 正态分布初始化 CNN中最重要的就是参数了,包括W,b。 我们训练CNN的最终目的就是得到最好的参数,使得目标函数取得最小值。参数的初始化也同样重要,因此微调受到很多人的重视,那么tf提供了哪些初始化参数的方法呢,我们能不能自己进行初始化呢? 所有的初始化方法都定义在tensorflow/python/ops/init_ops.py 1、tf.constant_initializer() 也可以简写为tf.... 20230117 -在最初使用Keras进行神经网络编程的时候,除了设置神经元个数,层数,或者激活函数之后,基本上对神经网络内部就不怎么管了,所以最后很多参数都是默认的。这种情况一般遇到的数据集问题,都能轻易解决。一般不是层数非常深的神经网络,偶尔也遇到过梯度爆炸和消失的问题。但最近遇到一个数据集,默认的情况下效果也还行,但希望更进一步。就希望通过权值初始化的角度来进行改进。 可用目标函数:     -回归问题(loss='mse' | 'mae' | 'mape')     -分类问题(loss='binary_crossentropy' | 'categorical_crossentropy')      tip:1.binary_crossentropy作为目标函数用于二分类 本笔记由博客园-圆柱模板博主整理笔记发布,转载需注明,谢谢合作! 参数初始化(Initializations) 这个模块的作用是在添加layer时调用init进行这一层的权重初始化,有两种初始化方法,以下为样例: model.add(Dense(64, init='uniform'))   可以选择的初始化方法有: ... 用模型自定义的方式,很好找出模型的每层输出以及每层网络的参数,在call方法中输出就可以了,甚至还可以打断点。而在.fit中,不太好找了,先看代码。下面就是每层参数代码以及每层输出代码演示。PS.必须得predict一下才可以输出每层的输出值奥。 在构建神经网络模型时,有时会遇到需要自定义一个可训练的参数来优化模型。在参考了前人代码的基础上,进行验证自定义的参数是否可以被训练。 2、实验条件 首先定义一个线性模型y=a*x+b, 其中a 和 b是可被训练的。 定义输入数据x = np.arange(500).reshape(500,1).astype(np.float32),x是0-500的有序整数。 定义标签数据y = np.arange(500).reshape(500,1).astype(np.float32)+2.5 所以a、b最终 keras-如何提取某层的参数矩阵,并将其作为另一个层的初始化参数矩阵 首先定义一个简单的全连接网络 from keras.layers import Input,Dense inputs = Input(shape = (4,), name = 'input') d1 = Dense(7, activation = 'sigmoid', name = 'dense1')(inputs) d2 ... 这两行代码真是让我着迷了一个晚上。 最近在上手机器学习的东西,然后就需要书写一写tensorflow的代码。 毕竟第一次用tensorflow,也不太明白,也是一直在看文档,但是是照着样例来做的。 然后就照常搭建网络(根据Keras的文档) import pandas as pd from sklearn.datasets import fetch_california_housing import numpy as np   CNN中最重要的就是参数了,包括W和b。训练CNN的最终目的就是得到最好的参数,使得目标函数取得最小值。参数的初始化也同样重要,因此微调受到很多人的重视。tf提供的所有初始化方法都定义在tensorflow/python/ops/init_ops.py。 tf.constant_initializer   可以简写为tf.Constant,初始化为常数,通常偏置项就是用它初始化的。由它衍生出两个初始化方法: tf.zeros_initializer:可以简写为tf.Zeros。 tf.ones_ini units: 该层的输出维度,也就是压扁之后的维度。 activation: 激活函数,默认为None,表示不使用激活函数。 kernel_initializer: 权重矩阵的初始化方法,默认为"glorot_uniform"。 bias_initializer: ... TensorFlow全连接层函数tf.layers.dense()原理 - jian shu https://www.jianshu.com/p/3855908b4c29 最近在用TensorFlow实现CNN网络时用到了全连接层,在网上看了很多有关全连接层实现的代码,发现相当一部分人都还是倾向于自己构造权重矩阵W和偏移矩阵b,利用矩阵乘法实现全连接层。 而TensorFlow中封装了全连接层函数tf.layers.dense(),但是官方文档中并没有解释其详细原理。网上有部分博客对此提及,但也少有涉.