Как эффективно использовать tf.data.Dataset, сделанный из упорядоченного словаря?

При использовании TensorFlow 2.3.1 приведенный ниже фрагмент кода не работает.

import tensorflow as tf

url = "https://storage.googleapis.com/download.tensorflow.org/data/creditcard.zip"

tf.keras.utils.get_file(
    origin=url,
    fname='creditcard.zip',
    cache_dir = "/tmp/datasets/",
    extract=True)

ds = tf.data.experimental.make_csv_dataset(
    "/tmp/datasets/*.csv",
    batch_size=2048,
    label_name = "Class",
    select_columns=["V1","V2","Class"],
    num_rows_for_inference=None,
    shuffle_buffer_size=600,
    ignore_errors=True)

model = tf.keras.Sequential(
    [
        tf.keras.layers.Dense(256, activation = "relu"),
        tf.keras.layers.Dense(1, activation = "sigmoid", name = "labeling"),
    ],
)

model.compile(
    optimizer=tf.keras.optimizers.Adam(1e-2),
    loss = "binary_crossentropy", 
)

model.fit(
    ds,
    steps_per_epoch=5,
    epochs=3,
)

Стек ошибок

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-c79f80f9d0fd> in <module>
----> 1 model.fit(
      2     ds,
      3     steps_per_epoch=5,
      4     epochs=3,
      5 )

[...]

    ValueError: Layer sequential expects 1 inputs, but it received 2 input tensors. Inputs received: [<tf.Tensor 'ExpandDims:0' shape=(2048, 1) dtype=float32>, <tf.Tensor 'ExpandDims_1:0' shape=(2048, 1) dtype=float32>]

Решение, которое я использую до сих пор,

def workaround(features, labels):
    return (tf.stack(list(features.values()), axis=1), labels)

model.fit(
    ds.map(workaround),
    steps_per_epoch=5,
    epochs=3,
)

Мои вопросы к вам гуру ТФ:

  • Я правильно делаю или есть лучшее решение?
  • С точки зрения производительности, жизнеспособно ли это решение для набора данных, который не помещается в память?
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
0
0
748
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, что ваш код может соответствовать данным в memoey или нет.

Если нет, вы можете изменить свой код следующим образом:

import tensorflow as tf

url = "https://storage.googleapis.com/download.tensorflow.org/data/creditcard.zip"
ds = tf.data.experimental.make_csv_dataset(
    "/tmp/datasets/*.csv",
    batch_size=2048,
    label_name = "Class",
    select_columns=["V1","V2","Class"],
    num_rows_for_inference=None,
    ignore_errors=True,
    num_epochs = 1,
    shuffle_buffer_size=2048*1000, 
    prefetch_buffer_size=tf.data.experimental.AUTOTUNE
)

input_list = []
for column in ["V1", "V2"]:
    _input = tf.keras.Input(shape=(1,))
    input_list.append(_input)

concat = tf.keras.layers.Concatenate(name = "concat")(input_list)
dense = tf.keras.layers.Dense(256, activation = "relu", name = "dense", dtype='float64' )(concat)
output_dense = tf.keras.layers.Dense(1, activation = "sigmoid", name = "labeling", dtype='float64')(dense)
model = tf.keras.Model(inputs=input_list, outputs=output_dense)

model.compile(
    optimizer=tf.keras.optimizers.Adam(1e-2),
    loss = "binary_crossentropy", 
)

model.fit(
    ds,
    steps_per_epoch=5,
    epochs=10,
)

Я отредактировал ваш ответ и исправил код, чтобы он работал. Спасибо. Когда я помещаю весь этот, но довольно маленький набор данных (~ 250 000 строк / 30 столбцов), я получаю ту же среднюю продолжительность на шаг — 110 мс на шаг. Не уверен, что такой тест на одной машине имеет смысл. Основываясь на ограниченных знаниях, которые у меня есть, я бы предпочел ваше решение, потому что оно более понятно и удобно в обслуживании. tf.concat звучит более хакерски для меня. Любая дополнительная идея/комментарий будет приветствоваться.

François Kawala 11.12.2020 13:12

Другие вопросы по теме