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
に割り当てるのは問題ですか?それとも何か不足していますか?
これを実現するには、少なくとも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)
独自の初期化関数を定義できると思います。この関数は、shape
、dtype
、_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)))
を実行できます。