Объедините функцию и метки, чтобы правильно создать набор данных tf для model.fit (с использованием tf.data.Dataset.from_tensor_slices) - PullRequest
0 голосов
/ 13 июля 2020

Я создал модель, которая принимает форму (Нет, 512). Ниже приводится сводка моей модели

введите описание изображения здесь

форма обучающей функции

train_ids.shape
(10, 512)

форма переменной обучающей реакции

indus_cat_train.shape
(10, 49)

Моя модель работает отлично, если я использую

history = model.fit(
    train_ids, indus_cat_train, epochs=2, validation_data=(
        valid_ids, indus_cat_valid))

Однако мой фактический набор данных очень велик, и одновременная подача всего завершенного набора данных потребляет так много оперативной памяти и завершает весь процесс.

Я хочу загружать все данные партиями или один за другим. Чтобы выполнить эту задачу, я попробовал функцию tf.data.Dataset.from_tensor_slices

# training data
tf_train_data = tf.data.Dataset.from_tensor_slices((train_ids, indus_cat_train))

# validation data
tf_valid_data = tf.data.Dataset.from_tensor_slices((valid_ids, indus_cat_valid))

Приведенный выше код работает нормально, и при проверке он дает желаемую форму

for elem in t:
    print(elem[0].shape) # for features
    print(elem[1].shape) # for response
print output
    (512,) # for features
    (49,)  # for response variable
# terminating all other output to save space

Однако при вызове model.fit на tf_train_dataset модель выдает ошибку

bert_history = model.fit(
    tf_train_data, epochs=2, validation_data=tf_valid_data)

ПРЕДУПРЕЖДЕНИЕ: tensorflow: Модель была построена с формой (None, 512 ) для входного тензора ("input_ids_1: ​​0", shape = (None, 512), dtype = int32), но он был вызван на входе с несовместимой формой (512, 1).

Совместное использование код модели для дальнейшего понимания по запросу Prateek
# training data

tf_train_data = tf.data.Dataset.from_tensor_slices((train_ids, indus_cat_train))

# validation data

tf_valid_data = tf.data.Dataset.from_tensor_slices((valid_ids, indus_cat_valid))





# model downloaded from bert

bert_model_name = "uncased_L-12_H-768_A-12"

bert_ckpt_dir = "bert_model"

bert_ckpt_file = os.path.join(bert_ckpt_dir, "bert_model.ckpt")

bert_config_file = os.path.join(bert_ckpt_dir, "bert_config.json")



# creating tokenizer

tokenizer = FullTokenizer(vocab_file=os.path.join(bert_ckpt_dir, "vocab.txt"))



# create function for model

def create_model(max_seq_len, bert_ckpt_file, n_classes):

    with tf.io.gfile.GFile(bert_config_file, "r") as reader:

        # get bert configurations

        bert_configurations = StockBertConfig.from_json_string(reader.read())

        bert_params = map_stock_config_to_params(bert_configurations)

        bert_params_adapter_size = None

        bert = BertModelLayer.from_params(bert_params, name="bert")



    input_ids = keras.layers.Input(shape=(max_seq_len,), dtype="int32",

                                   name="input_ids")



    bert_output = bert(input_ids)

    print("bert shape", bert_output.shape)



    cls_out = keras.layers.Lambda(lambda seq: seq[:, 0, :])(bert_output)

    cls_out = keras.layers.Dropout(0.5)(cls_out)

    logits = keras.layers.Dense(units=765, activation="tanh")(cls_out)

    logits = keras.layers.Dropout(0.5)(logits)

    logits = keras.layers.Dense(

        units=n_classes, activation="softmax")(logits)



    model = keras.Model(inputs=input_ids, outputs=logits)

    model.build(input_shape=(None, max_seq_len))

    load_stock_weights(bert, bert_ckpt_file)

    return model





n_cats = 49 #number of output categories

model = create_model(max_seq_len=512, bert_ckpt_file=bert_ckpt_file,

                     n_classes=n_cats)



model.summary()

optimizer = tf.keras.optimizers.Adam(    learning_rate=learning_rate, epsilon=1e-08)



loss = tf.keras.losses.CategoricalCrossentropy()metric = tf.keras.metrics.CategoricalCrossentropy(    name='categorical_crossentropy')model.compile(optimizer=optimizer, loss=loss, metrics=[metric])



bert_history = model.fit( tf_train_data, epochs=2, validation_data=tf_valid_data)

1 Ответ

0 голосов
/ 13 июля 2020

Я решил это с помощью dataset.batch. В tf.data.Dataset отсутствовали аргументы размера пакета, в результате чего предоставленные тензоры не пакетировались, т.е. я получал форму (512,1) вместо (512,) и (49,1) вместо (49,)

batch_size = 2
tf_train_data = tf.data.Dataset.from_tensor_slices((train_ids,
                                                    indus_cat_train)).batch(batch_size)
tf_valid_data = tf.data.Dataset.from_tensor_slices((valid_ids,
                                                    indus_cat_valid)).batch(batch_size)

bert_history = model.fit(
    tf_train_data, epochs=2, validation_data=tf_valid_data)
...