tensorflow - 微调 Bert 模型中的 fit() 函数错误
问题描述
我使用 TFBertModel 进行文本相似性任务,2 个月前工作的代码现在出现错误并且无法正常工作,可能是因为 colab 库的版本随着时间的推移而变化。他给出的错误是针对 Bert,他说使用了 keras.tensor 而不是 tf.tensor。我使用了这个命令:
tf.compat.v1.disable_eager_execution()
来解决这个问题。问题已解决,但现在它给 fit() 函数提供了此错误:
ValueError: Variable <tf.Variable 'tf_bert_model/bert/pooler/dense/kernel:0' shape=(768, 768) dtype=float32> hasNone
为渐变。请确保您的所有操作都定义了渐变(即可微分)。没有梯度的常见操作:K.argmax、K.round、K.eval。
我该如何解决这个错误?
tf.compat.v1.disable_eager_execution()
bert = TFBertModel.from_pretrained('bert-base-multilingual-cased')
input_ids_1 = keras.layers.Input(shape=(300,), name='input_ids_1', dtype=tf.int32)
input_masks_ids_1 = keras.layers.Input(shape=(300,), name='masked_token_1', dtype=tf.int32)
input_token_ids_1 = keras.layers.Input(shape=(300,), name='token_ids_1', dtype=tf.int32)
bert_1 = bert(input_ids_1, input_masks_ids_1,input_token_ids_1 )
bert_1 = bert_1[0]
bert_1=keras.layers.Dropout(0.2)(bert_1)
bert_1 = keras.layers.GlobalAveragePooling1D()(bert_1)
input_ids_2 = keras.layers.Input(shape=(300,), name='input_ids_2', dtype='int32')
input_masks_ids_2 = keras.layers.Input(shape=(300,), name='masked_token_2', dtype='int32')
input_token_ids_2 = keras.layers.Input(shape=(300,), name='token_ids_2', dtype='int32')
bert_2 = bert(input_ids_2,input_masks_ids_2,input_token_ids_2)
bert_2 = bert_2[0]
bert_2=keras.layers.Dropout(0.2)(bert_2)
bert_2 = keras.layers.GlobalAveragePooling1D()(bert_2)
concat=keras.layers.concatenate([bert_1,bert_2])
dense = keras.layers.Dense(256,activation='relu')(concat)
classifier = keras.layers.Dense(1,activation='sigmoid')(dense)
model = keras.Model(inputs=[[input_ids_1,input_masks_ids_1,input_token_ids_1,input_ids_2,input_masks_ids_2,input_token_ids_2]], outputs=classifier)
model.summary()
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-5)
loss = tf.keras.losses.mse
metric = tf.keras.metrics.mae
model.compile(optimizer=optimizer, loss=loss, metrics=[metric])
model_fit = model.fit([x_train_1[0],x_train_1[1],x_train_1[2],x_train_2[0],x_train_2[1],x_train_2[2]], y_train_1, batch_size=8, epochs=1,validation_data=([x_val_1[0],x_val_1[1],x_val_1[2],x_val_2[0],x_val_2[1],x_val_2[2]], y_val_1))
解决方案
推荐阅读
- php - 如何在教义中生成二传手?
- python - 无论如何要在python中从数组本身中删除引号?
- php - 订单过滤 - PrestaShop API
- java - JAVA 中的元素顺序(导入 javax.xml.*)
- jenkins - 为数组中的字符串添加双引号
- python - Pandas ImportError:当我尝试读取 .csv 文件时无法导入名称“OrderedDict”
- python - Pandas:将平均值分配给一个类别
- sql - 如何获取 SQL 数据正常的第一行
- node.js - 无法读取未定义的属性,但可以将其记录到控制台
- javascript - Three.JS中使用switch语句加载多个对象