Как я могу изменить набор данных TFRecord для обучения модели RNN?

#python #tensorflow #machine-learning #keras #recurrent-neural-network

#python #тензорный поток #машинное обучение #keras #рекуррентная нейронная сеть

Вопрос:

Я пытаюсь снабдить модель RNN .tfrecords наборами данных (обучить, протестировать), чтобы обучить ее. Но я получаю сообщение об ошибке размера input0.
Я думаю train_data , что хочет изменить размер до 4 dims, но я не уверен.


Приведенная ниже функция возвращает наборы данных из .tfrecords с функциями и одной меткой с горячим кодированием.

 def get_dataset(directory, num_classes=60, batch_size=32, drop_remainder=False,
                shuffle=False, shuffle_size=1000):
    # dictionary describing the features.
    feature_description = {
        'features': tf.io.FixedLenFeature([], tf.string),
        'label': tf.io.FixedLenFeature([], tf.int64)
    }

    # parse each proto and, the features within
    def _parse_feature_function(example_proto):
        features = tf.io.parse_single_example(example_proto, feature_description)
        data = tf.io.parse_tensor(features['features'], tf.float32)
        label = tf.one_hot(features['label'], num_classes)
        data = tf.reshape(data, (3, 300, 25, 2))
        return data, label

    records = [os.path.join(directory, file) for file in os.listdir(directory) if file.endswith("tfrecord")]
    dataset = tf.data.TFRecordDataset(records, num_parallel_reads=len(records))
    dataset = dataset.map(_parse_feature_function)
    dataset = dataset.batch(batch_size, drop_remainder=drop_remainder)
    dataset = dataset.prefetch(batch_size)
    if shuffle:
        dataset = dataset.shuffle(shuffle_size)
    return dataset

if __name__ == "__main__":
    train_data = get_dataset('/TfRecords/xsub/')
    test_data = get_dataset('/TfRecords/xview/')
    print(train_data)

   # create LSTM
    verbose, epochs, batch_size = 1, 100, 32
    n_features=60
    n_length = 32
    model = Sequential()
    model.add(
        TimeDistributed(Conv1D(filters=64, kernel_size=3, activation='relu'), input_shape=(None, n_length, n_features)))
    model.add(TimeDistributed(Conv1D(filters=64, kernel_size=3, activation='relu')))
    model.add(TimeDistributed(Dropout(0.5)))
    model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
    model.add(TimeDistributed(Flatten()))
    model.add(LSTM(100))
    model.add(Dropout(0.5))
    model.add(Dense(100, activation='relu'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    model.summary()
    history = model.fit(train_data, epochs=epochs, batch_size=batch_size, verbose=verbose,
                        validation_data=test_data)
  

Отображаемая ошибка:

Ошибка значения: ввод 0 последовательного уровня несовместим со слоем: ожидаемый ndim = 4, найденный ndim = 5. Получена полная форма: [Нет, 3, 300, 25, 2]

Комментарии:

1. Не могли бы вы предоставить тестовые и обучающие формы данных?

2. Слой Tensorflow Timedistruted_Conv1D ожидает ввода формы 4D. Измените форму ввода соответствующим образом. Или используйте TimeDistributed_Conv2D layer. TimeDistributed(Conv1D) слой ожидает ввода формы 5D. Для получения дополнительной информации прочитайте эту ссылку . Спасибо!