Python add_weight()为参数';获取了多个值;名称';在Keras中使用自定义注意(层)时

Python add_weight()为参数';获取了多个值;名称';在Keras中使用自定义注意(层)时,python,tensorflow,keras,tensorflow2.0,Python,Tensorflow,Keras,Tensorflow2.0,(我认为这是因为作者使用了keras.engine.topology.Layer)时存在版本冲突) 使用tensorflow==2.2.0和keras==2.4.3,我试图学习注意机制,并从某处导入代码,如下所示: from keras import backend as K from keras.engine.topology import Layer from keras import initializers, regularizers, constraints from keras.l

(我认为这是因为作者使用了
keras.engine.topology.Layer
)时存在版本冲突)

使用tensorflow==2.2.0和keras==2.4.3,我试图学习注意机制,并从某处导入代码,如下所示:

from keras import backend as K
from keras.engine.topology import Layer
from keras import initializers, regularizers, constraints

from keras.layers import Dense, Input, LSTM, Bidirectional, Activation, Conv1D, GRU, TimeDistributed
from keras.layers import Dropout, Embedding, GlobalMaxPooling1D, MaxPooling1D, Add, Flatten, SpatialDropout1D
from keras.layers import GlobalAveragePooling1D, BatchNormalization, concatenate
from keras.layers import Reshape, merge, Concatenate, Lambda, Average
from keras.models import Sequential, Model
from keras.initializers import Constant
from keras.layers.merge import add


class Attention(Layer):
    def __init__(self, step_dim,
                 W_regularizer=None, b_regularizer=None,
                 W_constraint=None, b_constraint=None,
                 bias=True, **kwargs):
        self.supports_masking = True
        self.init = initializers.get('glorot_uniform')
        self.W_regularizer = regularizers.get(W_regularizer)
        self.b_regularizer = regularizers.get(b_regularizer)
        self.W_constraint = constraints.get(W_constraint)
        self.b_constraint = constraints.get(b_constraint)
        self.bias = bias
        self.step_dim = step_dim
        self.features_dim = 0
        super(Attention, self).__init__(**kwargs)

    def build(self, input_shape):
        assert len(input_shape) == 3
        self.W = self.add_weight((input_shape[-1],),
                                 initializer=self.init,
                                 name='{}_W'.format(self.name),
                                 regularizer=self.W_regularizer,
                                 constraint=self.W_constraint)
        self.features_dim = input_shape[-1]
        if self.bias:
            self.b = self.add_weight((input_shape[1],),
                                     initializer='zero',
                                     name='{}_b'.format(self.name),
                                     regularizer=self.b_regularizer,
                                     constraint=self.b_constraint)
        else:
            self.b = None
        self.built = True

    def compute_mask(self, input, input_mask=None):
        return None

    def call(self, x, mask=None):
        features_dim = self.features_dim
        step_dim = self.step_dim
        eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)), K.reshape(self.W, (features_dim, 1))), (-1, step_dim))
        if self.bias:
            eij += self.b
        eij = K.tanh(eij)
        a = K.exp(eij)
        if mask is not None:
            a *= K.cast(mask, K.floatx())
        a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx())
        a = K.expand_dims(a)
        weighted_input = x * a
        return K.sum(weighted_input, axis=1)

    def compute_output_shape(self, input_shape):
        return input_shape[0],  self.features_dim
问题是当我尝试使用

lstm_layer = LSTM(300, dropout=0.25, recurrent_dropout=0.25, return_sequences=True)

inp = Input(shape=(maxlen,), dtype='int32')
embedding= embedding_layer(inp)
x = lstm_layer(embedding)
x = Dropout(0.25)(x)
merged = Attention(maxlen)(x)
merged = Dense(256, activation='relu')(merged)
merged = Dropout(0.25)(merged)
merged = BatchNormalization()(merged)
outp = Dense(len(int_category), activation='softmax')(merged)

AttentionLSTM = Model(inputs=inp, outputs=outp)
AttentionLSTM.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])

AttentionLSTM.summary()
它抛出一个错误,错误为TypeError:add_weight()为参数“name”获取了多个值

错误的完整回溯为:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-25-1ab1f1ef1ed7> in <module>
      5 x = lstm_layer(embedding)
      6 x = Dropout(0.25)(x)
----> 7 merged = Attention(maxlen)(x)
      8 merged = Dense(256, activation='relu')(merged)
      9 merged = Dropout(0.25)(merged)

/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py in __call__(self, *args, **kwargs)
    895           # Build layer if applicable (if the `build` method has been
    896           # overridden).
--> 897           self._maybe_build(inputs)
    898           cast_inputs = self._maybe_cast_inputs(inputs)
    899 

/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py in _maybe_build(self, inputs)
   2414         # operations.
   2415         with tf_utils.maybe_init_scope(self):
-> 2416           self.build(input_shapes)  # pylint:disable=not-callable
   2417       # We must set also ensure that the layer is marked as built, and the build
   2418       # shape is stored since user defined build functions may not be calling

<ipython-input-20-86a01469b2e5> in build(self, input_shape)
     23                                  name='{}_W'.format(self.name),
     24                                  regularizer=self.W_regularizer,
---> 25                                  constraint=self.W_constraint)
     26         self.features_dim = input_shape[-1]
     27         if self.bias:

TypeError: add_weight() got multiple values for argument 'name'

---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
5 x=lstm_层(嵌入)
6 x=辍学率(0.25)(x)
---->7合并=注意(最大)(x)
8合并=密集(256,激活='relu')(合并)
9合并=辍学(0.25)(合并)
/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py in __调用(self,*args,**kwargs)
895#构建层(如适用)(如果“构建”方法已被
896#已覆盖)。
-->897自建(输入)
898转换输入=自身。转换输入(输入)
899
/构建中的opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/engine/base\u layer.py(自我,输入)
2414行动。
2415带有tf_utils。可能是初始作用域(self):
->2416 self.build(输入形状)#pylint:disable=不可调用
2417#我们还必须设置,以确保该层标记为已构建,并且构建
2418#由于用户定义的生成函数可能未调用,因此存储了形状
内置(自身、输入形状)
23 name='{}_W'.格式(self.name),
24正则化器=self.W_正则化器,
--->25约束=self.W_约束)
26自我特征尺寸=输入形状[-1]
27如果自我偏见:
TypeError:add_weight()为参数“name”获取了多个值

问题的出现是因为add\u weight函数从形状元组中获取值。
试着写“shape=shape(您的输入)”。这应该可以解决问题。

问题的出现是因为add\u weight函数从形状元组中获取值。
试着写“shape=shape(您的输入)”。这应该可以解决问题。

我已经部分解决了问题。至少对于添加重量()零件:

  • 步骤1:替换课堂注意力(图层)->课堂注意力(keras.layers.Layer)
  • 步骤2:在Add_weights方法中添加shape=(…)
见下文

from keras import backend as K
from keras.engine.topology import Layer
from keras import initializers, regularizers, constraints

from keras.layers import Dense, Input, LSTM, Bidirectional, Activation, Conv1D, GRU, TimeDistributed
from keras.layers import Dropout, Embedding, GlobalMaxPooling1D, MaxPooling1D, Add, Flatten, SpatialDropout1D
from keras.layers import GlobalAveragePooling1D, BatchNormalization, concatenate
from keras.layers import Reshape, merge, Concatenate, Lambda, Average
from keras.models import Sequential, Model
from keras.initializers import Constant
from keras.layers.merge import add


class Attention(keras.layers.Layer):
    def __init__(self, step_dim,
                 W_regularizer=None, b_regularizer=None,
                 W_constraint=None, b_constraint=None,
                 bias=True, **kwargs):
        self.supports_masking = True
        self.init = initializers.get('glorot_uniform')
        self.W_regularizer = regularizers.get(W_regularizer)
        self.b_regularizer = regularizers.get(b_regularizer)
        self.W_constraint = constraints.get(W_constraint)
        self.b_constraint = constraints.get(b_constraint)
        self.bias = bias
        self.step_dim = step_dim
        self.features_dim = 0
        super(Attention, self).__init__(**kwargs)

    def build(self, input_shape):
        assert len(input_shape) == 3
        self.W = self.add_weight(shape=(input_shape[-1],),
                                 name='{}_W'.format(self.name),
                                 initializer=self.init,
                                 regularizer=self.W_regularizer,
                                 constraint=self.W_constraint)
        self.features_dim = input_shape[-1]
        if self.bias:
            self.b = self.add_weight((input_shape[1],),
                                     name='{}_b'.format(self.name),
                                     initializer='zero',
                                     regularizer=self.b_regularizer,
                                     constraint=self.b_constraint)
        else:
            self.b = None
        self.built = True

    def compute_mask(self, input, input_mask=None):
        return None

    def call(self, x, mask=None):
        features_dim = self.features_dim
        step_dim = self.step_dim
        eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)), K.reshape(self.W, (features_dim, 1))), (-1, step_dim))
        if self.bias:
            eij += self.b
        eij = K.tanh(eij)
        a = K.exp(eij)
        if mask is not None:
            a *= K.cast(mask, K.floatx())
        a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx())
        a = K.expand_dims(a)
        weighted_input = x * a
        return K.sum(weighted_input, axis=1)

    def compute_output_shape(self, input_shape):
        return input_shape[0],  self.features_dim
进行上述更改后,我得到以下输出:

  • 我收到Tensorflow的警告
    “警告:tensorflow:模型未能序列化为JSON。忽略…Layer AttentionWithContext在`\uuu init\uuuuu`中有参数,因此必须重写`get\u config`”。

  • 当我尝试在测试数据集上评估算法时,我得到以下错误:


我不知道如何解决这两个问题,因此我可能会发布一个不同的问题,因为它不在本问题的范围之内。

我已经部分解决了这个问题。至少对于添加重量()零件:

  • 步骤1:替换课堂注意力(图层)->课堂注意力(keras.layers.Layer)
  • 步骤2:在Add_weights方法中添加shape=(…)
见下文

from keras import backend as K
from keras.engine.topology import Layer
from keras import initializers, regularizers, constraints

from keras.layers import Dense, Input, LSTM, Bidirectional, Activation, Conv1D, GRU, TimeDistributed
from keras.layers import Dropout, Embedding, GlobalMaxPooling1D, MaxPooling1D, Add, Flatten, SpatialDropout1D
from keras.layers import GlobalAveragePooling1D, BatchNormalization, concatenate
from keras.layers import Reshape, merge, Concatenate, Lambda, Average
from keras.models import Sequential, Model
from keras.initializers import Constant
from keras.layers.merge import add


class Attention(keras.layers.Layer):
    def __init__(self, step_dim,
                 W_regularizer=None, b_regularizer=None,
                 W_constraint=None, b_constraint=None,
                 bias=True, **kwargs):
        self.supports_masking = True
        self.init = initializers.get('glorot_uniform')
        self.W_regularizer = regularizers.get(W_regularizer)
        self.b_regularizer = regularizers.get(b_regularizer)
        self.W_constraint = constraints.get(W_constraint)
        self.b_constraint = constraints.get(b_constraint)
        self.bias = bias
        self.step_dim = step_dim
        self.features_dim = 0
        super(Attention, self).__init__(**kwargs)

    def build(self, input_shape):
        assert len(input_shape) == 3
        self.W = self.add_weight(shape=(input_shape[-1],),
                                 name='{}_W'.format(self.name),
                                 initializer=self.init,
                                 regularizer=self.W_regularizer,
                                 constraint=self.W_constraint)
        self.features_dim = input_shape[-1]
        if self.bias:
            self.b = self.add_weight((input_shape[1],),
                                     name='{}_b'.format(self.name),
                                     initializer='zero',
                                     regularizer=self.b_regularizer,
                                     constraint=self.b_constraint)
        else:
            self.b = None
        self.built = True

    def compute_mask(self, input, input_mask=None):
        return None

    def call(self, x, mask=None):
        features_dim = self.features_dim
        step_dim = self.step_dim
        eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)), K.reshape(self.W, (features_dim, 1))), (-1, step_dim))
        if self.bias:
            eij += self.b
        eij = K.tanh(eij)
        a = K.exp(eij)
        if mask is not None:
            a *= K.cast(mask, K.floatx())
        a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx())
        a = K.expand_dims(a)
        weighted_input = x * a
        return K.sum(weighted_input, axis=1)

    def compute_output_shape(self, input_shape):
        return input_shape[0],  self.features_dim
进行上述更改后,我得到以下输出:

  • 我收到Tensorflow的警告
    “警告:tensorflow:模型未能序列化为JSON。忽略…Layer AttentionWithContext在`\uuu init\uuuuu`中有参数,因此必须重写`get\u config`”。

  • 当我尝试在测试数据集上评估算法时,我得到以下错误:


我不知道如何解决这两个问题,因此我可能会发布一个不同的问题,因为它不在本问题的范围内。

我遇到了相同的问题,然后改变了我的环境。我的venv如下:

absl-py==0.11.0
astor==0.8.1
cached-property==1.5.2
certifi==2020.6.20
click==7.1.2
cycler==0.10.0
gast==0.4.0
google-pasta==0.2.0
grpcio==1.33.2
h5py==3.0.0
importlib-metadata==2.0.0
joblib==0.17.0
Keras==2.2.4
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.2
kiwisolver==1.3.1
Markdown==3.3.3
matplotlib==3.3.2
nltk==3.5
numpy==1.18.1
pandas==0.25.3
Pillow==8.0.1
protobuf==3.13.0
pyparsing==2.4.7
python-dateutil==2.8.1
pytz==2020.4
PyYAML==5.3.1
regex==2020.10.28
scikit-learn==0.23.2
scipy==1.5.4
six==1.15.0
sklearn==0.0
tensorboard==1.14.0
tensorflow==1.14.0
tensorflow-estimator==1.14.0
termcolor==1.1.0
threadpoolctl==2.1.0
tqdm==4.51.0
Werkzeug==1.0.1
wrapt==1.12.1
zipp==3.4.0

我也有同样的问题,然后改变了我的环境。我的venv如下:

absl-py==0.11.0
astor==0.8.1
cached-property==1.5.2
certifi==2020.6.20
click==7.1.2
cycler==0.10.0
gast==0.4.0
google-pasta==0.2.0
grpcio==1.33.2
h5py==3.0.0
importlib-metadata==2.0.0
joblib==0.17.0
Keras==2.2.4
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.2
kiwisolver==1.3.1
Markdown==3.3.3
matplotlib==3.3.2
nltk==3.5
numpy==1.18.1
pandas==0.25.3
Pillow==8.0.1
protobuf==3.13.0
pyparsing==2.4.7
python-dateutil==2.8.1
pytz==2020.4
PyYAML==5.3.1
regex==2020.10.28
scikit-learn==0.23.2
scipy==1.5.4
six==1.15.0
sklearn==0.0
tensorboard==1.14.0
tensorflow==1.14.0
tensorflow-estimator==1.14.0
termcolor==1.1.0
threadpoolctl==2.1.0
tqdm==4.51.0
Werkzeug==1.0.1
wrapt==1.12.1
zipp==3.4.0

add_weights方法在代码中调用了三次,请尝试使用“shape=”修复它。

add_weights方法在代码中调用了三次,请尝试使用“shape=”修复它。

解决方案1: 对我来说,它与
keras.version_uu==2.2.4和tensorflow.uu version==1.15.2
解决方案#2:将所有self.add_weight()函数中的(输入_shape[-1],)替换为shape=(输入_shape[-1],)
如果您遇到任何错误,如
获取配置
。尝试不保存模型,而是尝试保存权重
也许您可以使用save_weights_only=True,例如使用
检查点=模型检查点(filepath='model_path.h5',verbose=1,save_best_only=True,save_weights_only=True)

解决方案#1: 对我来说,它与
keras.version_uu==2.2.4和tensorflow.uu version==1.15.2
解决方案#2:将所有self.add_weight()函数中的(输入_shape[-1],)替换为shape=(输入_shape[-1],)
如果您遇到任何错误,如
获取配置
。尝试不保存模型,而是尝试保存权重

也许您可以使用save_weights_only=True,例如使用
checkpointer=ModelCheckpoint(filepath='model_path.h5',verbose=1,save_best_only=True,save_weights_only=True)

我对TF 2.2.0版和Keras 2.3.1版也有同样的问题,你能找到解决这个问题的方法吗?你好,杰耶什,这不是一条非常有用的信息。请您报告上面的代码,并导入适当的模块和“shape=shape(input)”