Tensorflow TypeError:获取参数None的类型无效<type'NoneType'>?

Posted

技术标签:

【中文标题】Tensorflow TypeError:获取参数None的类型无效<type\'NoneType\'>?【英文标题】:Tensorflow TypeError: Fetch argument None has invalid type <type 'NoneType'>?Tensorflow TypeError:获取参数None的类型无效<type'NoneType'>? 【发布时间】:2016-12-31 02:07:31 【问题描述】:

我正在基于 the TensorFlow tutorial 松散地构建 RNN。

我的模型的相关部分如下:

input_sequence = tf.placeholder(tf.float32, [BATCH_SIZE, TIME_STEPS, PIXEL_COUNT + AUX_INPUTS])
output_actual = tf.placeholder(tf.float32, [BATCH_SIZE, OUTPUT_SIZE])

lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(CELL_SIZE, state_is_tuple=False)
stacked_lstm = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * CELL_LAYERS, state_is_tuple=False)

initial_state = state = stacked_lstm.zero_state(BATCH_SIZE, tf.float32)
outputs = []

with tf.variable_scope("LSTM"):
    for step in xrange(TIME_STEPS):
        if step > 0:
            tf.get_variable_scope().reuse_variables()
        cell_output, state = stacked_lstm(input_sequence[:, step, :], state)
        outputs.append(cell_output)

final_state = state

还有喂食:

cross_entropy = tf.reduce_mean(-tf.reduce_sum(output_actual * tf.log(prediction), reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(learning_rate=LEARNING_RATE).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(output_actual, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    numpy_state = initial_state.eval()

    for i in xrange(1, ITERATIONS):
        batch = DI.next_batch()

        print i, type(batch[0]), np.array(batch[1]).shape, numpy_state.shape

        if i % LOG_STEP == 0:
            train_accuracy = accuracy.eval(feed_dict=
                initial_state: numpy_state,
                input_sequence: batch[0],
                output_actual: batch[1]
            )

            print "Iteration " + str(i) + " Training Accuracy " + str(train_accuracy)

        numpy_state, train_step = sess.run([final_state, train_step], feed_dict=
            initial_state: numpy_state,
            input_sequence: batch[0],
            output_actual: batch[1]
            )

当我运行它时,我收到以下错误:

Traceback (most recent call last):
  File "/home/agupta/Documents/Projects/Image-Recognition-with-LSTM/RNN/feature_tracking/model.py", line 109, in <module>
    output_actual: batch[1]
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 698, in run
    run_metadata_ptr)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 838, in _run
    fetch_handler = _FetchHandler(self._graph, fetches)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 355, in __init__
    self._fetch_mapper = _FetchMapper.for_fetch(fetches)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 181, in for_fetch
    return _ListFetchMapper(fetch)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 288, in __init__
    self._mappers = [_FetchMapper.for_fetch(fetch) for fetch in fetches]
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 178, in for_fetch
    (fetch, type(fetch)))
TypeError: Fetch argument None has invalid type <type 'NoneType'>

也许最奇怪的部分是这个错误在 第二次 迭代中被抛出,而第一次工作完全正常。我正在扯头发试图解决这个问题,所以任何帮助都将不胜感激。

【问题讨论】:

【参考方案1】:

您正在将train_step 变量重新分配给sess.run()(恰好是None)结果的第二个元素。因此,在第二次迭代中,train_stepNone,这会导致错误。

幸运的是,修复很简单:

for i in xrange(1, ITERATIONS):

    # ...

    # Discard the second element of the result.
    numpy_state, _ = sess.run([final_state, train_step], feed_dict=
        initial_state: numpy_state,
        input_sequence: batch[0],
        output_actual: batch[1]
        )

【讨论】:

先生,您是有史以来最伟大的人。谢谢! mrry,你能用一般的话解释一下什么时候会出现这个错误吗?我无法理解,因为我在不同的上下文中有同样的错误......【参考方案2】:

出现此错误的另一个常见原因是您包含摘要提取操作但未编写任何摘要。

例子:

# tf.summary.scalar("loss", loss) # <- uncomment this line and it will work fine
summary_op = tf.summary.merge_all()
sess = tf.Session()
# ...
summary = sess.run([summary_op, ...], feed_dict=...) # TypeError, summary_op is "None"!

更令人困惑的是,summary_op 本身并不是 None,这只是从会话的 run 方法内部冒出的错误。

【讨论】:

以上是关于Tensorflow TypeError:获取参数None的类型无效<type'NoneType'>?的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow 错误:TypeError:__init__() 得到了一个意外的关键字参数“dct_method”[关闭]

tensorflow中gradients的使用以及TypeError: Fetch argument None has invalid type <class 'NoneType'

类方法生成“TypeError:...为关键字参数获取多个值...”

构建神经网络 [TensorFlow 2.0] 模型子类化 - ValueError/TypeError

导入 TensorFlow 时出错。 TypeError:预期字节,找到描述符

tensorflow代码TypeError:*:'int'和'Flag'不支持的操作数类型