2

私はtheanoのDNNを訓練しましたが、特定の問題のためテンソルフローに切り替えました。私はtheanoをテナントフロー形式に変換しました。私はtheanoにあったのと同じアーキテクチャをテンソルフローで構築しました。しかし、私はディスク上にあるweight fileでレイヤーの重みをどのように初期化するのですか?これは私の基本アーキテクチャです:テンソルフロー層のカスタムウェイトをロード

input_layer = keras.layers.InputLayer(input_shape=(224,224,3),input_tensor=features) 

# Conv block 1 
conv1_1 = tf.layers.conv2d(inputs=input_layer, 
          filters=64, kernel_size=[3,3], 
          padding='same', 
          activation=tf.nn.relu, 
          name='conv1_1') 

conv1_2 = tf.layers.conv2d(inputs=conv1_1, 
          filters=64, kernel_size=[3,3], 
          padding='same', 
          activation=tf.nn.relu, 
          name='conv1_2') 

pool1 = tf.layers.max_pooling2d(inputs=conv1_2, 
           pool_size=(2,2), 
           strides=(2,2), 
           name='pool1') 


# Conv block 2 
conv2_1 = tf.layers.conv2d(inputs=pool1, 
          filters=128, kernel_size=[3,3], 
          padding='same', 
          activation=tf.nn.relu, 
          name='conv2_1') 

conv2_2 = tf.layers.conv2d(inputs=conv2_1, 
          filters=128, kernel_size=[3,3], 
          padding='same', 
          activation=tf.nn.relu, 
          name='conv2_2') 

pool2 = tf.layers.max_pooling2d(inputs=conv2_2, 
           pool_size=(2,2), 
           strides=(2,2), 
           name='pool2') 

# Conv block 3 
conv3_1 = tf.layers.conv2d(inputs=pool2, 
          filters=256, kernel_size=[3,3], 
          padding='same', 
          activation=tf.nn.relu, 
          name='conv3_1') 

conv3_2 = tf.layers.conv2d(inputs=conv3_1, 
          filters=256, kernel_size=[3,3], 
          padding='same', 
          activation=tf.nn.relu, 
          name='conv3_2') 

conv3_3 = tf.layers.conv2d(inputs=conv3_2, 
          filters=256, kernel_size=[3,3], 
          padding='same', 
          activation=tf.nn.relu, 
          name='conv3_3') 

pool3 = tf.layers.max_pooling2d(inputs=conv3_3, 
           pool_size=(2,2), 
           strides=(2,2), 
           name='pool3') 

私はディスク上にある重量ファイルからどのように重量を読み込みますか?助けてください

+0

なぜ両方のバックエンドにKerasモデルを使用しないのですか? – Xvolks

+1

今はケラスにはないものがあるからです。また、許可されていません – mlRocks

答えて

1

これを達成するにはさまざまな方法があります。私は言う、

params = {} 
... 

params['fc1/weights'] = this_weight_matrix 
params['fc1/biases'] = this_bias_vector 
... 

np.savez('model_weights', **params) 

その後、アレイの辞書を構築し、追加することができ、最も簡単な方法は、例えばnp.savez

使用してアレイなどの重量(パラメータ)行列とバイアスベクトルをエクスポートするだろうと言うだろうTensorFlowグラフを設定します。 、あなたが戻ってPythonのセッションに使用すると、ディスクに保存されたパラメータをロード言う

def fc_layer(input_tensor, n_output_units, name, 
      activation_fn=None, seed=None, 
      weight_params=None, bias_params=None): 

    with tf.variable_scope(name): 

     if weight_params is not None: 
      weights = tf.Variable(weight_params, name='weights', 
            dtype=tf.float32) 
     else: 
      weights = tf.Variable(tf.truncated_normal(
       shape=[input_tensor.get_shape().as_list()[-1], n_output_units], 
        mean=0.0, 
        stddev=0.1, 
        dtype=tf.float32, 
        seed=seed), 
       name='weights',) 

     if bias_params is not None: 
      biases = tf.Variable(bias_params, name='biases', 
           dtype=tf.float32) 

     else: 
      biases = tf.Variable(tf.zeros(shape=[n_output_units]), 
           name='biases', 
           dtype=tf.float32) 

     act = tf.matmul(input_tensor, weights) + biases 

     if activation_fn is not None: 
      act = activation_fn(act) 

    return act 

次へ::、その後

param_dict = np.load('model_weigths.npz') 

ときにセットアップを実際これは完全にラッパー関数としての層を接続する例です。 (前のラッパー関数を使用して)グラフを作成すると、次のようになります。

g = tf.Graph() 
with g.as_default(): 
    fc1 = fc_layer(input_tensor=tf_x, 
        n_output_units=n_hidden_1, 
        name='fc1', 
        weight_params=fixed_params['fc1/weights'], 
        bias_params=fixed_params['fc1/biases'], 
        activation_fn=tf.nn.relu) 
... 
+0

それは一つの方法です。私が 'tf.layers' APIを使用しているかどうかについてはどうでしょうか? 'kernel_initializer'にウェイトを渡すのと同じように動作しますか? – mlRocks

+0

申し訳ありませんが、考えられません。 tf.layers APIをあまり使用していないし、イニシャライザを通してカスタムウェイトを提供しようとしていない。おそらく '__init__'、' __call__'、 'get_config'メソッドでカスタムイニシャライザクラスを設定する必要があります。たとえば、https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/init_ops.py#L318を参照してください。 – Sebastian

関連する問題