自定义权重初始化tensorflow tf.layers.dense

nav*_*rri 7 python python-3.x deep-learning tensorflow

我正在尝试将自定义初始化程序设置为使用我已经拥有的权重矩阵初始化的tf.layers.dense位置kernel_initializer.

u_1 = tf.placeholder(tf.float32, [784, 784])
first_layer_u = tf.layers.dense(X_, n_params, activation=None, 
                              kernel_initializer=u_1,
                              bias_initializer=tf.keras.initializers.he_normal())
Run Code Online (Sandbox Code Playgroud)

这是错误的说法 ValueError: If initializer is a constant, do not specify shape.

分配占位符是否是一个问题,kernel_initializer或者我错过了什么?

Jon*_*n R 7

至少有两种方法可以实现这一目标:

1创建自己的图层

  W1 = tf.Variable(YOUR_WEIGHT_MATRIX, name='Weights')
  b1 = tf.Variable(tf.zeros([YOUR_LAYER_SIZE]), name='Biases') #or pass your own
  h1 = tf.add(tf.matmul(X, W1), b1)
Run Code Online (Sandbox Code Playgroud)

2使用 tf.constant_initializer

init = tf.constant_initializer(YOUR_WEIGHT_MATRIX)
l1 = tf.layers.dense(X, o, kernel_initializer=init)
Run Code Online (Sandbox Code Playgroud)


Y. *_*Luo 6

我认为你可以定义自己的初始化函数.该函数需要3个参数:shape,dtype,和partition_info.它应该返回一个tf.Tensor用于初始化重量的东西.既然你有一个numpy数组,我想你可以tf.constant用来创建这个张量.例如:

def custom_initializer(shape_list, dtype, partition_info):
    # Use np.ones((7, 3)) as an example
    return tf.constant(np.ones((7, 3)))
Run Code Online (Sandbox Code Playgroud)

然后你可以把它传递给kernel_initializer.如果尺寸都匹配,它应该工作.我把上的示例要旨使用Estimator来构造模型并使用LoggingTensorHook记录dense/kernel在每一个步骤.您应该能够看到重量正确启动.

编辑:

我刚发现使用tf.constant_initializer会更好.它用于tensorflow指南.你可以做到kernel_initializer=tf.constant_initializer(np.ones((7, 3))).

  • @mikkola为了清楚起见,`tf.constant_initializer`肯定是更好的方法.但根据[来源](https://github.com/tensorflow/tensorflow/blob/r1.6/tensorflow/python/ops/init_ops.py#L211-L217),`tf.constant_initializer`返回一个可调用的`实际返回`tf.constant`的Constant`类.如果人们想要做比'tf.constant_initializer`更多的事情,那么`custom_initializer`是有效的. (3认同)
  • @mikkola我刚发现TensorFlow中有一个`tf.constant_initializer`(更新了我的答案).如果我理解正确,它用于初始化内核但不会"锁定"它.我只有间接证据:1)我的要点显示内核确实改变了每一步.2)在[指南](https://www.tensorflow.org/programmers_guide/variables#sharing_variables)中使用`tf.constant_initializer`,我认为该示例并不打算使`bias`不变. (2认同)