Вход 0 несовместим со слоем time_distributed_10: ожидаемый ndim = 3, найденный ndim = 2 - PullRequest
0 голосов
/ 12 февраля 2020

Я работаю над распознаванием Именованной сущности (в поезде каждое слово имеет метку), когда я запускаю следующую модель «Вход 0 несовместим со слоем time_distributed_10: ожидаемый ndim = 3, найденный ndim = 2», ошибка показала, пожалуйста, я нужна твоя помощь

from keras.models import Sequential
from keras.layers import Dense, LSTM, InputLayer, Bidirectional, TimeDistributed, Embedding,    Activation
from keras.optimizers import Adam
from keras import initializers

model = Sequential()
model.add(InputLayer(input_shape=(MAX_LENGTH, )))
model.add(Embedding(len(word2index), 128))
model.add(Conv1D(filters=32, kernel_size=2, activation='relu'))
model.add(Bidirectional(LSTM(256, return_sequences=True)))
model.add(AttentionLayer(300,True,name='word_attention'))
model.add(TimeDistributed(Dense(len(tag2index))))

model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
          optimizer=Adam(0.001),
          metrics=['accuracy'])

model.summary()
class AttentionLayer(Layer):
def __init__(self, attention_dim):
    self.init = initializers.get('normal')
    self.supports_masking = True
    self.attention_dim = attention_dim
    super(AttLayer, self).__init__()

def build(self, input_shape):
    assert len(input_shape) == 3
    self.W = K.variable(self.init((input_shape[-1], self.attention_dim)), name='W')
    self.b = K.variable(self.init((self.attention_dim, )), name='b')
    self.u = K.variable(self.init((self.attention_dim, 1)), name='u')
    self.trainable_weights = [self.W, self.b, self.u]
    super(AttLayer, self).build(input_shape)

def compute_mask(self, inputs, mask=None):
    return mask

def call(self, x, mask=None):
    # size of x :[batch_size, sel_len, attention_dim]
    # size of u :[batch_size, attention_dim]
    # uit = tanh(xW+b)
    uit = K.tanh(K.bias_add(K.dot(x, self.W), self.b))
    ait = K.dot(uit, self.u)
    ait = K.squeeze(ait, -1)

    ait = K.exp(ait)

    if mask is not None:
        # Cast the mask to floatX to avoid float64 upcasting in theano
        ait *= K.cast(mask, K.floatx())
    ait /= K.cast(K.sum(ait, axis=1, keepdims=True) + K.epsilon(), K.floatx())
    ait = K.expand_dims(ait)
    weighted_input = x * ait
    output = K.sum(weighted_input, axis=1)

    return output
...