Использование TFRecords с керасом - PullRequest
0 голосов
/ 30 января 2019

Я преобразовал базу данных изображений в две TFRecords, одну для обучения, а другую для проверки.Я хочу обучить простую модель с использованием керас, используя эти два файла для ввода данных, но я получаю ошибку, которую я не могу понять, связанную с формой данных.

Вот код (переменные с заглавными буквамиопределено в другом месте):

def _parse_function(proto):
    f = {
        "x": tf.FixedLenSequenceFeature([IMG_SIZE[0] * IMG_SIZE[1]], tf.float32, default_value=0., allow_missing=True),
        "label": tf.FixedLenSequenceFeature([1], tf.int64, default_value=0, allow_missing=True)
    }
    parsed_features = tf.parse_single_example(proto, f)

    x = tf.reshape(parsed_features['x'] / 255, (IMG_SIZE[0], IMG_SIZE[1], 1))
    y = tf.cast(parsed_features['label'], tf.float32)
    return x, y

def load_dataset(input_path, batch_size, shuffle_buffer):
    dataset = tf.data.TFRecordDataset(input_path)
    dataset = dataset.shuffle(shuffle_buffer).repeat()  # shuffle and repeat
    dataset = dataset.map(_parse_function, num_parallel_calls=16)
    dataset = dataset.batch(batch_size).prefetch(1)  # batch and prefetch

    return dataset.make_one_shot_iterator()

train_iterator = load_dataset(TRAIN_TFRECORDS, BATCH_SIZE, SHUFFLE_BUFFER)
val_iterator = load_dataset(VALIDATION_TFRECORDS, BATCH_SIZE, SHUFFLE_BUFFER)

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(IMG_SIZE[0], IMG_SIZE[1], 1)))
model.add(tf.keras.layers.Dense(1, 'sigmoid'))

model.compile(
    optimizer=tf.train.AdamOptimizer(),
    loss='binary_crossentropy',
    metrics=['accuracy']
)

model.fit(
    train_iterator,
    epochs=N_EPOCHS,
    steps_per_epoch=N_TRAIN // BATCH_SIZE,
    validation_data=val_iterator,
    validation_steps=N_VALIDATION // BATCH_SIZE

)

И вот ошибка, которую я получаю:

tensorflow.python.framework.errors_impl.InvalidArgumentError: data[0].shape = [3] does not start with indices[0].shape = [2]
     [[Node: training/TFOptimizer/gradients/loss/dense_loss/Mean_grad/DynamicStitch = DynamicStitch[N=2, T=DT_INT32, _class=["loc:@training/TFOptimizer/gradients/loss/dense_loss/Mean_grad/floordiv"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](training/TFOptimizer/gradients/loss/dense_loss/Mean_grad/range, training/TFOptimizer/gradients/loss/dense_loss/Mean_3_grad/Maximum, training/TFOptimizer/gradients/loss/dense_loss/Mean_grad/Shape/_35, training/TFOptimizer/gradients/loss/dense_loss/Mean_3_grad/Maximum/_41)]]

(я знаю, что определенная здесь модель не является хорошей моделью для анализа изображений, я просто взялпростейшая возможная архитектура, которая воспроизводит ошибку)

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Изменить:

"label": tf.FixedLenSequenceFeature([1]...

на:

"label": tf.FixedLenSequenceFeature([]...

К сожалению, это не объяснено в документации на сайте, но некоторые объяснения можно найти встрока документации FixedLenSequenceFeature на github.По сути, если ваши данные состоят из одного измерения (+ пакетного измерения), вам не нужно его указывать.

0 голосов
/ 30 января 2019

Вы забыли эту строку из примера :

parsed_features = tf.parse_single_example(proto, f)

Добавьте его к _parse_function.

Также вы можете вернуть только dataset объект.Keras поддерживает итераторы, а также экземпляры tf.data.Dataset.Кроме того, выглядит немного странно сначала перемешать и повторить, а затем проанализировать примеры.Вот пример кода, который работает для меня:

def dataset(filenames, batch_size, img_height, img_width, is_training=False):
    decoder = TfExampleDecoder()

    def preprocess(image, boxes, classes):
            image = preprocess_image(image, resize_height=img_height, resize_width=img_width)
        return image, groundtruth

    ds = tf.data.TFRecordDataset(filenames)
    ds = ds.map(decoder.decode, num_parallel_calls=8)
    if is_training:
        ds = ds.shuffle(1000 + 3 * batch_size)
    ds = ds.apply(tf.contrib.data.map_and_batch(map_func=preprocess, batch_size=batch_size, num_parallel_calls=8))
    ds = ds.repeat()
    ds = ds.prefetch(buffer_size=batch_size)
    return ds


train_dataset = dataset(args.train_data, args.batch_size,
                        args.img_height, args.img_width,
                        is_training=True)


model.fit(train_dataset,
          steps_per_epoch=args.steps_per_epoch,
          epochs=args.max_epochs,
          callbacks=callbacks,
          initial_epoch=0)

Это похоже на проблему с вашими данными или конвейером предварительной обработки, а не с Keras.Попробуйте проверить, что вы получаете из набора данных с помощью кода отладки, например:

ds = dataset(args.data, args.img_height, args.img_width, is_training=True)

image_t, classes_t = ds.make_one_shot_iterator().get_next()

with tf.Session() as sess:
    while True:
        image, classes = sess.run([image_t, classes_t])
        # Do something with the data: display, log etc.
...