当layer_norm(在LayerNormBasicLSTMCell中)是Tensor时,dynamic_rnn给出“`tf.Tensor`为Python`bool`”错误

问题描述 投票:0回答:1

我想在以下代码中使用LSTM单元和tensorflow here中实现的层规范化:

import tensorflow as tf 
import numpy as np 

n = 10
batch_size_series = 16

x = tf.placeholder(shape=[None, None, 1], dtype=tf.float32, name="x")  
layer_norm = tf.placeholder(tf.bool, name="normalize_layer")

cell = tf.contrib.rnn.LayerNormBasicLSTMCell(n, layer_norm=layer_norm)

initial_state = cell.zero_state(batch_size_series, dtype=tf.float32)

output_state, current_state = tf.nn.dynamic_rnn(cell, inputs=x, initial_state=initial_state, dtype=tf.float32)

layer_normTensor时,我得到以下错误:

TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.

跟踪可以追溯到dynamic_rnn

Traceback (most recent call last):
  File "test.py", line 19, in <module>
    output_state, current_state = tf.nn.dynamic_rnn(multi_rnn_cell, inputs=x, initial_state=initial_state, dtype=tf.float32)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/rnn.py", line 614, in dynamic_rnn
    dtype=dtype)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/rnn.py", line 777, in _dynamic_rnn_loop
    swap_memory=swap_memory)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2816, in while_loop
    result = loop_context.BuildLoop(cond, body, loop_vars, shape_invariants)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2640, in BuildLoop
    pred, body, original_loop_vars, loop_vars, shape_invariants)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2590, in _BuildLoop
    body_result = body(*packed_vars_for_body)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/rnn.py", line 762, in _time_step
    (output, new_state) = call_cell()
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/rnn.py", line 748, in <lambda>
    call_cell = lambda: cell(input_t, state)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/rnn_cell_impl.py", line 183, in __call__
    return super(RNNCell, self).__call__(inputs, state)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/layers/base.py", line 575, in __call__
    outputs = self.call(inputs, *args, **kwargs)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/rnn_cell_impl.py", line 1066, in call
    cur_inp, new_state = cell(cur_inp, cur_state)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/ops/rnn_cell_impl.py", line 183, in __call__
    return super(RNNCell, self).__call__(inputs, state)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/layers/base.py", line 575, in __call__
    outputs = self.call(inputs, *args, **kwargs)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/contrib/rnn/python/ops/rnn_cell.py", line 1340, in call
    concat = self._linear(args)
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/contrib/rnn/python/ops/rnn_cell.py", line 1331, in _linear
    if not self._layer_norm:
  File "/Users/fghavamian/ve_tf2/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 528, in __bool__

我在这里错过了什么吗?

python tensorflow rnn
1个回答
0
投票

tf.contrib.rnn.LayerNormBasicLSTMCell初始化程序需要一个Python布尔值而不是tf.Tensor作为layer_norm参数。这样做的原因是需要在图形构造时知道该参数的值,以便为图层标准化创建适当的变量(例如,创建"gamma""beta"here变量)。

© www.soinside.com 2019 - 2024. All rights reserved.