Tensorflow 属性错误:';张量';对象没有属性';分配';在注意力模型中

Tensorflow 属性错误:';张量';对象没有属性';分配';在注意力模型中,tensorflow,keras,deep-learning,recurrent-neural-network,attention-model,Tensorflow,Keras,Deep Learning,Recurrent Neural Network,Attention Model,我尝试使用keras(文档分类层次注意网络模型的一部分)建立一个具有注意的文档分类模型。以下代码为测试代码。我创建了一个birnn和一个自定义的注意层来引用和。但是我得到了一个错误(见下面的细节) 代码为: from keras.models import Model from keras.layers import Input from keras.layers.embeddings import Embedding from keras.layers.recurrent import GRU

我尝试使用keras(文档分类层次注意网络模型的一部分)建立一个具有注意的文档分类模型。以下代码为测试代码。我创建了一个birnn和一个自定义的注意层来引用和。但是我得到了一个错误(见下面的细节)

代码为:

from keras.models import Model
from keras.layers import Input
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import GRU
from keras.layers.wrappers import Bidirectional, TimeDistributed
from keras.layers.core import Dropout, Dense, Lambda, Masking
from keras.layers import merge
from keras.engine.topology import Layer

from keras import backend as K
from keras import initializers
import keras
class AttentionLayer(Layer):
    '''
    Attention layer. 
    '''
    def __init__(self, init='glorot_uniform', **kwargs):
        super(AttentionLayer, self).__init__(**kwargs)
        self.supports_masking = True
        self.init = initializers.get(init)

    def build(self, input_shape):
        input_dim = input_shape[-1]
        self.Uw = self.init((input_dim, ))
        self.trainable_weights = [self.Uw]
        super(AttentionLayer, self).build(input_shape)  

    def compute_mask(self, input, mask):
        return mask

    def call(self, x, mask=None):
        eij = K.tanh(K.squeeze(K.dot(x, K.expand_dims(self.Uw)), axis=-1))
        ai = K.exp(eij)
        weights = ai/K.expand_dims(K.sum(ai, axis=1),1)

        weighted_input = x*K.expand_dims(weights,2)
        return K.sum(weighted_input, axis=1)

    def get_output_shape_for(self, input_shape):
        newShape = list(input_shape)
        newShape[-1] = 1
        return tuple(newShape)

sentence_input = Input(shape=(None,5))
# embedded_sequences = embedding_layer(sentence_input)
l_lstm = Bidirectional(GRU(10, return_sequences=True),merge_mode='concat')(sentence_input)
# l_dense = TimeDistributed(Dense(200))(l_lstm)
l_att = AttentionLayer()(l_lstm)
cls = Dense(10, activation='softmax')(l_att)
sentEncoder = Model(sentence_input, cls)

sentEncoder.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])
import numpy as np
x_train = np.array([[1,2,3,4,5],
                    [1,2,3,4,5],
                    [1,2,3,4,5],
                    [1,2,3,4,5],
                    [1,2,3,4,5],
                    [1,2,3,4,5],
                    [1,2,3,4,5],
                    [1,2,3,4,5],
                    [1,2,3,4,5],
                    [1,2,3,4,5]])
y_train = np.array([1,2,3,4,5,6,7,8,9,0])
y_train = keras.utils.to_categorical(y_train, 10)
x_train = np.expand_dims(x_train,0)
y_train = np.expand_dims(y_train,0)

sentEncoder.fit(x=x_train,y=y_train,validation_split=0.1)
并得到以下错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-13-3f6bb30d8618> in <module>()
----> 1 sentEncoder.fit(x=x_train,y=y_train,validation_split=0.1)

~/.conda/envs/21/lib/python3.6/site-packages/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, **kwargs)
   1011         else:
   1012             ins = x + y + sample_weights
-> 1013         self._make_train_function()
   1014         f = self.train_function
   1015 

~/.conda/envs/21/lib/python3.6/site-packages/keras/engine/training.py in _make_train_function(self)
    495                     training_updates = self.optimizer.get_updates(
    496                         params=self._collected_trainable_weights,
--> 497                         loss=self.total_loss)
    498                 updates = (self.updates +
    499                            training_updates +

~/.conda/envs/21/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
     89                 warnings.warn('Update your `' + object_name +
     90                               '` call to the Keras 2 API: ' + signature, stacklevel=2)
---> 91             return func(*args, **kwargs)
     92         wrapper._original_function = func
     93         return wrapper

~/.conda/envs/21/lib/python3.6/site-packages/keras/optimizers.py in get_updates(self, loss, params)
    262                 new_p = p.constraint(new_p)
    263 
--> 264             self.updates.append(K.update(p, new_p))
    265         return self.updates
    266 

~/.conda/envs/21/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py in update(x, new_x)
    968         The variable `x` updated.
    969     """
--> 970     return tf.assign(x, new_x)
    971 
    972 

~/.conda/envs/21/lib/python3.6/site-packages/tensorflow/python/ops/state_ops.py in assign(ref, value, validate_shape, use_locking, name)
    282         ref, value, use_locking=use_locking, name=name,
    283         validate_shape=validate_shape)
--> 284   return ref.assign(value, name=name)
    285 
    286 

AttributeError: 'Tensor' object has no attribute 'assign'
AttributeError回溯(最近一次调用)
在()
---->1.装配(x=x\U系列,y=y\U系列,验证\U分割=0.1)
~/.conda/envs/21/lib/python3.6/site-packages/keras/engine/training.py in-fit(self、x、y、批量大小、历元、详细信息、回调、验证分割、验证数据、洗牌、类权重、样本权重、初始历元、每历元的步数、验证步数、**kwargs)
1011其他:
1012英寸=x+y+样本重量
->1013自我制作训练功能()
1014 f=自整列功能
1015
~/.conda/envs/21/lib/python3.6/site-packages/keras/engine/training.py在函数(self)中
495培训\u更新=self.optimizer.get\u更新(
496参数=自身收集的可训练重量,
-->497损失=自身总损失)
498更新=(self.updates+
499培训和更新+
包装中的~/.conda/envs/21/lib/python3.6/site-packages/keras/legacy/interfaces.py(*args,**kwargs)
89警告。警告('更新您的`+对象\u名称+
90'`对Keras 2 API的调用:'+签名,stacklevel=2)
--->91返回函数(*args,**kwargs)
92包装器._原始函数=func
93返回包装器
get_更新中的~/.conda/envs/21/lib/python3.6/site-packages/keras/optimizers.py(self、loss、params)
262新p=p.约束(新p)
263
-->264 self.updates.append(K.update(p,new_p))
265返回自我更新
266
更新中的~/.conda/envs/21/lib/python3.6/site-packages/keras/backend/tensorflow\u backend.py(x,new\u x)
968变量'x'已更新。
969     """
-->970返回tf.assign(x,new_x)
971
972
分配中的~/.conda/envs/21/lib/python3.6/site-packages/tensorflow/python/ops/state\u ops.py(参考,值,验证形状,使用锁定,名称)
282参考,值,使用锁定=使用锁定,名称=名称,
283验证形状=验证形状)
-->284返回参考赋值(值,名称=名称)
285
286
AttributeError:“Tensor”对象没有属性“assign”

我不知道出了什么问题。我在谷歌上搜索并询问了擅长这方面的人,但没有找到答案。这是因为双向的吗?有人知道出了什么问题吗?

我想这是数据集和标签的形状问题。

我遇到了同样的问题,我解决了。原因是K.update(p,new\p),'p'类型不应该是张量类型,当你使用K.update(p,new_p)时,'p'类型应该是tf.Variable,'new_p'类型应该是张量类型,我希望它能解决你的问题。

请花点时间阅读中的。堆栈溢出的格式不同于其他站点。