python - dataset.repeat() 在 TensorFlow 中不起作用
问题描述
这是代码的一部分
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(batch_size):
_, c = sess.run([optimizer, cost])
epoch_loss += c
print('Epoch {} completed out of {} - loss {}'.format(epoch + 1, num_epochs, epoch_loss))
n_classes = 17
batch_size = 32
dropout_rate = 0.4
num_epochs = 10
train_set = read_image_dataset_tfrecordfile('train.tfrecord', resize=True)
train_set = train_set.batch(batch_size)
train_set.repeat(num_epochs)
train_iterator = train_set.make_one_shot_iterator()
x, y = train_iterator.get_next()
train(x)
当我运行它时,它只执行第一个时期,然后抛出 OutOfRangeError,这里是堆栈
Epoch 1 completed out of 10 - loss 5.82853866496e+11
Traceback (most recent call last):
File "/Users/user/PycharmProjects/ProveTF/main.py", line 113, in <module>
train(x)
File "/Users/user/PycharmProjects/ProveTF/main.py", line 83, 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 110, 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)]]
我试图将 repeat() 方法移到其他地方,并尝试简单地编写没有参数的 repeat(),但它无论如何都不起作用。
有什么解决方案或建议吗?
解决方案
您需要train_set = train_set.repeat()
像使用batch
方法一样进行分配。它不会就地修改数据集。
推荐阅读
- mysql - 可以在内部联接或左联接中更新 MySQL 查询
- laravel - TypeError:从 Laravel 验证接收错误时无法读取未定义的属性“状态”
- javascript - React Native 广告 (Adcolony) - 世博会
- python - Matplotlibcpp - 导入 Python 模块的问题
- python - Python:在图像上绘制两个区域
- android - 当应用程序不在后台时没有得到大图标
- java - 将 POST 从 api 转发到另一个时出现错误代码 415
- windows - 如何使用 launch.json 定位平台
- node.js - 从一个容器 NodeJs 调用 nmap
- dart - 为什么集合不包含点