tf.contrib.rnn.LSTMCell
オブジェクトは、このために働くvariables
と呼ばれるpropertyを持っています。ただ一つのトリックがあります:あなたのセルがtf.nn.dynamic_rnn
を通過するまで、このプロパティは空のリストを返します。少なくとも、これは単一のLSTMCellを使用する場合です。私はMultiRNNCell
のために話すことができません。だから私はこれが機能するだろうと期待しており:
output, self.final_state = tf.nn.dynamic_rnn(...)
for one_lstm_cell in cells:
one_kernel, one_bias = one_lstm_cell.variables
# I think TensorBoard handles summaries with the same name fine.
tf.summary.histogram("Kernel", one_kernel)
tf.summary.histogram("Bias", one_bias)
そして、あなたはおそらく、そこからそれを行う方法を知っているが、
summary_op = tf.summary.merge_all()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
train_writer = tf.summary.FileWriter(
"my/preferred/logdir/train", graph=tf.get_default_graph())
for step in range(1, training_steps+1):
...
_, step_summary = sess.run([train_op, summary_op])
train_writer.add_summary(step_summary)
は、私は上記のリンクTensorFlowのドキュメントを見てみると、weights
性もあります。違いがあるかどうか分からない。また、variables
の返品の順序は文書化されていません。結果リストを印刷して変数名を調べることで、わかりました。
さて、MultiRNNCell
はそのdocに応じて同じvariables
性質を持っており、それがすべて層変数を返すと言います。私は正直なところ、MultiRNNCell
の仕組みが分からないので、これらが変数MultiRNNCell
に属しているかどうか、またはそれに入るセルの変数が含まれているかどうかはわかりません。いずれにしても、財産が存在することを知ることはすばらしいヒントになるはずです!お役に立てれば。 variables
ものの
はほとんど(すべて?)RNNクラスのために、それはDropoutWrapper
のために壊すん文書化されています。 r1.2以降のproperty has been documentedでは、プロパティにアクセスすると1.2と1.4で例外が発生します(1.3のように見えますが、テストされていません)。具体的には、
from tensorflow.contrib import rnn
...
lstm_cell = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0)
wrapped_cell = rnn.DropoutWrapper(lstm_cell)
outputs, states = rnn.static_rnn(wrapped_cell, x, dtype=tf.float32)
print("LSTM vars!", lstm_cell.variables)
print("Wrapped vars!", wrapped_cell.variables)
はAttributeError: 'DropoutWrapper' object has no attribute 'trainable'
となります。トレースバック(またはDropoutWrapper sourceの長い目玉)から、variables
がDropoutWrapper's super RNNCell
のスーパーLayer
に実装されていることがわかりました。めまいはまだですか?実際には、文書番号variables
がここに記載されています。文書化されたweights
プロパティを返します。 weights
プロパティは、(文書化された)self.trainable_weights + self.non_trainable_weights
プロパティを返します。そして最後に、問題の根本:
@property
def trainable_weights(self):
return self._trainable_weights if self.trainable else []
@property
def non_trainable_weights(self):
if self.trainable:
return self._non_trainable_weights
else:
return self._trainable_weights + self._non_trainable_weights
variables
がDropoutWrapper
インスタンスでは動作しません、です。 self.trainable
は定義されていないため、trainable_weights
またはnon_trainable_weights
となりません。
さらに深く、Layer.__init__
のデフォルトはself.trainable
からTrue
ですが、DropoutWrapper
は決して呼び出しません。例えばので、Githubに
DropoutWrapper
does not have variables because it does not itself store any. It wraps a cell that may have variables; but it's not clear what the semantics should be if you access the DropoutWrapper.variables
. For example, all keras layers only report back the variables that they own; and so only one layer ever owns any variable. That said, this should probably return []
, and the reason it doesn't is that DropoutWrapper never calls super().__init__
in its constructor. That should be an easy fix; PRs welcome.
をTensorFlowの貢献を引用すると、上記の例でLSTM変数にアクセスするには、lstm_cell.variables
は十分です。
編集:私の知る限りでは、マイク・ハーンのPRは1.5に組み込まれています。さて、ドロップアウト層の変数プロパティは空のリストを返します。
ありがとうございました! 'MultiRNNCell.variables'は、LSTMユニットのすべての重みと偏りを持つリストを返します。あなたのコードに概説されているように使用することができます。 – Lemon
喜んで助けてください!私も何かを学んだ –
同じことをしようとしていますが、エラーが発生しています: 'DropoutWrapper'オブジェクトには 'trainable'属性がありません.Tensorflowのバージョンに問題があり、1.2.1を使用しています。何か案は? –