如何解决TypeError: __init__()需2个位置参数却传入3个的问题
Keras构建模型报错:TypeError: init() takes 2 positional arguments but 3 were given
相关代码
layer.py
def repeat_vector(inputs): layer_for_repeat, layer_for_getting_rep_num = inputs n=K.shape(layer_for_getting_rep_num)[1] name='custom_repeat_vector' repeated_vector = RepeatVector(n,name)(layer_for_repeat) # shape == (batch_size, seq_len, vector_dim) return repeated_vector
lambda_layer.py
class Lambda(Layers): @tf.__internal__.tracking.no_automatic_dependency_tracking def __init__(self, function, output_shape=None, mask=None, arguments=None, **kwargs ): super().__init__(**kwargs) self.arguments = arguments or {} self.function = function if mask is not None: self.supports_masking = True self.mask = mask self._output_shape = output_shape # Warning on every invocation will be quite irksome in Eager mode. self._already_warned = False function_args = tf_inspect.getfullargspec(function).args self._fn_expects_training_arg = "training" in function_args self._fn_expects_mask_arg = "mask" in function_args
报错栈信息
errors are: File "/content/gdrive/MyDrive/cakechat-master/tools/fetch.py", line 40, in <module> get_trained_model(fetch_from_s3=True) File "/usr/local/lib/python3.9/dist-packages/cachetools/__init__.py", line 737, in wrapper v = func(*args, **kwargs) File "/content/gdrive/MyDrive/cakechat-master/cakechat/dialog_model/factory.py", line 76, in get_trained_model model.init_model() File "/content/gdrive/MyDrive/cakechat-master/cakechat/dialog_model/keras_model.py", line 30, in wrapper return func(*args, **kwargs) File "/content/gdrive/MyDrive/cakechat-master/cakechat/dialog_model/keras_model.py", line 277, in init_model self._model = self._build_model() File "/content/gdrive/MyDrive/cakechat-master/cakechat/dialog_model/model.py", line 253, in _build_model decoder_training_model, decoder_model = self._decoder(y_tokens_emb_model, condition_emb_model) File "/content/gdrive/MyDrive/cakechat-master/cakechat/dialog_model/model.py", line 387, in _decoder repeated_conditioned_tv = Lambda(function=repeat_vector,mask=lambda inputs, inputs_masks: inputs_masks[0], File "/usr/local/lib/python3.9/dist-packages/keras/engine/base_layer_v1.py", line 838, in __call__ outputs = call_fn(cast_inputs, *args, **kwargs) File "/usr/local/lib/python3.9/dist-packages/keras/layers/core/lambda_layer.py", line 209, in call result = self.function(inputs, **kwargs) File "/content/gdrive/MyDrive/cakechat-master/cakechat/dialog_model/layers.py", line 20, in repeat_vector repeated_vector = RepeatVector(n,name)(layer_for_repeat) TypeError: __init__() takes 2 positional arguments but 3 were given
解决方案
错误根源是RepeatVector(n,name)的调用方式不符合Keras的参数规则:RepeatVector类的__init__方法仅接受一个必填位置参数n,其余参数(如name)需要以关键字参数形式传递。
修改layer.py中的对应代码:
# 原代码 repeated_vector = RepeatVector(n,name)(layer_for_repeat) # 修改后 repeated_vector = RepeatVector(n, name=name)(layer_for_repeat)
另外注意到你提供的lambda_layer.py代码中class Lambda(Layers)后面缺少冒号,虽不是当前报错原因,但建议补全以避免后续语法错误:
# 原代码 class Lambda(Layers) # 修改后 class Lambda(Layers):
内容的提问来源于stack exchange,提问作者Yukta Sawant
相关产品推荐
相关产品推荐

