Погрешность измерения при подаче керас с набором данных Tensorflow - PullRequest
0 голосов
/ 24 января 2019

У меня есть файл TFRecords, содержащий 60 примеров шести значений полосы Landsat для некоторых пикселей плюс метку для каждого пикселя, и я хочу обучить его с помощью классификатора Keras. Но я получаю несоответствие размеров при попытке загрузить данные из сети.

Файл TFRecords генерируется со следующей структурой:

# TFRecords file contains below features per each example
bands = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7','landcover']
columns = [tf.FixedLenFeature(shape=[1], dtype=tf.float32) for k in bands]
featuresDict = dict(zip(bands, columns))

И мой код для определения функции генератора и модели Keras выглядит следующим образом:

def tfdata_generator_training(fileName, batchSize=None):

  dataset = tf.data.TFRecordDataset(fileName, compression_type='GZIP')

  def parse_tfrecord(example):
      features = tf.parse_single_example(example, featuresDict)
      # Extract landcover and remove it from dictionary
      labels = features.pop('landcover')    
      labels = tf.one_hot(tf.cast(labels, tf.uint8), 3)
      # Return list of dictionary values (to be convertable to numpy array for Keras) and pixel label in one-hot format
      return list(features.values()), labels    

  # Map the parsing function over the dataset
  dataset = dataset.map(parse_tfrecord)
  dataset = dataset.batch(batchSize)
  return dataset

training_data = tfdata_generator_training(fileName=<my_file_path>, batchSize=1)

def keras_model():
    from tensorflow.keras.layers import Dense, Input

    inputs = Input(shape=(6,1))
    x = Dense(5, activation='relu')(inputs)
    x = Dense(7, activation='relu')(x)
    outputs = Dense(3, activation='softmax')(x)

    return tf.keras.Model(inputs, outputs)

model = keras_model()
model.compile('adam', 'categorical_crossentropy', metrics=['acc'])
model.fit(training_data.make_one_shot_iterator(), steps_per_epoch=60, epochs=8)

Но я получаю ошибку ниже при запуске кода:

ValueError: Error when checking target: expected dense_2 to have shape (6, 3) but got array with shape (1, 3)

В чем проблема с моим кодом? Я также попытался получить размеры входного слоя, и распечатка Tensorflow была следующей:

(<tf.Tensor 'IteratorGetNext:0' shape=(?, 6, 1) dtype=float32>, <tf.Tensor 'IteratorGetNext:1' shape=(?, 1, 3) dtype=float32>)
...