Когда я пишу Layer in Keras, я получаю эту ошибку. AttributeError: у объекта 'NoneType' нет атрибута '_inbound_nodes' - PullRequest
0 голосов
/ 14 апреля 2019

Я хочу написать слой в Keras, но я получаю сообщение об ошибке:

AttributeError: У объекта 'NoneType' нет атрибута '_inbound_nodes'

Бэкэнд-функция можетбыть проблемой.

однако, я искал несколько часов, большинство ответов было найдено так: «Деформация в лямбде», но когда я оборачиваю всю функцию бэкэнда (я использую тензор потока) в лямбде, я все равно получаю ошибку.

Я даже открывал проблемы в keras github # 12672, но никто не обращался, помогите.:-( https://github.com/keras-team/keras/issues/12672

from keras.engine.topology import Layer
import keras.backend as K
from keras.layers import Lambda
import numpy as np

class Attention(Layer):

    def __init__(self, **kwargs):
        super(Attention, self).__init__(**kwargs)

    def build(self, input_shape):
        # three weight
        # Wh: att_size, att_size -->  previous hidden state
        # Wq: query_dim, att_size --> target hidden state
        # V:  att_size, 1 --> tanh
        # score(previous, target) = Vt * tanh(Wh * previous + target * Wq + b???) --> (1, 1)

        # the dimension of previous hidden state
        self.att_size = input_shape[0][-1]
        # the dimension of target hidden state
        self.query_dim = input_shape[1][-1]


        self.Wq = self.add_weight(name='kernal_query_features', shape=(self.query_dim, self.att_size),
                                  initializer='glorot_normal', trainable=True)

        self.Wh = self.add_weight(name='kernal_hidden_features', shape=(self.att_size, self.att_size),
                                  initializer='glorot_normal', trainable=True)

        self.v = self.add_weight(name='query_vector', shape=(self.att_size, 1),
                                 initializer='zeros', trainable=True)

        super(Attention, self).build(input_shape)


    def call(self, inputs, mask=None):


        # score(previous, target) = Vt * tanh(Wh * memory + target * Wq)

        memory, query = inputs[0], inputs[1]
        hidden = K.dot(memory, self.Wh) + K.expand_dims(K.dot(query, self.Wq), 1)
        hidden = K.tanh(hidden)
        # remove the dimension whose shape is 1
        s = K.squeeze(K.dot(hidden, self.v), -1)

        #s= K.reshape(K.dot(hidden, self.v), (-1, self.att_size))
        # compute the weight use soft_max
        s = K.softmax(s)

        return K.sum(memory * K.expand_dims(s), axis=1)


    def compute_output_shape(self, input_shape):
        att_size = input_shape[0][-1]
        batch = input_shape[0][0]
        return batch, att_size

В Моем основном коде

lstm_global_seq = LSTM(units=2 * neighbor_slide_len * neighbor_slide_len,
                           return_sequences=True, dropout=0.1,
                           recurrent_dropout=0.1, name="att_global")(global_data)

    att_global = Attention()([lstm_global_seq[:-1], lstm_global_seq[-1]])

    lstm_global = merge.Concatenate(axis=-1)([att_global, lstm_global_seq[-1]])

Я надеюсь, что этот слой с самоопределением может работать правильно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...