2016-11-24 9 views
1

私は3つの隠れたレイヤーを持つニューラルネットワークを持っています。これは「純粋な」勾配降下で、あるいはより洗練された手法で訓練することができます。私はまた、私の問題では、勢いに基づいた最適化手法(アダム、アダデッタ、勢い)がはるかに優れていることに気付きました。テンソルフローの特定のレイヤーで運動量を無効にするにはどうすればよいですか?

今興味深い部分です。設計上、NNの第1層で勢いを無効にしたい。つまり、2番目と3番目のレイヤーでAdamでウェイトを更新したいのですが、最初のレイヤーでは単純なグラデーションディセントを使用します。

私はいつも自分のオプティマイザを書くことができます:tf.gradients(loss, tf.trainable_variables())でグラデーションを計算してから、自分で勢いをつけてください。しかし、すべてのレイヤーで特別なオプティマイザパラメータを使用するオプションがあるといいでしょう。誰かがそのようなことをする方法について聞いたことがありますか?

+0

ネットワークのレイヤーはどのように定義しますか? – sygi

+0

特別何も、私は考えて '' 'W_1 = tf.Variable( tf.truncated_normal([HIDDEN_0_SIZE、HIDDEN_1_SIZE]、 STDDEV = 1/np.sqrt(HIDDEN_0_SIZE))、 名= 'W') B_1 = TF .variable(tf.zeros([HIDDEN_1_SIZE])、name = 'b') hidden_​​1 = tf.matmul(activation_0_drop、W_1)+ b_1 activation_1 = tf.nn.relu(hidden_​​1、name = 'activation') activation_1_drop = tf.nn.dropout(activation_1、keep_prob) '' 'なぜ、マークダウンが新しい行をすべて削除するのか分かりません。( – iezepov

+0

あなたは投稿を編集すると新しい行が表示されますそこに:) – sygi

答えて

1

さて、あなたはオプティマイザ(docs)に最適化するために、変数のリストを提供することができます。

opt = tf.train.AdamOptimizer() 
opt_op = opt.minimize(loss, var_list=[W1, b1]) 
opt2 = tf.train.GradientDescentOptimizer(learning_rate) 
opt2_op = opt2.minimize(loss, var_list=[W2, b2]) 

あなたは変数リスト与えられた層を自分の(おそらく、重みとバイアス)を抽出する必要があります。

+0

アイデアをありがとう!しかし、このようにして、第1層のトレーニングをオプティマイザに提供しないことで、トレーニングをすべて無効にすることができます。しかし、私はまだそれを訓練したいと思っていますが、勢いを利用しています。たぶん私は2つのオプティマイザを持つことができます:最初のレイヤのGradientDescentと他のすべてのAdam。 – iezepov

+1

編集を参照してください。 2つのオプティマイザを定義すると、それぞれが対応する変数を更新できます。 'sess.run([opt_op、opt2_op])'でそれらを一緒に実行すると、勾配は1回だけ計算されると私は思っています。 – sygi

関連する問題