Skip to main content
 首页 » 编程设计

python之Tensorflow csv 数据集使用

2024年09月07日26lautakyan007

我有一个具有以下格式和数据的 csv 文件:

ID  nr1 nr2 nr3 nr4 nr5 next_nr 
1   1   2   3   4   5   6 
2   2   3   4   5   6   7 
3   3   4   5   6   7   8 
4   4   5   6   7   8   9 
5   5   6   7   8   9   10 
6   6   7   8   9   10  11 
7   7   8   9   10  11  12 
8   8   9   10  11  12  13 
9   9   10  11  12  13  14 
10  10  11  12  13  14  15 

所以,有 10 行包括我的火车数据。我想使用 tf.contrib.data.CsvDataset 来读取数据。这是阅读它的示例代码:

import tensorflow as tf 
import numpy as np 
 
ITERATOR_BATCH_SIZE = 2 
NR_EPOCHS = 3 
 
train1_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) 

当我运行这段代码时,我希望输出在每批中包含 2 行数据。但是我得到的数据看起来很奇怪。这是第一个时期的输出:

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 参数才能使其正常工作。