我根据the TensorFlow tutorial松散地构建RNN。
我模型的相关部分如下:
let picker = CNContactPickerViewController()
picker.displayedPropertyKeys = [CNContactPhoneNumbersKey]
picker.predicateForEnablingContact = NSPredicate(format: "phoneNumbers.@count > 0")
picker.predicateForSelectionOfContact = NSPredicate(value: false)
picker.predicateForSelectionOfProperty = NSPredicate(format: "key == 'phoneNumbers'")
picker.delegate = self
喂食:
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]
})
也许最奇怪的部分是这个错误被抛出第二次迭代,第一次完全没问题。我试图解决这个问题,所以任何帮助都会非常感激。
答案 0 :(得分:30)
您正在将train_step
变量重新分配给sess.run()
结果的第二个元素(恰好是None
)。因此,在第二次迭代中,train_step
为None
,这会导致错误。
幸运的是,修复很简单:
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]
})
答案 1 :(得分:4)
发生此错误的另一个常见原因是,如果您包括摘要提取操作,但未编写任何摘要。
示例:
# 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方法内部冒出来的错误。