我尝试将自定义初始化程序设置为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())
这是错误地说ValueError: If initializer is a constant, do not specify shape.
将占位符分配给kernel_initializer
还是遗漏了某些内容是否有问题?
答案 0 :(得分: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)))
然后您可以将其传递给kernel_initializer
。如果尺寸都匹配,它应该工作。我在gist上使用Estimator
来构建模型并使用LoggingTensorHook
在每一步记录dense/kernel
。您应该能够看到重量正确启动。
我刚发现使用tf.constant_initializer
会更好。它在tensorflow guide中使用。你可以kernel_initializer=tf.constant_initializer(np.ones((7, 3)))
。
答案 1 :(得分:5)
至少有两种方法可以实现这一目标:
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)
2使用tf.constant_initializer
init = tf.constant_initializer(YOUR_WEIGHT_MATRIX)
l1 = tf.layers.dense(X, o, kernel_initializer=init)
答案 2 :(得分:0)
乔纳森(Jonathan)的回答对我在转换上也很有效-
kernel_in = np.random.uniform(100,1000,(filter_width, filter_height, input_channels, output_channels)).astype(np.float32)
init = tf.constant_initializer(kernel_in)
def model(x):
x = tf.layers.conv2d(x, filters=3, kernel_size=1, strides=1, kernel_initializer=init)