Я создал модель, которая принимает форму (Нет, 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)