首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义Tensorflow Keras -TypeError中的model.fit():TypeError: compile()获得意外的关键字参数'optimizer‘

自定义Tensorflow Keras -TypeError中的model.fit():TypeError: compile()获得意外的关键字参数'optimizer‘
EN

Stack Overflow用户
提问于 2020-06-30 17:40:27
回答 2查看 2K关注 0票数 2

我正在尝试通过修改Keras中的model.fit()来实现我自己的重量训练算法。我读过来自Keras的this文章,它基于GANs很好地解释了这一点。不过,我现在面对的问题是:

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

代码语言:javascript
复制
TypeError: compile() got an unexpected keyword argument 'optimizer'

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

代码语言:javascript
复制
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)

当我运行以下代码时出现错误:

代码语言:javascript
复制
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示例运行良好。

有人知道我如何解决这个错误吗?如果需要更多信息来帮助我,请让我知道。

更新

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

代码语言:javascript
复制
---------------------------------------------------------------------------
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'
EN

回答 2

Stack Overflow用户

发布于 2020-10-21 17:23:33

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

代码语言:javascript
复制
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)
代码语言:javascript
复制
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只是让代码认为你的代码已经编译了,我认为这是行不通的。

票数 0
EN

Stack Overflow用户

发布于 2021-05-19 15:16:09

检查您的tensorflow版本

导入tensorflow print(tensorflow.version)

必须高于v2.4

因此,如果您的版本低于此版本,您有两个选择,要么安装最新版本的Tensorflow和keras,要么使用google colabs。

由于这些定制的训练方法和一些预处理API包含在最近版本的keras和tensorflow中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62654543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档