Значения CsvDataset Tensorflow Access
Стремительное исполнение
Я копался в API в течение 2 дней и, похоже, не могу найти способ использовать данные из CsvDataset
объект.
У меня есть следующий образец из набора данных:
70,1,4,130,322,0,2,109,0,24,2,3,3,2
67,0,3,115,564,0,2,160,0,16,2,0,7,1
57,1,2,124,261,0,0,141,0,3,1,0,7,2
64,1,4,128,263,0,0,105,1,2,2,1,7,1
74,0,2,120,269,0,2,121,1,2,1,1,3,1
65,1,4,120,177,0,0,140,0,4,1,0,7,1
56,1,3,130,256,1,2,142,1,6,2,1,6,2
59,1,4,110,239,0,2,142,1,12,2,1,7,2
60,1,4,140,293,0,2,170,0,12,2,2,7,2
63,0,4,150,407,0,2,154,0,4,2,3,7,2
Я прочитал CSV, как сказано в их видео API высокого уровня:
tf.enable_eager_execution()
defaults = [tf.float64] * 14
dataset=tf.data.experimental.CsvDataset(path, defaults)
>>> dataset
>>> <CsvDataset shapes: ((), (), (), (), (), (), (), (), (), (), (), (), (), ()), types: (tf.float64, tf.float64, tf.float64, tf.float64, tf.float64, tf.float64, tf.float64, tf.float64, tf.float64, tf.float64, tf.float64, tf.float64, tf.float64, tf.float64)>
Но с этого момента я не могу получить доступ к любым данным, таким как получение значений столбца.
Преобразование набора данных в список с помощью: list(dataset)
это не вариант, так как это занимает очень много времени с CSV нормального размера (~190 тыс. выборок).
Итак, есть ли способ получить значения столбца или строки из этого объекта? Или нет смысла использовать TF для чтения данных вместо использования scikit/pandas?
Редактировать 1: пробовал делать col1 = dataset.map(lambda *row: row[0])
как сказал @kvish, это возврат <MapDataset shapes: (), types: tf.float64>
который повторяется. Проблема заключается в том, что приходится перебирать каждый столбец, а затем перебирать каждый MapDataset
сделает сложность O(n^2)
,
Результатом идеи будет список тензоров, каждый из которых содержит все значения из столбца, аналогично следующему:
[<tf.Tensor(shape=(10,), dtype=float64,
numpy=array([70.0,67.0,57.0,64.0,74.0,65.0,56.0,59.0,60.0,63.0]))>,
(...) x14]
1 ответ
Итак, с помощью @kvish я смог найти исчерпывающее решение. Количество строк и столбцов должно быть известно заранее в этом решении.
col_list = []
append = col_list.append
to_tensor = tf.convert_to_tensor
for i in range(0,cols):
col = dataset.map(lambda *row: row[i])
col = to_tensor(*col.batch(rows))
append(col)
Это выведет желаемое:
>>> col_list
[<tf.Tensor: id=256, shape=(10,), dtype=float64, numpy=array([70., 67., 57., 64.,
74., 65., 56., 59., 60., 63.])>, <tf.Tensor: id=282, shape=(10,), dtype=float64,
numpy=array([1., 0., 1., 1., 0., 1., 1., 1., 1., 0.])>, <tf.Tensor: id=308, shape=
(10,), dtype=float64, numpy=array([4., 3., 2., 4., 2., 4., 3., 4., 4., 4.])>,
<tf.Tensor: id=334, shape=(10,), dtype=float64, numpy=array([130., 115., 124., 128.,
120., 120., 130., 110., 140., 150.])>, <tf.Tensor: id=360, shape=(10,),
dtype=float64, numpy=array([322., 564., 261., 263., 269., 177., 256., 239., 293.,
407.])>, <tf.Tensor: id=386, shape=(10,), dtype=float64, numpy=array([0., 0., 0., 0.,
0., 0., 1., 0., 0., 0.])>, <tf.Tensor: id=412, shape=(10,), dtype=float64,
numpy=array([2., 2., 0., 0., 2., 0., 2., 2., 2., 2.])>, <tf.Tensor: id=438, shape=
(10,), dtype=float64, numpy=array([109., 160., 141., 105., 121., 140., 142., 142.,
170., 154.])>, <tf.Tensor: id=464, shape=(10,), dtype=float64, numpy=array([0., 0.,
0., 1., 1., 0., 1., 1., 0., 0.])>, <tf.Tensor: id=490, shape=(10,), dtype=float64,
numpy=array([24., 16., 3., 2., 2., 4., 6., 12., 12., 4.])>, <tf.Tensor: id=516,
shape=(10,), dtype=float64, numpy=array([2., 2., 1., 2., 1., 1., 2., 2., 2., 2.])>,
<tf.Tensor: id=542, shape=(10,), dtype=float64, numpy=array([3., 0., 0., 1., 1., 0.,
1., 1., 2., 3.])>, <tf.Tensor: id=568, shape=(10,), dtype=float64, numpy=array([3.,
7., 7., 7., 3., 7., 6., 7., 7., 7.])>, <tf.Tensor: id=594, shape=(10,),
dtype=float64, numpy=array([2., 1., 2., 1., 1., 1., 2., 2., 2., 2.])>]