在 Tensorflow Keras 中自定义 model.fit() - TypeError: TypeError: compile() 得到了一个意外的关键字参数'optimizer'



我正在尝试通过在 Keras 中修改 model.fit(( 来实现我自己的重量训练算法。我已经阅读了Keras的这篇文章,它基于GANs很好地解释了它。但是,我目前面临的问题如下:

我遵循了与本文中解释的完全相同的步骤和过程,但我用我自己的算法替换了他们的训练算法。我得到的错误是

TypeError: compile() got an unexpected keyword argument 'optimizer'

我创建的模型使用 Tensorflow 1.15。另外,我使用来自Tensorflow集线器的ELMO嵌入层,需要Tensorflow 1.15(因为它还不支持V2+(

def Predictor():
input_sentence = Input(shape=(250,), dtype=tf.int32)
embedding = ELMoEmbedding(index_word=index_word, trainable=False)(input_sentence)
lstm = LSTM(1024)(embedding)
dense = Dense(64, activation='relu')(lstm)
pred = Dense(5, activation='softmax')(dense)
model = Model(inputs=[input_sentence], outputs=pred)
return model
def Adversary():
input_features = Input((1,))
dense1 = Dense(64, activation='relu')(input_features)
pred = Dense(5, activation='sigmoid')(dense1)
model = Model(inputs=[input_features], outputs=[pred])
return model
class Mitigator(Model):
def __init__(self, predictor, adversary, debias_param):
super(Mitigator, self).__init__()
self.predictor = predictor
self.adversary = adversary
self.debias_param = debias_param
def compile(self, a_optimizer, p_optimizer, a_loss, p_loss):
super(Mitigator, self).compile()
self.a_optimizer = a_optimizer
self.p_optimizer = p_optimizer
self.a_loss = a_loss
self.p_loss = p_loss
def train_step(self, data):
# Pass tf.data.Dataset element based on numpy arrays
x, train_y, z_true = data
# Generate prediction and compute loss for train_step
y_pred = self.predictor(x)
pred_loss = self.p_loss(train_y, y_pred)
# Input data for Adversary
adv_x = tf.concat([y_pred, train_y], axis=1)
# Train Adversary
z_pred = self.adversary(adv_x)
adv_loss = self.a_loss(z_true, z_pred)
adv_grad = {v: g for (g, v) in self.a_optimizer.compute_gradients(adv_loss)}
adv_min = self.a_optimizer.minimize(adv_loss, var_list=self.adversary.trainable_weights)
# Train Predictor
pred_grad = []
for (g, v) in self.p_optimizer.compute_gradients(pred_loss):
unit_adv = tf_normalize(adv_grad[v])
g -= tf.math.reduce_sum(g * unit_adv) * unit_adv
g -= self.debias_param * adv_grad[v]
pred_grad.append((g, v))
pred_min = self.p_optimizer.apply_gradients(pred_grad)
return {"pred_loss": pred_loss, "adv_loss": adv_loss}
def test_step(self, data):
# Pass tf.data.Dataset element based on numpy arrays
x, y_true, z_true = data
# Compute predictions for Predictor
y_pred = self.predictor(x, training=False)
# Input data for Adversary
adv_x = tf.concat([y_pred, y_true], axis=1)
# Compute predictions for Adversary
z_pred = self.adversary(adv_x, training=False)
# Update losses
self.p_loss(y_pred, y_true)
self.a_loss(z_pred, z_true)

运行以下代码时发生错误:

mitigator = Mitigator(predictor=Predictor, adversary=Adversary, debias_param=1)
mitigator.compile(a_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
p_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
a_loss='binary_crossentropy',
p_loss='categorical_crossentropy')
mitigator.fit(x=train_text, y=[train_y, z_true], epochs=5)

到目前为止,我已经运行了 Keras 文章中的代码来检查是否发生了相同的错误,但没有发生。GAN 示例运行良好。

有谁知道我该如何解决此错误?如果需要更多信息来帮助我,请告诉我。

更新

根据要求,下面给出了错误的完整回溯。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-4f1a8c7cee8b> in <module>()
----> 1 mitigator.fit(x=train_text, y=[train_y, z_true], epochs=5)
3 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
725         max_queue_size=max_queue_size,
726         workers=workers,
--> 727         use_multiprocessing=use_multiprocessing)
728 
729   def evaluate(self,
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_arrays.py in fit(self, model, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, **kwargs)
641         steps=steps_per_epoch,
642         validation_split=validation_split,
--> 643         shuffle=shuffle)
644 
645     if validation_data:
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, batch_size, check_steps, steps_name, steps, validation_split, shuffle, extract_tensors_from_dataset)
2430     is_compile_called = False
2431     if not self._is_compiled and self.optimizer:
-> 2432       self._compile_from_inputs(all_inputs, y_input, x, y)
2433       is_compile_called = True
2434 
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in _compile_from_inputs(self, all_inputs, target, orig_inputs, orig_target)
2665         sample_weight_mode=self.sample_weight_mode,
2666         run_eagerly=self.run_eagerly,
-> 2667         experimental_run_tf_function=self._experimental_run_tf_function)
2668 
2669   # TODO(omalleyt): Consider changing to a more descriptive function name.
TypeError: compile() got an unexpected keyword argument 'optimizer'

您可以在 compile(( 或 train_step(( 函数中设置optimizer

class Mitigator(Model):
def __init__(self, predictor, adversary, debias_param):
super(Mitigator, self).__init__()
self.predictor = predictor
self.adversary = adversary
self.debias_param = debias_param

def compile(self):
super(Mitigator, self).compile()
self.a_optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
self.p_optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
def train_step(self, data):
a_optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
p_optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
# Pass tf.data.Dataset element based on numpy arrays
x, y_true, z_true = data

设置self._is_compiled = True只是让代码认为您的代码已编译,我认为这行不通。

检查你的TensorFlow版本

导入张量流 print(tensorflow.版本(

必须高于 v2.4

因此,如果您的版本低于以下,您有两种选择,要么安装最新版本的Tensorflow和keras,要么使用Google Colabs。

因为这些定制的训练方法和一些预处理API包含在最新版本的Keras和Tensorflow中。

最新更新