我正在尝试通过修改Keras中的model.fit()来实现我自己的重量训练算法。我读过来自Keras的this文章,它基于GANs很好地解释了这一点。不过,我现在面对的问题是:
我遵循了与文章中解释的完全相同的步骤和程序,但我用我自己的训练算法替换了他们的训练算法。我得到的错误是
TypeError: compile() got an unexpected keyword argument 'optimizer'我创建的模型使用Tensorflow 1.15。另外,我使用来自Tensorflow hub的ELMO嵌入层,它需要TensorFlow1.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'发布于 2020-10-21 17:23:33
您可以在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只是让代码认为你的代码已经编译了,我认为这是行不通的。
发布于 2021-05-19 15:16:09
检查您的tensorflow版本
导入tensorflow print(tensorflow.version)
必须高于v2.4
因此,如果您的版本低于此版本,您有两个选择,要么安装最新版本的Tensorflow和keras,要么使用google colabs。
由于这些定制的训练方法和一些预处理API包含在最近版本的keras和tensorflow中。
https://stackoverflow.com/questions/62654543
复制相似问题