前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >周末重温——TensorFlow之参数初始化

周末重温——TensorFlow之参数初始化

作者头像
lujohn3li
发布2021-06-10 00:16:05
1.1K0
发布2021-06-10 00:16:05
举报
文章被收录于专栏:机器学习爱好者社区
代码语言:javascript
复制

CNN中最重要的就是参数了,包括Wb。训练CNN的最终目的就是得到最好的参数,使得目标函数取得最小值。参数的初始化也同样重要,因此微调受到很多人的重视。tf提供的所有初始化方法都定义在tensorflow/python/ops/init_ops.py

tf.constant_initializer

  可以简写为tf.Constant,初始化为常数,通常偏置项就是用它初始化的。由它衍生出两个初始化方法:

  • tf.zeros_initializer:可以简写为tf.Zeros
  • tf.ones_initializer:可以简写为tf.Ones

在卷积层中,将偏置项b初始化为0,有多种写法:

代码语言:javascript
复制
conv1 = tf.layers.conv2d(  # 方法1
    batch_images, filters=64, kernel_size=7, strides=2, activation=tf.nn.relu,
    kernel_initializer=tf.TruncatedNormal(stddev=0.01), bias_initializer=tf.Constant(0))

bias_initializer = tf.constant_initializer(0)  # 方法2
bias_initializer = tf.zeros_initializer()  # 方法3
bias_initializer = tf.Zeros()  # 方法4

W初始化成拉普拉斯算子的方法如下:

代码语言:javascript
复制
value = [1, 1, 1, 1, -8, 1, 1, 1, 1]
init = tf.constant_initializer(value)
W = tf.get_variable('W', shape=[3, 3], initializer=init)

tf.truncated_normal_initializer

  可以简写为tf.TruncatedNormal,生成截断正态分布的随机数:

代码语言:javascript
复制
tf.TruncatedNormal(mean=0.0, stddev=1.0, seed=None, dtype=dtypes.float32)

这四个参数分别用于指定均值、标准差、随机数种子和随机数的数据类型,一般只需要设置stddev这一个参数。

代码语言:javascript
复制
conv1 = tf.layers.conv2d(  # 代码示例1
    batch_images, filters=64, kernel_size=7, strides=2, activation=tf.nn.relu,
    kernel_initializer=tf.TruncatedNormal(stddev=0.01), bias_initializer=tf.Constant(0))

conv1 = tf.layers.conv2d(  # 代码示例2
    batch_images, filters=64, kernel_size=7, strides=2, activation=tf.nn.relu,
    kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
    bias_initializer=tf.zero_initializer())

tf.random_normal_initializer

  可以简写为tf.RandomNormal,生成标准正态分布的随机数,参数和truncated_normal_initializer一样。

tf.random_uniform_initializer

  可以简写为tf.RandomUniform,生成均匀分布的随机数:

代码语言:javascript
复制
tf.RandomUniform(minval=0, maxval=None, seed=None, dtype=dtypes.float32)

这四个参数分别用于指定最小值、最大值、随机数种子和类型。

tf.uniform_unit_scaling_initializer

  可以简写为tf.UniformUnitScaling,和均匀分布差不多:

代码语言:javascript
复制
tf.UniformUnitScaling(factor=1.0, seed=None, dtype=dtypes.float32)

只是这个初始化方法不需要指定最小最大值,它们是通过计算得到的:

代码语言:javascript
复制
max_val = math.sqrt(3 / input_size) * factor
min_val = -max_val

这里的input_size是指输入数据的维数,假设输入为x,运算为x * W,则input_size = W.shape[0],它的分布区间为[-max_val, max_val]

tf.variance_scaling_initializer

  可以简写为tf.VarianceScaling

代码语言:javascript
复制
tf.VarianceScaling(scale=1.0, mode="fan_in", distribution="normal", seed=None, dtype=dtypes.float32)
  • scale:缩放尺度(正浮点数)。
  • modefan_infan_outfan_avg中的一个,用于计算标准差stddev的值。
  • distribution:分布类型,normaluniform中的一个。

  1. 当distribution = "normal"时,生成truncated normal distribution(截断正态分布)的随机数,其中stddev = sqrt(scale / n)n的计算与mode参数有关:

  • 如果mode = "fan_in"n为输入单元的结点数。
  • 如果mode = "fan_out"n为输出单元的结点数。
  • 如果mode = "fan_avg"n为输入和输出单元结点数的平均值。

  2. 当distribution = "uniform"时,生成均匀分布的随机数,假设分布区间为[-limit, limit],则:

代码语言:javascript
复制
limit = sqrt(3 * scale / n)

  可以简写为tf.Orthogonal,生成正交矩阵的随机数。当需要生成的参数是2维时,这个正交矩阵是由均匀分布的随机数矩阵经过SVD分解而来。

tf.glorot_uniform_initializer

  也称为Xavier uniform initializer,由一个均匀分布(uniform distribution)来初始化数据。假设均匀分布的区间是[-limit, limit],则:

代码语言:javascript
复制
limit = sqrt(6 / (fan_in + fan_out))

其中的fan_infan_out分别表示输入单元的结点数和输出单元的结点数。

glorot_normal_initializer

  也称之为Xavier normal initializer,由一个truncated normal distribution来初始化数据:

代码语言:javascript
复制
stddev = sqrt(2 / (fan_in + fan_out))

其中的fan_infan_out分别表示输入单元的结点数和输出单元的结点数。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习爱好者社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • tf.constant_initializer
  • tf.truncated_normal_initializer
  • tf.random_normal_initializer
  • tf.random_uniform_initializer
  • tf.uniform_unit_scaling_initializer
  • tf.variance_scaling_initializer
  • tf.glorot_uniform_initializer
  • glorot_normal_initializer
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档