我正在使用几个LSTM层来形成深度递归神经网络。我想在训练期间监控每个LSTM层的权重。但是,我无法找到如何将LSTM图层权重的摘要附加到TensorBoard。
有关如何做到这一点的任何建议吗?
代码如下:
example_String = "This is a great SERVERS)"
re.sub("SERVERS)","SERV", example_String)
答案 0 :(得分:9)
tf.contrib.rnn.LSTMCell
个对象有一个名为variables
的{{3}}可用于此目的。只有一个技巧:该属性返回一个空列表,直到您的单元格通过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
根据其property具有相同的variables
属性,并且它表示返回所有图层变量。老实说,我不知道MultiRNNCell
是如何工作的,所以我不能告诉你这些变量是否属于MultiRNNCell
,或者是否包含进入它的单元格中的变量。无论哪种方式,知道财产存在应该是一个很好的提示!希望这会有所帮助。
虽然大多数(所有?)RNN类都记录了variables
,但DropoutWrapper
确实存在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)
。自r1.2起doc,但访问该属性会导致1.2和1.4中的异常(看起来像1.3,但未经测试)。具体地,
AttributeError: 'DropoutWrapper' object has no attribute 'trainable'
将抛出variables
。从追溯(或property has been documented的长时间凝视),我注意到variables
已在DropoutWrapper source超级DropoutWrapper's super RNNCell
中实施。头晕了吗?实际上,我们在这里找到了记录的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
不适用于trainable_weights
实例。由于non_trainable_weights
未定义,因此self.trainable
或Layer.__init__
都不会。
更进一步,self.trainable
默认True
到DropoutWrapper
,但DropoutWrapper
从不调用它。在Layer
上引用TensorFlow撰稿人,
DropoutWrapper.variables
没有变量,因为它本身并不存储任何变量。它包含一个可能有变量的单元格;但是如果你访问[]
,它的语义应该是什么并不清楚。例如,所有keras层仅报告它们拥有的变量;所以只有一层拥有任何变量。也就是说,这可能会返回super().__init__
,而它之所以没有,DropoutWrapper永远不会在其构造函数中调用lstm_cell.variables
。这应该是一个简单的解决方案; PR欢迎。
例如,要访问上例中的LSTM变量,DECLARE @tableName NVARCHAR(MAX)
DECLARE @vcYrMth VARCHAR(6)
SET @vcYrMth = '200701'
IF OBJECT_ID('tempdb.dbo.#tmp', 'U') IS NOT NULL
DROP TABLE #tmp;
SELECT TABLE_NAME
INTO #tmp
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'CMOrg%' + @vcYrMth + 'PLD'
DECLARE @rowNum INT
SET @rowNum = 0
DECLARE @length INT
SELECT @length = COUNT(*) FROM #tmp
WHILE (@rowNum < @length)
BEGIN
SELECT @tableName = TABLE_NAME
FROM #tmp
ORDER BY TABLE_NAME OFFSET @rowNum ROWS
FETCH NEXT 1 ROWS ONLY
SELECT @sql = 'SELECT COLa,
COLb,
COLc,
COLd,
SUM(COLg) AS ‘Activity’,
SUM(COLk) AS ‘Costs’
INTO Region'+@tableName+'Summary
FROM tablename1
GROUP BY COLa,
COLb,
COLc,
COLd'
FROM #tmp
--PRINT (@sql)
EXEC (@sql)
SET @rowNum = @rowNum + 1
END
就足够了。
编辑:据我所知,Mike Khan的PR已被纳入1.5。现在,dropout图层的variables属性返回一个空列表。