Есть ли способ для Keras читать наборы данных TFRecord без дополнительных мер обработки данных? - PullRequest
1 голос
/ 27 октября 2019

Я учусь в старшей школе и пытаюсь изучить основы TensorFlow. В настоящее время я создаю модель с входными файлами TFRecords, типом файла набора данных по умолчанию из TensorFlow, которые были сжаты из исходных необработанных данных. В настоящее время я использую запутанный способ разбора данных в массивы для Кераса, чтобы интерпретировать их. Хотя Keras является частью TF, он должен легко читать наборы данных TFRecord. Есть ли другой способ для Keras понять файлы TFRecord?

Я использую метод _decodeExampleHelper для подготовки данных к обучению.

def _decodeExampleHelper(example) :
  dataDictionary = {
    'xValues' : tf.io.FixedLenFeature([7], tf.float32),
    'yValues' : tf.io.FixedLenFeature([3], tf.float32)
  }
  # Parse the input tf.Example proto using the data dictionary
  example = tf.io.parse_single_example(example, dataDictionary)
  xValues = example['xValues']
  yValues = example['yValues']
  # The Keras Sequential network will have "dense" as the name of the first layer; dense_input is the input to this layer
  return dict(zip(['dense_input'], [xValues])), yValues

data = tf.data.TFRecordDataset(workingDirectory + 'training.tfrecords')

parsedData = data.map(_decodeExampleHelper)

Мы видим, что parsedData имеет правильныеразмеры в следующем кодовом блоке.

tmp = next(iter(parsedData))
print(tmp)

Выводит первый набор данных с правильными размерами, которые Keras должен иметь возможность интерпретировать.

({'dense_input': <tf.Tensor: id=273, shape=(7,), dtype=float32, numpy=
array([-0.6065675 , -0.610906  , -0.65771157, -0.41417238,  0.89691925,
        0.7122903 ,  0.27881026], dtype=float32)>}, <tf.Tensor: id=274, shape=(3,), dtype=float32, numpy=array([ 0.        , -0.65868723, -0.27960175], dtype=float32)>)

Вот очень простая модельтолько с двумя слоями и обучите его с данными, которые я только что проанализировал.

model = tf.keras.models.Sequential(
    [
      tf.keras.layers.Dense(20, activation = 'relu', input_shape = (7,)),
      tf.keras.layers.Dense(3, activation = 'linear'),
    ]
)

model.compile(optimizer = 'adam', loss = 'mean_absolute_error', metrics = ['accuracy'])

model.fit(parsedData, epochs = 1)

Строка model.fit(parsedData, epochs = 1) дает ошибку ValueError: Error when checking input: expected dense_input to have shape (7,) but got array with shape (1,), несмотря на то, что dens_input равен 7.

Какая проблема можетбыть в этом случае? Почему Keras не может правильно интерпретировать тензоры из файла?

...