我有一个csv文件,格式和数据如下:
ID nr1 nr2 nr3 nr4 nr5 next_nr1 1 2 3 4 5 62 2 3 4 5 6 73 3 4 5 6 7 84 4 5 6 7 8 95 5 6 7 8 9 106 6 7 8 9 10 117 7 8 9 10 11 128 8 9 10 11 12 139 9 10 11 12 13 1410 10 11 12 13 14 15
因此,我的训练数据包含10行。我想使用tf.contrib.data.CsvDataset来读取这些数据。以下是读取数据的示例代码:
import tensorflow as tfimport numpy as npITERATOR_BATCH_SIZE = 2NR_EPOCHS = 3train1_path = 'train1_short.csv'dataset = tf.contrib.data.CsvDataset(train1_path, [tf.float32, tf.float32, tf.float32, tf.float32, tf.float32, tf.float32, tf.float32], header=True)dataset = dataset.batch(ITERATOR_BATCH_SIZE)with tf.Session() as sess: for i in range (NR_EPOCHS): print('\nepoch: ', i) iterator = dataset.make_one_shot_iterator() next_element = iterator.get_next() while True: try: data_and_target = sess.run([next_element]) except tf.errors.OutOfRangeError: break print("\n\n", data_and_target)
当我运行这段代码时,我希望每个批次包含两行数据。但我得到的数据看起来很奇怪。这是第一个epoch的输出:
epoch: 0 [(array([1., 2.], dtype=float32), array([1., 2.], dtype=float32), array([2., 3.], dtype=float32), array([3., 4.], dtype=float32), array([4., 5.], dtype=float32), array([5., 6.], dtype=float32), array([6., 7.], dtype=float32))] [(array([3., 4.], dtype=float32), array([3., 4.], dtype=float32), array([4., 5.], dtype=float32), array([5., 6.], dtype=float32), array([6., 7.], dtype=float32), array([7., 8.], dtype=float32), array([8., 9.], dtype=float32))] [(array([5., 6.], dtype=float32), array([5., 6.], dtype=float32), array([6., 7.], dtype=float32), array([7., 8.], dtype=float32), array([8., 9.], dtype=float32), array([ 9., 10.], dtype=float32), array([10., 11.], dtype=float32))] [(array([7., 8.], dtype=float32), array([7., 8.], dtype=float32), array([8., 9.], dtype=float32), array([ 9., 10.], dtype=float32), array([10., 11.], dtype=float32), array([11., 12.], dtype=float32), array([12., 13.], dtype=float32))] [(array([ 9., 10.], dtype=float32), array([ 9., 10.], dtype=float32), array([10., 11.], dtype=float32), array([11., 12.], dtype=float32), array([12., 13.], dtype=float32), array([13., 14.], dtype=float32), array([14., 15.], dtype=float32))]
相反,我期望第一个批次看起来像这样:
[(array([1., 1., 2., 3., 4., 5., 6], dtype=float32), array([2., 2., 3., 4., 5., 6., 7.], dtype=float32)]
这个问题可能非常简单,但我就是看不出为什么会这样。或许在这个领域更有经验的人能立刻看出问题所在。
回答:
CsvDatset
的每条记录必须转换为张量。请尝试以下代码,看是否能解决你的问题:
dataset = tf.contrib.data.CsvDataset(train1_path, [tf.float32, tf.float32, tf.float32, tf.float32, tf.float32, tf.float32, tf.float32], header=True, field_delim=' ')dataset = dataset.map(lambda *x: tf.convert_to_tensor(x))dataset = dataset.batch(ITERATOR_BATCH_SIZE)with tf.Session() as sess: for i in range (NR_EPOCHS): print('\nepoch: ', i) iterator = dataset.make_one_shot_iterator() next_element = iterator.get_next() while True: try: data_and_target = sess.run(next_element) except tf.errors.OutOfRangeError: break print("\n\n", data_and_target)
在我的测试中,我必须设置field_delim
参数才能使其正常工作。