Keras ValueError: Shapes (?,?,?) И (6, 1) должны иметь одинаковый ранг, а логиты и метки должны иметь одинаковую форму ((6, 1) против (?,?,?)) При компиляции - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь построить модель НЛП CNN для мультиклассовой классификации (6 классов).Первая часть структуры:

Input -> Embedding -> Conv -> GlobalMaxPool -> Dropout -> Dense

И после плотного слоя каждое входное предложение имеет видпреобразован в 100-размерные вложения.

После этого я передаю постоянную матрицу (6 100), которая представляет собой матрицу встраивания слов из шести различных меток (каждая строка представляет 100-мерное встраивание слов), и явычислите косинусное сходство между вложением предложения и каждым вложением слова метки как функцией оценки, и это даст мне результат (6 100).

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

Ниже приведен весь код, и я ценю всю помощь!

MAX_SEQUENCE_LENGTH = 250

jdes_sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='float32')
word_embedding_layer = embedding_layer(jdes_sequence_input)
jdes = word_embedding_layer
jdes = Conv1D(filters=1000, kernel_size=5, strides=1, activation='tanh')(jdes)
jdes = GlobalMaxPooling1D()(jdes)
jdes = Dense(1000, activation='tanh')(jdes)
jdes = Dropout(0.3)(jdes)
jdes = Dense(100, activation='relu')(jdes)

def cosine_distance(input): # label_embedding is the constant matrix
    jd = K.l2_normalize(input, axis=-1)
    jt_six = K.l2_normalize(label_embedding, axis=-1)
    return jd * jt_six # return a 6*100 result

distance = Lambda(cosine_distance, output_shape=(6,100))(jdes)
result = Dense(1, activation='sigmoid')(distance)

model = Model(inputs=jdes_sequence_input, outputs = result)
sgd = optimizers.SGD(lr=0.05)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
model.fit(pad_data, labels, validation_split=0.2, batch_size=64, nb_epoch=1)

pad_data имеет форму: (18722, 250) метки имеют форму: (18722, 6)

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

У меня была похожая проблема, и она была с моей собственной лямбдой расстояния и функцией, которую я передал ей.

Чтобы исправить это, я должен сделать это

def get_abs_diff( vects ):
    x, y = vects
    return K.abs( x - y )  

def eucl_dist_output_shape(shapes):
    shape1, shape2 = shapes
    return (shape1[0], 1)
    #Original
    #return(1,) This messed up the ranking

Это ненеобходимо исправить вашу проблему, но это место для начала.@Kadam Parikh был прав в том, что проблема в формуле пользовательского расстояния.

0 голосов
/ 22 декабря 2018

Потребовалось много времени, чтобы понять вопрос и ошибку.Я пришел к выводу:

Фигуры (?,?,?) И (6, 1) должны иметь одинаковый ранг

Это говорит о том, что что-то не так свыход (с формой (6, 1)).Вы использовали пользовательский слой в конце этой модели, т.е. после плотного слоя.Ошибка заключается в этом пользовательском слое.

distance = Lambda (cosine_distance, output_shape = (6,100)) (jdes)

Вы определили форму вывода как (6100).Я думаю, что вы забыли, что слои, которые вы пишете в Keras, должны обрабатывать весь пакет сразу.Следовательно, выходные данные должны иметь форму (batch_size, 6, 100).

Теперь, output_shape будет (?, 6, 100) с рангом '3', который совпадает с рангом формы(?,?,?).

Попробуйте это ..

...