其实没有什么思路,因为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])。
下面给出一个拟合方程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
def buildModel():
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()
train_dataset = pd.DataFrame(train_dataset)
test_dataset = pd.DataFrame(test_dataset)
train_labels = train_dataset.pop(1)
test_labels = test_dataset.pop(1)
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(),但是官方文档中并没有解释其详细原理。网上有部分博客对此提及,但也少有涉.