人工智能A7论坛 >> Tensorflow和深度学习笔记_论坛版 >> 3.Tensorflow第一步 >> 3.2 Demo:Softmax Regression训练MNIST

3.2.2 基本用法说明

I) 基本过程

TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段

在构建阶段, op 的执行步骤 被描述成一个图.

在执行阶段, 使用会话执行执行图中的 op

 

II变量的用法(Variable)

 

IIIfeed 和 fetch

使用feed和fetch可以为任意的操作赋值或者从其中获取数据

Feed “喂”数据, placeholder)  

 

 

IV) 默认的变量初始化方式

变量具体是怎么初始化的?tf.global_variables_initializer

首先 tf.global_variables_initializer 等价于 variable_initializers(global_variables())   

也就是分别调用每一个全局变量自带的initializer

def variables_initializer(var_list, name="init"):
  """Returns an Op that initializes a list of variables.  
  """
  if var_list:
    return control_flow_ops.group(*[v.initializer for in var_list], name=name)
  return control_flow_ops.no_op(name=name)

具体是怎么初始化的呢?

If initializer is None (the default), the default initializer passed in the variable scope will be used. If that one is None too, a UniformUnitScalingInitializer(tf.uniform_unit_scaling_initializer) will be used.

 

tensorflow-master\tensorflow\python\ops\init_ops.py

uniform_unit_scaling_initializer = UniformUnitScaling

.....

class UniformUnitScaling(Initializer):
  """Initializer that generates tensors without scaling variance.

  When initializing a deep network, it is in principle advantageous to keep
  the scale of the input variance constant, so it does not explode or diminish
  by reaching the final layer. If the input is `x` and the operation `x * W`,
  and we want to initialize `W` uniformly at random, we need to pick `W` from

      [-sqrt(3) / sqrt(dim), sqrt(3) / sqrt(dim)]

  to keep the scale intact, where `dim = W.shape[0]` (the size of the input).
  A similar calculation for convolutional networks gives an analogous result
  with `dim` equal to the product of the first 3 dimensions.  When
  nonlinearities are present, we need to multiply this by a constant `factor`.
  See [Sussillo et al., 2014](https://arxiv.org/abs/1412.6558)
  ([pdf] for deeper motivation, experiments
  and the calculation of constants. In section 2.3 there, the constants were
  numerically computed: for a linear layer it's 1.0, relu: ~1.43, tanh: ~1.15.

  Args:
    factor: Float.  A multiplicative factor by which the values will be scaled.
    seed: A Python integer. Used to create random seeds. See
      @{tf.set_random_seed}
      for behavior.
    dtype: The data type. Only floating point types are supported.
  """

  def __init__(self, factor=1.0, seed=None, dtype=dtypes.float32):
    self.factor = factor
    self.seed = seed
    self.dtype = _assert_float_dtype(dtype)

  def __call__(self, shape, dtype=None, partition_info=None):
    if dtype is None:
      dtype = self.dtype
    scale_shape = shape
    if partition_info is not None:
      scale_shape = partition_info.full_shape

    input_size = 1.0
    # Estimating input size is not possible to do perfectly, but we try.
    # The estimate, obtained by multiplying all dimensions but the last one,
    # is the right thing for matrix multiply and convolutions (see above).
    for dim in scale_shape[:-1]:
      input_size *= float(dim)
    # Avoid errors when initializing zero-size tensors.
    input_size = max(input_size, 1.0)
    max_val = math.sqrt(/ input_size) * self.factor
    return random_ops.random_uniform(shape, -max_val, max_val,
                                     dtype, seed=self.seed)

在训练神经网络的时候,初始权值的选取是很重要的,直接决定了后续收敛的快慢和效果好坏。对于有一些不稳定的神经网络(如RNN),初始权值选择的不好,甚至会让神经网络没法训练,不收敛。因为神经网络的训练和优化,目前来说并没有从理论上得到完备的解决,很多时候还是需要依靠经验。

tensorflow默认的参数初始化原则:
保持 在训练的过程中 输入变量的scale是在固定的范围内波动,这样可以尽量避免梯度爆炸和梯度弥散的问题。

Tensorflow默认的选取初值的方式,是

在区间  [-sqrt(3) / sqrt(dim), sqrt(3) / sqrt(dim)] 进行随机选取。

考虑到非线性以后,我们还需要将这个区间乘以一个因子,对于不同的激活函数,分别是:

线性:1.0, relu: ~1.43, tanh: ~1.15.

 

Tensorflow参数初始化的更多经验,参见附录“参数初始化”