[英]Custom weight initialization tensorflow tf.layers.dense
我正在嘗試為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
是一個問題還是我遺漏了什么?
至少有兩種方法可以實現這一點:
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)
我認為您可以定義自己的初始化函數。 該函數需要采用 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 指南。 你可以做kernel_initializer=tf.constant_initializer(np.ones((7, 3)))
。
喬納森的回答也對我有用 conv -
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.