web-dev-qa-db-ja.com

カスタムウェイト初期化テンソルフロー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に割り当てるのは問題ですか?それとも何か不足していますか?

7
naveen marri

これを実現するには、少なくとも2つの方法があります。

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)
7
Jonathan R

独自の初期化関数を定義できると思います。この関数は、shapedtype、_partition_info_の3つの引数を取る必要があります。重みを初期化するために使用される_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)))を実行できます。

6
Y. Luo