Keras - LSTM на уровне символов - Ошибка значения - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь создать LSTM на уровне персонажа, чтобы использовать его в нейронной сети на уровне слов.

Мой train_text - это список списков с предложениями, мои train_labels - это списки списков с идентификаторами меток.

Код:

def create_char_set(texts):
    txt = ''
    for sent in texts:
        for w in sent:
            txt += w
    chars = set(txt)
    print('total chars:', len(chars))
    char_to_index = dict((c, i) for i, c in enumerate(chars))
    index_to_char = dict((i, c) for i, c in enumerate(chars))
    return char_to_index, index_to_char

char_to_index, index_to_char = create_char_set(train_text)

def create_char_data(texts, labels, char_to_index):

    X = np.ones((len(texts), MAX_LENGTH, MAX_LENGTH), dtype=np.int64) * -1
    y = np.array(labels)
    y = pad_sequences(y, MAX_LENGTH)

    for i, sent in enumerate(texts):
        for j, word in enumerate(sent):
            for t, char in enumerate(word[-MAX_LENGTH:]):
                X[i, j, (MAX_LENGTH-1-t)] = char_to_index[char]
    return X, y

X_train, y_train = create_char_data(train_text, train_labels, char_to_index)
X_dev, y_dev = create_char_data(dev_text, dev_labels, char_to_index)

def binarize(x, sz=NUM_LABELS):
    return tf.to_float(tf.one_hot(x, sz, on_value=1, off_value=0, axis=-1))

def binarize_outshape(in_shape):
    return in_shape[0], in_shape[1], NUM_LABELS

LSTM для встраивания символов

filter_length = [5, 3, 3]
nb_filter = [196, 196, 256]
pool_length = 2

in_sentence = Input(shape=(MAX_LENGTH,), dtype='int64')
# binarize function creates a onehot encoding of each character index
embedded = Lambda(binarize, output_shape=binarize_outshape)(in_sentence)

for i in range(len(nb_filter)):
    embedded = Conv1D(filters=nb_filter[i],
                        kernel_size=filter_length[i],
                        padding='valid',
                        activation='relu',
                        kernel_initializer='glorot_normal')(embedded)

    embedded = Dropout(0.1)(embedded)
    embedded = MaxPooling1D(pool_size=pool_length)(embedded)


forward_sent = LSTM(HIDDEN_SIZE, return_sequences=False)(embedded)
backward_sent = LSTM(HIDDEN_SIZE, return_sequences=False, go_backwards=True)(embedded)

sent_encode = concatenate([forward_sent, backward_sent], axis=-1)
sent_encode = Dropout(0.3)(sent_encode)

encoder = Model(inputs=in_sentence, outputs=sent_encode)

LSTM для POS-тегов

sequence = Input(shape=(MAX_LENGTH, MAX_LENGTH), dtype='int64')
encoded = TimeDistributed(encoder)(sequence)

###first lstm
left = LSTM(HIDDEN_SIZE, return_sequences=True)(encoded)
right = LSTM(HIDDEN_SIZE, go_backwards=True, return_sequences=True)(encoded)
left_right = concatenate([left, right])

###second lstm
left2 = LSTM(HIDDEN_SIZE, return_sequences=True)(encoded)
right2 = LSTM(HIDDEN_SIZE, go_backwards=True, return_sequences=True)(encoded)
left_right2 = concatenate([left2, right2])

left_right_combi = add([left_right, left_right2])

dense = Dense(10, activation='tanh')(left_right_combi)
crf_layer = CRF(NUM_LABELS, sparse_target=False)
crf_out = crf_layer(dense)
model = Model(inputs=sequence, outputs=crf_out)
model.compile(loss=crf_layer.loss_function, optimizer='adam', metrics=[crf_layer.accuracy])


model.fit(X_train, y_train, validation_data=(X_dev, y_dev), batch_size=4, epochs=2, shuffle=True)

score, acc = model.evaluate(X_dev, y_dev)
print("\nBidirectional LSTM Accuracy: ", acc)

Теперь я получаю следующую ошибку:

ValueError: Невозможно передать значение формы (4, 34) для Tensor 'crf_1_target: 0', который имеет форму '(?,?,?)'

Что я делаю не так?

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