ValueError: Ошибка при проверке цели: ожидалось, что dens_22 будет иметь форму (100, 50), но получил массив с формой (1, 50) - PullRequest
1 голос
/ 25 марта 2020

Я обучаю нейронную сеть прогнозировать частоту документов на основе набора документов.

Итак, основная идея состоит в том, чтобы сопоставить матрицу со 100 документами и 50 токенами с соответствующей частотой документов. массив.

X = (n_samples, 100, 50) -> y = (n_samples, 1, 50)

Мой код:

model = Sequential()
model.add(Dense(50, activation='sigmoid', input_shape=(100,50)))
model.add(Dense(50))
model.compile(optimizer='rmsprop', loss='mse')
model.fit(X_train, y_train, epochs=50)

Но я получил ошибка:

ValueError: Error when checking target: expected dense_22 to have shape (100, 50) but got array with shape (1, 50)

1 Ответ

0 голосов
/ 25 марта 2020

Это потому, что ваши входные данные двумерные, поэтому сводка модели выглядит следующим образом.

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 100, 50)           2550      
_________________________________________________________________
dense_2 (Dense)              (None, 100, 50)           2550      
=================================================================
Total params: 5,100
Trainable params: 5,100
Non-trainable params: 0
_________________________________________________________________

Попробуйте изменить форму тензора после dense_1 или dense_2, взяв сумму / среднее значение за вторая ось, чтобы получить ту же форму, что и ваш Y.

Вот мой пример для справки

Я написал настраиваемую функцию суммы для суммирования по вторая ось, чтобы тензор (Нет, 100, 50) был (Нет, 1, 50). Затем добавьте еще один плотный слой.

import keras.backend as K
from keras.layers import Dense, Lambda
from keras.models import Sequential

def mysum(x): 
    return  K.sum(x, axis=1, keepdims=True) 

def mysum_output_shape(input_shape): 
    shape = list(input_shape) 
    print(shape)
    shape[1] = 1 
    return tuple(shape) 

# randomly generate data
import numpy as np
X_train = np.random.normal(0, 1, (50,100,50))
y_train = np.ones((50, 1, 50))

model = Sequential()
model.add(Dense(50, activation='sigmoid', input_shape=(100,50)))
model.add(Lambda(mysum, output_shape=mysum_output_shape)) 
model.add(Dense(50))
model.compile(optimizer='rmsprop', loss='mse')
model.fit(X_train, y_train, epochs=50)

Важно знать, каков ваш вклад и как тензоры преобразуются через каждый слой. Надеюсь, это поможет!

...