簡體   English   中英

自定義權重初始化 tensorflow tf.layers.dense

[英]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 個參數: shapedtypepartition_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM