这篇文章主要为大家介绍了大蟒深度学习张量流1.0参数初始化初始化程序示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
目录
正文所有初始化方法定义1、tf.constant_initializer()2、tf。truncated _ normal _ initializer()3、TF。random _ normal _ initializer()4、random _ uniform _ initializer=随机一致()5、TF。uniform _ unit _ scaling _ initializer()6、TFvariance _ scaling _ initializer()7、tf.orthogonal_initializer()8、tf。glorot _ uniform _ initializer()9、glorot_normal_initializer()
正文
美国有线新闻网;卷积神经网络中最重要的就是参数了,包括w,b。我们训练美国有线新闻网;卷积神经网络的最终目的就是得到最好的参数,使得目标函数取得最小值。参数的初始化也同样重要,因此微调受到很多人的重视,那么法国南部(法国南部领地的缩写)提供了哪些初始化参数的方法呢,我们能不能自己进行初始化呢?
所有初始化方法定义
#版权所有2015张量流作者。保留所有权利。
#
#根据街头流氓许可证2.0版("许可证")获得许可;
#除非符合许可证的规定,否则您不得使用本文件。
#您可以从以下网址获得许可证副本
#
# http://www.apache.org/licenses/LICENSE-2.0
#
#除非适用法律要求或书面同意,否则软件
#根据许可证分发是基于"原样"分发,
#没有任何明示或暗示的保证或条件。
#有关管理权限的特定语言,请参见许可证
#许可证下的限制。
#==============================================================================
''通常用于初始化张量的操作。
该文件中函数返回的所有变量初始值设定项都应该具有
以下签名:
def _initializer(shape,dtype=dtypes.float32,partition_info=None):
参数:
形状:表示输出"张量"形状的" int "列表。一些
初始化器也可以接受一个"张量"。
数据类型:(可选)输出"张量"的类型。
partition_info:(可选)变量_作用域. PartitionInfo对象保持
关于变量如何分区的附加信息。也许
如果变量未分区,则为"无"。
退货:
"数据类型"和"形状"类型的"张量"。
'''
从__未来_ _进口绝对_导入
从__未来_ _进口部门
从__未来_ _导入打印_功能
导入数学
从tensorflow.python.framework导入常数_op
从tensorflow.python.framework导入数据类型
从tensorflow.python.ops导入阵列_操作
从tensorflow.python.ops导入线性操作系统
从tensorflow.python.ops导入随机_操作
类初始值设定项(对象):
""初始值设定项基类:所有初始值设定项都从该类继承。
'''
def __call__(self,shape,dtype=None,partition_info=None):
引发NotImplementedError
零类(初始化器):
''生成初始化为0的张量的初始值设定项'''
def __init__(self,dtype=dtypes.float32):
self.dtype=dtype
def __call__(self,shape,dtype=None,partition_info=None):
如果数据类型为无:
dtype=self.dtype
return constant_op.constant(如果数据类型为dtypes.bool则为False否则为0,
dtype=dtype,shape=shape)
第一类(初始化器):
''生成初始化为一的张量的初始值设定项'''
def __init__(self,dtype=dtypes.float32):
self.dtype=dtype
def __call__(self,shape,dtype=None,partition_info=None):
如果数据类型为无:
dtype=self.dtype
return constant_op.constant(1,dtype=dtype,shape=shape)
类常量(初始值):
''生成具有常数值的张量的初始值设定项。
结果张量由"数据类型"类型的值填充,如下所示
由所需的"形状"后的参数"值"指定
新张量(见下面的例子)。
参数“价值”可以是常量值,也可以是类型为
数据类型.如果"值"是一个列表,那么列表的长度必须更短
的所需形状所隐含的元素数
张量。在"值"中的元素总数较少的情况下
比张量形状所需的元素数量多,最后一个元素
"值"将用于填充剩余的条目。如果总数
“价值”中的元素数大于
张量形状,初始化器将引发值错误.
参数:
值:Python标量、值列表或普通维numpy数组。全部
初始化变量的元素将被设置为相应的
“价值”参数中的值。
数据类型。
验证形状:允许验证"值"的形状的布尔值。如果
“真”,如果“价值”的形状不是
与初始化张量的形状兼容。
示例:
下面的示例可以改为使用numpy.ndarray重写
的"值"列表,甚至被重塑,如两个注释行所示
下面的'值'列表初始化。
``蟒蛇皮
将numpy作为铭牌导入
将张量流作为法国南部(French Southern Territories的缩写)导入
值=[0,1,2,3,4,5,6,7]
# value=np.array(value)
# value=值。形状([2,4])
init=tf.constant_initializer(值)
打印('适合形状:')
用tf .会话():
x=tf.get_variable('x ',shape=[2,4],initializer=init)
x.initializer.run()
print(x.eval())
拟合形状:
[[ 0.1.2.3.]
[ 4.5.6.7.]]
打印('较大的形状:')
用tf .会话():
x=tf.get_variable('x ',shape=[3,4],initializer=init)
x.initializer.run()
print(x.eval())
较大的形状:
[[ 0.1.2.3.]
[ 4.5.6.7.]
[ 7.7.7.7.]]
打印('较小的形状:')
用tf .会话():
x=tf.get_variable('x ',shape=[2,3],initializer=init)
值错误:提供的元素太多。最多需要6个,但收到8个
打印('形状验证:')
init _ verify=TF。constant _ initializer(值,verify _ shape=真)
用tf .会话():
x=tf.get_variable('x ',shape=[3,4],initializer=init_verify)
类型错误:期望的张量形状:(3,4),得到的是(8,)。
```
'''
def __init__(self,value=0,dtype=dtypes.float32,verify_shape=False):
自我价值=价值
self.dtype=dtype
self.verify_shape=verify_shape
def __call__(self,shape,dtype=None,partition_info=None):
如果数据类型为无:
dtype=self.dtype
返回constant _ op . constant(self。值,类型=类型,形状=形状
验证形状=自我.验证形状
类随机统一(初始值):
''生成均匀分布张量的初始化器。
参数:
min val:python标量或标量张量。范围的下限
要生成的随机值。
maxval:python标量或标量张量。范围的上限
要生成的随机值。对于浮点类型,默认值为1。
种子:一个计算机编程语言整数。用于创建随机种子。看见
@{tf.set_random_seed}
为了行为。
数据类型。
'''
def __init__(self,minval=0,maxval=None,seed=None,dtype=dtypes.float32):
self.minval=minval
self.maxval=maxval
种子=种子
self.dtype=dtype
def __call__(self,shape,dtype=None,partition_info=None):
如果数据类型为无:
dtype=self.dtype
返回随机_操作。random _ uniform(shape,self.minval,self.maxval,
dtype,seed=self.seed)
类随机正常(初始值设定项):
""生成正态分布张量的初始值设定项。
参数:
均值:python标量或标量张量。随机值的平均值
来产生。
stddev:python标量或标量张量。的标准偏差
要生成的随机值。
种子:一个计算机编程语言整数。用于创建随机种子。看见
@{tf.set_random_seed}
为了行为。
数据类型。仅支持浮点类型。
'''
def __init__(self,mean=0.0,stddev=1.0,seed=None,dtype=dtypes.float32):
自我平均=平均
self.stddev=stddev
种子=种子
自我。dttype=_ assert _ float _ dtype(dtype)
def __call__(self,shape,dtype=None,partition_info=None):
如果数据类型为无:
dtype=self.dtype
返回random _ ops。random _ normal(shape,self.mean,self.stddev
dtype,seed=self.seed)
类截断正常(初始值):
""生成截断正态分布的初始值设定项。
这些值类似于"随机正常初始化"中的值
除了值超过平均值的两个标准偏差
被丢弃并重新绘制。这是推荐的初始值设定项
神经网络权重和滤波器。
参数:
均值:python标量或标量张量。随机值的平均值
来产生。
stddev:python标量或标量张量。的标准偏差
要生成的随机值。
种子:一个计算机编程语言整数。用于创建随机种子。看见
@{tf.set_random_seed}
为了行为。
数据类型。仅支持浮点类型。
'''
def __init__(self,mean=0.0,stddev=1.0,seed=None,dtype=dtypes.float32):
自我平均=平均
self.stddev=stddev
种子=种子
自我。dttype=_ assert _ float _ dtype(dtype)
def __call__(self,shape,dtype=None,partition_info=None):
如果数据类型为无:
dtype=self.dtype
返回random _ ops。truncated _ normal(shape,self.mean,self.stddev,
dtype,seed=self.seed)
类统一单位缩放(初始值设定项):
''生成张量而不缩放方差的初始值设定项。
当初始化深层网络时,原则上保持
输入方差常数的比例,因此它不会爆炸或减少
到达最后一层。如果输入是" x "并且操作是“x * W”,
我们想随机一致地初始化w,我们需要从
[-sqrt(3)/sqrt(dim),sqrt(3)/sqrt(dim)]
保持比例不变,其中dim=W.shape[0]`(输入的大小)。
对卷积网络的类似计算给出了类似的结果
"暗淡"等于前三个维度的乘积。当.的时候
存在非线性,我们需要将其乘以一个常数"因子"。
见[苏西洛等人,2014年](https://arxiv.org/abs/1412.6558)
([pdf](http://arxiv。org/pdf/1412.6558。pdf))对于更深层的动机,实验
和常数的计算。在第2.3节中,常数是
数值计算:对于线性层,它是1.0,relu: ~1.43,tanh: ~1.15 .
参数:
因素:浮动。值将按其缩放的乘法因子。
种子:一个计算机编程语言整数。用于创建随机种子。看见
@{tf.set_random_seed}
为了行为。
数据类型。仅支持浮点类型。
'''
def __init__(self,factor=1.0,seed=None,dtype=dtypes.float32):
自身因素=因素
种子=种子
自我。dttype=_ assert _ float _ dtype(dtype)
def __call__(self,shape,dtype=None,partition_info=None):
如果数据类型为无:
dtype=self.dtype
scale_shape=形状
如果分区信息不是无:
scale _ shape=partition _ info完整形状
输入大小=1.0
#估计输入大小不可能做到尽善尽美,但我们会尝试。
#通过乘以除最后一个维度之外的所有维度获得的估计值,
#是矩阵乘法和卷积的正确选择(见上文)。
对于scale_shape[:-1]中的尺寸:
input_size *=float(dim)
#避免初始化零大小张量时出错。
输入大小=最大值(输入大小,1.0)
max _ val=数学。sqrt(3/输入大小)*自因子
返回random _ ops。随机_统一(形状,-最大值,最大值
dtype,seed=self.seed)
类变量缩放(初始值):
''初始化器能够根据重量张量的形状调整其比例。
使用分布='正常',从截断的正态分布中抽取样本
以零为中心的分布,用` stddev=sqrt(scale/n)'表示
其中n是:
-如果mode='扇入',权重张量中输入单元的数量
-输出单元的数量,如果mode='扇出'
-如果mode='fan_avg ',输入和输出单元数量的平均值
使用分布='均匀',从均匀分布中抽取样本
在[-极限,极限]内,用` limit=sqrt(3 * scale/n)` .
参数:
比例:比例因子(正浮动)。
模式:扇入、扇出、扇平均中的一种。
配送:随机配送使用。"正常"、"统一"中的一种。
种子:一个计算机编程语言整数。用于创建随机种子。看见
@{tf.set_random_seed}
为了行为。
数据类型。仅支持浮点类型。
加薪:
值错误:如果"刻度"、"模式"或的值无效
"分布"参数。
'''
def __init__(self,scale=1.0,
模式='扇入,
分布='正常,
种子=无,
dtype=dtypes.float32):
如果比例=0。
提高值误差(`标度'必须是正浮点数。)
如果模式不在{ '扇入','扇出','扇入平均值' }中:
提高值错误('无效的"模式"参数:',模式)
分布式=distribution.lower()
如果分布不符合{ '正常','统一' }:
提高值错误('分布'参数无效:',分配)
自我尺度=尺度
自我模式=模式
自我分配=分配
种子=种子
自我。dttype=_ assert _ float _ dtype(dtype)
def __call__(self,shape,dtype=None,partition_info=None):
如果数据类型为无:
dtype=self.dtype
规模=自我规模
scale_shape=形状
如果分区信息不是无:
scale _ shape=partition _ info完整形状
扇入,扇出=_计算扇数(缩放形状)
if self.mode=='fan_in ':
scale /=max(1 .扇入)
elif self.mode=='fan_out ':
scale /=max(1 .扇出)
否则:
scale /=max(1 .(扇入扇出)/2 .)
if self.distribution=='normal ':
stddev=math.sqrt(scale)
返回随机_操作。truncated _ normal(shape,0.0,stddev,
dtype,seed=self.seed)
否则:
limit=math.sqrt(3.0 * scale)
返回随机_操作。random _ uniform(形状,-极限,极限,
dtype,seed=self.seed)
类正交(初始值):
""生成正交矩阵的初始值设定项。
如果要初始化的张量的形状是二维的,我被初始化
使用从a的奇异值分解获得的正交矩阵
均匀随机数矩阵。
如果要初始化的张量的形状不是二维的,
形状为`(形状[0] *的矩阵.*形状[n - 2],形状[n - 1])
其中“不”是形状向量的长度。
矩阵随后被整形以给出期望形状的张量。
参数:
增益:应用于正交矩阵的乘法因子
数据类型:输出的类型。
种子:一个计算机编程语言整数。用于创建随机种子。看见
@{tf.set_random_seed}
为了行为。
'''
def __init__(self,gain=1.0,dtype=dtypes.float32,seed=None):
自我增益=增益
自我。dttype=_ assert _ float _ dtype(dtype)
种子=种子
def __call__(self,shape,dtype=None,partition_info=None):
如果数据类型为无:
dtype=self.dtype
#检查形状
如果透镜(形状)2:
提高值错误('要初始化的张量必须是'
至少是二维的)
#展平输入形状,保留最后一个维度
#它的原始形状,因此适用于conv2d
数量行=1
对于形状模糊[:-1]:
行数*=尺寸
num_cols=shape[-1]
flat_shape=(行数,列数)
#生成随机矩阵
a=随机操作。random _ uniform(flat _ shape,dtype=dtype,seed=self.seed)
#计算德拉贡诺夫狙击步枪(Snayperskaya Vinyovka Dragunov的缩写)
_,u,v=linalg_ops.svd(a,full _ matrices=False)
#选择合适的奇异值分解
如果行数数量列数:
q=u
否则:
#张量流背离numpy惯例
#因此我们需要在这里转置轴
q=array_ops.transpose(v)
回归自我。增益*数组_操作。形状(q,形状)
#别名。
# pylint: disable=invalid-name
zeros _初始值设定项=零
ones_initializer=Ones
constant_initializer=常量
random_uniform_initializer=随机统一
随机_正常_初始值设定项=随机正常
truncated _ normal _ initializer=截断的法线
uniform _ unit _ scaling _ initializer=UniformUnitScaling
variance_scaling_initializer=变量缩放
正交初始值设定项=正交
# pylint: enable=invalid-name
def glorot _ uniform _ initializer(seed=None,dtype=dtypes.float32):
格洛特统一初始值设定项,也称为泽维尔(男子名)统一初始值设定项。
它从[-极限,极限]内的均匀分布中抽取样本
其中"限制"是" sqrt(6 /(扇入扇出))"
其中'扇入'是权重张量中输入单元的数量
'扇出'是权重张量中输出单元的数量。
参考:http://jmlr . org/proceedings/papers/v9/GLO rot 10a/GLO rot 10a . pdf
参数:
种子:一个计算机编程语言整数。用于创建随机种子。看见
@{tf.set_random_seed}
为了行为。
数据类型。仅支持浮点类型。
退货:
初始化程序。
'''
返回方差_缩放_初始值设定项(缩放=1.0
mode='fan_avg ',
分布='均匀,
种子=种子,
dtype=dtype)
def glorot _ normal _ initializer(seed=None,dtype=dtypes.float32):
格洛特正常初始值设定项,也称为泽维尔(男子名)正常初始值设定项。
它从以0为中心的截断正态分布中抽取样本
with ` stddev=sqrt(2/(fan _ in fan _ out))'
其中'扇入'是权重张量中输入单元的数量
'扇出'是权重张量中输出单元的数量。
参考:http://jmlr . org/proceedings/papers/v9/GLO rot 10a/GLO rot 10a . pdf
参数:
种子:一个计算机编程语言整数。用于创建随机种子。看见
@{tf.set_random_seed}
为了行为。
数据类型。仅支持浮点类型。
退货:
初始化程序。
'''
返回方差_缩放_初始值设定项(缩放=1.0
mode='fan_avg ',
分布='正常,
种子=种子,
dtype=dtype)
#效用函数。
定义_计算_风扇(形状):
' ' ' '计算权重形状的输入和输出单位数。
参数:
形状:整数形状元组或法国南部(French Southern Territories的缩写)张量形状。
退货:
一个标量元组(扇入,扇出).
'''
如果镜头(形状)1: #只是为了避免常数的错误。
扇入=扇出=1
否则如果透镜(形状)==1:
fan_in=fan_out=shape[0]
否则如果透镜(形状)==2:
扇入=形状[0]
扇出=形状[1]
否则:
#假设卷积核(2D、3D或更多)。
#内核形状: (.输入_深度,深度)
接收域大小=1。
对于形状模糊[:-2]:
感受野大小*=尺寸
fan _ in=shape[-2]* receptive _ field _ size
扇出=形状[-1] *感受野大小
返回扇入、扇出
def _ assert _ float _ dtype(dttype):
' ' '验证并返回基于' dtype '的浮点类型。
"数据类型"必须是浮点类型。
参数:
数据类型:要验证的数据类型。
退货:
经验证的类型。
加薪:
值错误:如果"数据类型"不是浮点类型。
'''
如果不是dtype.is_floating:
提高值错误('应为浮点类型,得到的是% s . %类型)
返回数据类型
1、tf.constant_initializer()
也可以简写为tf .常数()
初始化为常数,这个非常有用,通常偏置项就是用它初始化的。
由它衍生出的两个初始化方法:
a、 tf.zeros_initializer(), 也可以简写为tf.Zeros()
b、tf.ones_initializer(), 也可以简写为tf.Ones()
例:在卷积层中,将偏置项b初始化为0,则有多种写法:
conv1 = tf.layers.conv2d(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)或者:
bias_initializer=tf.zeros_initializer()或者:
bias_initializer=tf.Zeros()例:如何将W初始化成拉普拉斯算子?
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)2、tf.truncated_normal_initializer()
或者简写为tf.TruncatedNormal()
生成截断正态分布的随机数,这个初始化方法好像在tf中用得比较多。
它有四个参数(mean=0.0,?stddev=1.0,?seed=None,?dtype=dtypes.float32),分别用于指定均值、标准差、随机数种子和随机数的数据类型,一般只需要设置stddev这一个参数就可以了。
例:
conv1 = tf.layers.conv2d(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(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(), )3、tf.random_normal_initializer()
可简写为 tf.RandomNormal()
生成标准正态分布的随机数,参数和truncated_normal_initializer一样。
4、random_uniform_initializer?= RandomUniform()
可简写为tf.RandomUniform()
生成均匀分布的随机数,参数有四个(minval=0,?maxval=None,?seed=None,?dtype=dtypes.float32),分别用于指定最小值,最大值,随机数种子和类型。
5、tf.uniform_unit_scaling_initializer()
可简写为tf.UniformUnitScaling()
和均匀分布差不多,只是这个初始化方法不需要指定最小最大值,是通过计算出来的。参数为(factor=1.0,?seed=None,?dtype=dtypes.float32)
max_val = math.sqrt(3 / input_size) * factor这里的input_size是指输入数据的维数,假设输入为x, 运算为x * W,则input_size=?W.shape[0]
它的分布区间为[ -max_val, max_val]
6、tf.variance_scaling_initializer()
可简写为tf.VarianceScaling()
参数为(scale=1.0,mode="fan_in",distribution="normal",seed=None,dtype=dtypes.float32)
scale: 缩放尺度(正浮点数)
mode:??"fan_in", "fan_out", "fan_avg"中的一个,用于计算标准差stddev的值。
distribution:分布类型,"normal"或“uniform"中的一个。
当?distribution="normal"?的时候,生成truncated normal???distribution(截断正态分布)?的随机数,其中stddev = sqrt(scale / n)?,n的计算与mode参数有关。
如果mode = "fan_in", n为输入单元的结点数;?????????如果mode = "fan_out",n为输出单元的结点数;如果mode = "fan_avg",n为输入和输出单元结点数的平均值。当distribution="uniform”的时候 ,生成均匀分布的随机数,假设分布区间为[-limit, limit],则
limit = sqrt(3 * scale / n)
7、tf.orthogonal_initializer()
简写为tf.Orthogonal()
生成正交矩阵的随机数。
当需要生成的参数是2维时,这个正交矩阵是由均匀分布的随机数矩阵经过SVD分解而来。
8、tf.glorot_uniform_initializer()
也称之为Xavier uniform initializer,由一个均匀分布(uniform distribution)来初始化数据。
假设均匀分布的区间是[-limit, limit],则
limit=sqrt(6 / (fan_in + fan_out))
其中的fan_in和fan_out分别表示输入单元的结点数和输出单元的结点数。
9、glorot_normal_initializer()
也称之为?Xavier normal initializer. 由一个?truncated normal distribution来初始化数据.
stddev = sqrt(2 / (fan_in + fan_out))
其中的fan_in和fan_out分别表示输入单元的结点数和输出单元的结点数。
以上就是python深度学习tensorflow1.0参数初始化initializer的详细内容,更多关于python tensorflow1.0参数initializer的资料请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。