,,python深度学习tensorflow1.0参数初始化initializer

,,python深度学习tensorflow1.0参数初始化initializer

这篇文章主要为大家介绍了大蟒深度学习张量流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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: