带有浮点输入的 feed dict TensorFlow 错误
Error in feed dict TensorFlow with float input
这是一段代码
def train(x):
prediction = cnn(x)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=prediction, labels=y))
optimizer = tf.train.AdadeltaOptimizer().minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in xrange(num_epochs):
epoch_loss = 0
for _ in xrange(int(1020/batch_size)):
epoch_x, epoch_y = train_iterator.get_next()
_, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y})
epoch_loss += c
print('Epoch {} completed out of {} - loss {}'.format(epoch + 1, num_epochs, epoch_loss))
错误行是这样的
_, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y})
我使用这段代码从 tfrecord 文件中读取数据
def read_image_dataset_tfrecordfile(filenames, color=False, resize=False, width=100, height=100):
def parser(record):
keys_to_features = {
"image": tf.FixedLenFeature([], tf.string),
"label": tf.FixedLenFeature([], tf.int64)
}
parsed = tf.parse_single_example(record, keys_to_features)
image = tf.decode_raw(parsed["image"], tf.uint8)
image = tf.cast(image, tf.float32)
if resize:
if color:
image = tf.reshape(image, shape=[width, height, 3])
else:
image = tf.reshape(image, shape=[width, height, 1])
label = tf.cast(parsed["label"], tf.int32)
label = tf.one_hot(label, 17)
return {'image': image}, label
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(parser)
return dataset
我在这里打印了一张图片及其标签
[[59.],
[94.],
[79.],
...,
[41.],
[42.],
[43.]],
[[56.],
[86.],
[91.],
...,
[43.],
[41.],
[33.]],
[[53.],
[69.],
[63.],
...,
[56.],
[59.],
[51.]]], dtype=float32)}, array([0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
dtype=float32))
图像是 float32 作为我网络的输入。可以看到
x = tf.placeholder(tf.float32, [None, 10000])
def cnn(x):
weights = {
'W_conv1': tf.Variable(tf.random_normal([5, 5, 1, 16])),
'W_conv2': tf.Variable(tf.random_normal([5, 5, 16, 16])),
'W_conv3': tf.Variable(tf.random_normal([5, 5, 16, 32])),
'W_conv4': tf.Variable(tf.random_normal([5, 5, 32, 32])),
'W_fc': tf.Variable(tf.random_normal([24 * 24 * 32, 1024])),
'out': tf.Variable(tf.random_normal([1024, n_classes]))
}
biases = {
'b_conv1': tf.Variable(tf.random_normal([16])),
'b_conv2': tf.Variable(tf.random_normal([16])),
'b_conv3': tf.Variable(tf.random_normal([32])),
'b_conv4': tf.Variable(tf.random_normal([32])),
'b_fc': tf.Variable(tf.random_normal([1024])),
'b_out': tf.Variable(tf.random_normal([n_classes]))
}
x = tf.reshape(x, [-1, 100, 100, 1])
conv1 = tf.nn.relu(tf.nn.conv2d(x, weights['W_conv1'], strides=[1, 1, 1, 1], padding='SAME') + biases['b_conv1'])
conv2 = tf.nn.relu(tf.nn.conv2d(conv1, weights['W_conv2'], strides=[1, 1, 1, 1], padding='SAME') +
biases['b_conv2'])
conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
conv3 = tf.nn.relu(tf.nn.conv2d(conv2, weights['W_conv3'], strides=[1, 1, 1, 1], padding='SAME') +
biases['b_conv3'])
conv4 = tf.nn.relu(tf.nn.conv2d(conv3, weights['W_conv4'], strides=[1, 1, 1, 1], padding='SAME') +
biases['b_conv4'])
conv4 = tf.nn.max_pool(conv4, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
fc = tf.reshape(conv4, [-1, 24 * 24 * 32])
fc = tf.nn.relu(tf.matmul(fc, weights['W_fc']) + biases['b_fc'])
fc = tf.nn.dropout(fc, dropout_rate)
out = tf.matmul(fc, weights['out']) + biases['b_out']
return out
我使用的网络与我在 TensorFlow 示例中用于 MNIST 数据集的网络相同。权重和偏差是浮动的,所以我的输入必须是浮动的,对吗?使用 MNIST 数据集时一切正常,但现在它给了我这个错误,我不知道为什么。
编辑 1
Traceback (most recent call last):
File "/Users/user/PycharmProjects/ProveTF/main.py", line 109, in <module>
train(x)
File "/Users/user/PycharmProjects/ProveTF/main.py", line 84, in train
_, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y})
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 905, in run
run_metadata_ptr)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1106, in _run
np_val = np.asarray(subfeed_val, dtype=subfeed_dtype)
File "/Users/user/venv/lib/python2.7/site-packages/numpy/core/numeric.py", line 492, in asarray
return array(a, dtype, copy=False, order=order)
TypeError: float() argument must be a string or a number
编辑 2
Traceback (most recent call last):
File "/Users/user/PycharmProjects/ProveTF/main.py", line 111, in <module>
train(x)
File "/Users/user/PycharmProjects/ProveTF/main.py", line 84, in train
_, c = sess.run([optimizer, cost])
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 905, in run
run_metadata_ptr)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1137, in _run
feed_dict_tensor, options, run_metadata)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1355, in _do_run
options, run_metadata)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1374, in _do_call
raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.OutOfRangeError: End of sequence
[[Node: IteratorGetNext = IteratorGetNext[output_shapes=[[?,100,100,1], [?,17]], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator)]]
Caused by op u'IteratorGetNext', defined at:
File "/Users/user/PycharmProjects/ProveTF/main.py", line 109, in <module>
x, y = train_iterator.get_next()
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 330, in get_next
name=name)), self._output_types,
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/ops/gen_dataset_ops.py", line 866, in iterator_get_next
output_shapes=output_shapes, name=name)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
op_def=op_def)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 3271, in create_op
op_def=op_def)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1650, in __init__
self._traceback = self._graph._extract_stack() # pylint: disable=protected-access
OutOfRangeError (see above for traceback): End of sequence
[[Node: IteratorGetNext = IteratorGetNext[output_shapes=[[?,100,100,1], [?,17]], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator)]]
编辑 3
def train(input):
prediction = cnn(input)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=prediction, labels=y))
optimizer = tf.train.AdadeltaOptimizer().minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in xrange(num_epochs):
epoch_loss = 0
for _ in xrange(int(1020/batch_size)):
try:
_, c = sess.run([optimizer, cost])
epoch_loss += c
except tf.errors.OutOfRangeError:
train_set.repeat()
print('Epoch {} completed out of {} - loss {}'.format(epoch + 1, num_epochs, epoch_loss))
dict
/ array
投射错误
代码和依赖项太多,无法重现您的问题。
但是在我看来,您的错误可能来自您的 parser(record)
函数,该函数 returns 您的图像包裹在 dict
(c.f. {'image': image}
,而它您的 label
不是这种情况)。由于 epoch_x
将包含 dict
元素,Tensorflow(和 numpy)将无法尝试将它们转换为预期的数据类型(tf.float32
张量,c.f。占位符的定义x
),这可能会解释您与转换相关的错误。
长话短说,尝试在解析器中将 return {'image': image}, label
替换为 return image, label
。
Tensorflow 数据集 API 对比 feed_dict
不知何故这个问题一开始让我逃避了。给定基于 Tensorflow-Dataset 的输入管道,您不应该使用 placeholder
/ feed_dict
。后者旨在将 CPU 上的数据传递给 Tensorflow(在 GPU 上应该是 运行)。通过 feed_dict
完成的输入 duplication/conversion 开销很大,因此开发了 Tensorflow 数据集 API,它通过与实际数据并行读取和转换数据来缩短所有这些图运行。换句话说,您的 epoch_x, epoch_y
不需要 fed 到 Tensorflow;它们已经是其图表的一部分。
基本上,您的管道应该类似于以下内容:
train_dataset = read_image_dataset_tfrecordfile(my_filenames)
train_dataset = train_dataset.repeat() # if you want to loop indefinitely
train_iterator = train_dataset.make_one_shot_iterator()
x, y = train_iterator.get_next()
# x, y will represent your data batches, fed with the next ones every time
# they are called.
# So you just use them directly instead of placeholders:
prediction = cnn(x)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
logits=prediction, labels=y))
optimizer = tf.train.AdadeltaOptimizer().minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in xrange(num_epochs):
epoch_loss = 0
for _ in xrange(int(1020/batch_size)):
_, c = sess.run([optimizer, cost])
# ...
这是一段代码
def train(x):
prediction = cnn(x)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=prediction, labels=y))
optimizer = tf.train.AdadeltaOptimizer().minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in xrange(num_epochs):
epoch_loss = 0
for _ in xrange(int(1020/batch_size)):
epoch_x, epoch_y = train_iterator.get_next()
_, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y})
epoch_loss += c
print('Epoch {} completed out of {} - loss {}'.format(epoch + 1, num_epochs, epoch_loss))
错误行是这样的
_, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y})
我使用这段代码从 tfrecord 文件中读取数据
def read_image_dataset_tfrecordfile(filenames, color=False, resize=False, width=100, height=100):
def parser(record):
keys_to_features = {
"image": tf.FixedLenFeature([], tf.string),
"label": tf.FixedLenFeature([], tf.int64)
}
parsed = tf.parse_single_example(record, keys_to_features)
image = tf.decode_raw(parsed["image"], tf.uint8)
image = tf.cast(image, tf.float32)
if resize:
if color:
image = tf.reshape(image, shape=[width, height, 3])
else:
image = tf.reshape(image, shape=[width, height, 1])
label = tf.cast(parsed["label"], tf.int32)
label = tf.one_hot(label, 17)
return {'image': image}, label
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(parser)
return dataset
我在这里打印了一张图片及其标签
[[59.],
[94.],
[79.],
...,
[41.],
[42.],
[43.]],
[[56.],
[86.],
[91.],
...,
[43.],
[41.],
[33.]],
[[53.],
[69.],
[63.],
...,
[56.],
[59.],
[51.]]], dtype=float32)}, array([0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
dtype=float32))
图像是 float32 作为我网络的输入。可以看到
x = tf.placeholder(tf.float32, [None, 10000])
def cnn(x):
weights = {
'W_conv1': tf.Variable(tf.random_normal([5, 5, 1, 16])),
'W_conv2': tf.Variable(tf.random_normal([5, 5, 16, 16])),
'W_conv3': tf.Variable(tf.random_normal([5, 5, 16, 32])),
'W_conv4': tf.Variable(tf.random_normal([5, 5, 32, 32])),
'W_fc': tf.Variable(tf.random_normal([24 * 24 * 32, 1024])),
'out': tf.Variable(tf.random_normal([1024, n_classes]))
}
biases = {
'b_conv1': tf.Variable(tf.random_normal([16])),
'b_conv2': tf.Variable(tf.random_normal([16])),
'b_conv3': tf.Variable(tf.random_normal([32])),
'b_conv4': tf.Variable(tf.random_normal([32])),
'b_fc': tf.Variable(tf.random_normal([1024])),
'b_out': tf.Variable(tf.random_normal([n_classes]))
}
x = tf.reshape(x, [-1, 100, 100, 1])
conv1 = tf.nn.relu(tf.nn.conv2d(x, weights['W_conv1'], strides=[1, 1, 1, 1], padding='SAME') + biases['b_conv1'])
conv2 = tf.nn.relu(tf.nn.conv2d(conv1, weights['W_conv2'], strides=[1, 1, 1, 1], padding='SAME') +
biases['b_conv2'])
conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
conv3 = tf.nn.relu(tf.nn.conv2d(conv2, weights['W_conv3'], strides=[1, 1, 1, 1], padding='SAME') +
biases['b_conv3'])
conv4 = tf.nn.relu(tf.nn.conv2d(conv3, weights['W_conv4'], strides=[1, 1, 1, 1], padding='SAME') +
biases['b_conv4'])
conv4 = tf.nn.max_pool(conv4, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
fc = tf.reshape(conv4, [-1, 24 * 24 * 32])
fc = tf.nn.relu(tf.matmul(fc, weights['W_fc']) + biases['b_fc'])
fc = tf.nn.dropout(fc, dropout_rate)
out = tf.matmul(fc, weights['out']) + biases['b_out']
return out
我使用的网络与我在 TensorFlow 示例中用于 MNIST 数据集的网络相同。权重和偏差是浮动的,所以我的输入必须是浮动的,对吗?使用 MNIST 数据集时一切正常,但现在它给了我这个错误,我不知道为什么。
编辑 1
Traceback (most recent call last):
File "/Users/user/PycharmProjects/ProveTF/main.py", line 109, in <module>
train(x)
File "/Users/user/PycharmProjects/ProveTF/main.py", line 84, in train
_, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y})
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 905, in run
run_metadata_ptr)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1106, in _run
np_val = np.asarray(subfeed_val, dtype=subfeed_dtype)
File "/Users/user/venv/lib/python2.7/site-packages/numpy/core/numeric.py", line 492, in asarray
return array(a, dtype, copy=False, order=order)
TypeError: float() argument must be a string or a number
编辑 2
Traceback (most recent call last):
File "/Users/user/PycharmProjects/ProveTF/main.py", line 111, in <module>
train(x)
File "/Users/user/PycharmProjects/ProveTF/main.py", line 84, in train
_, c = sess.run([optimizer, cost])
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 905, in run
run_metadata_ptr)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1137, in _run
feed_dict_tensor, options, run_metadata)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1355, in _do_run
options, run_metadata)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1374, in _do_call
raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.OutOfRangeError: End of sequence
[[Node: IteratorGetNext = IteratorGetNext[output_shapes=[[?,100,100,1], [?,17]], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator)]]
Caused by op u'IteratorGetNext', defined at:
File "/Users/user/PycharmProjects/ProveTF/main.py", line 109, in <module>
x, y = train_iterator.get_next()
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 330, in get_next
name=name)), self._output_types,
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/ops/gen_dataset_ops.py", line 866, in iterator_get_next
output_shapes=output_shapes, name=name)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
op_def=op_def)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 3271, in create_op
op_def=op_def)
File "/Users/user/venv/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1650, in __init__
self._traceback = self._graph._extract_stack() # pylint: disable=protected-access
OutOfRangeError (see above for traceback): End of sequence
[[Node: IteratorGetNext = IteratorGetNext[output_shapes=[[?,100,100,1], [?,17]], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator)]]
编辑 3
def train(input):
prediction = cnn(input)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=prediction, labels=y))
optimizer = tf.train.AdadeltaOptimizer().minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in xrange(num_epochs):
epoch_loss = 0
for _ in xrange(int(1020/batch_size)):
try:
_, c = sess.run([optimizer, cost])
epoch_loss += c
except tf.errors.OutOfRangeError:
train_set.repeat()
print('Epoch {} completed out of {} - loss {}'.format(epoch + 1, num_epochs, epoch_loss))
dict
/ array
投射错误
代码和依赖项太多,无法重现您的问题。
但是在我看来,您的错误可能来自您的 parser(record)
函数,该函数 returns 您的图像包裹在 dict
(c.f. {'image': image}
,而它您的 label
不是这种情况)。由于 epoch_x
将包含 dict
元素,Tensorflow(和 numpy)将无法尝试将它们转换为预期的数据类型(tf.float32
张量,c.f。占位符的定义x
),这可能会解释您与转换相关的错误。
长话短说,尝试在解析器中将 return {'image': image}, label
替换为 return image, label
。
Tensorflow 数据集 API 对比 feed_dict
不知何故这个问题一开始让我逃避了。给定基于 Tensorflow-Dataset 的输入管道,您不应该使用 placeholder
/ feed_dict
。后者旨在将 CPU 上的数据传递给 Tensorflow(在 GPU 上应该是 运行)。通过 feed_dict
完成的输入 duplication/conversion 开销很大,因此开发了 Tensorflow 数据集 API,它通过与实际数据并行读取和转换数据来缩短所有这些图运行。换句话说,您的 epoch_x, epoch_y
不需要 fed 到 Tensorflow;它们已经是其图表的一部分。
基本上,您的管道应该类似于以下内容:
train_dataset = read_image_dataset_tfrecordfile(my_filenames)
train_dataset = train_dataset.repeat() # if you want to loop indefinitely
train_iterator = train_dataset.make_one_shot_iterator()
x, y = train_iterator.get_next()
# x, y will represent your data batches, fed with the next ones every time
# they are called.
# So you just use them directly instead of placeholders:
prediction = cnn(x)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
logits=prediction, labels=y))
optimizer = tf.train.AdadeltaOptimizer().minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in xrange(num_epochs):
epoch_loss = 0
for _ in xrange(int(1020/batch_size)):
_, c = sess.run([optimizer, cost])
# ...