Ошибка формы в сверточной нейронной сети - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь обучить нейронную сеть со следующей структурой:

model = Sequential()

model.add(Conv1D(filters = 300, kernel_size = 5, activation='relu', input_shape=(4000, 1)))
model.add(Conv1D(filters = 300, kernel_size = 5, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(filters = 320, kernel_size = 5, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Dropout(0.5))

model.add(Dense(num_labels, activation='softmax'))

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

return model

И я получаю эту ошибку:

expected dense_1 to have shape (442, 3) but got array with shape (3, 1)

Мой ввод - это набор фраз(Всего 12501), которые были размечены для 4000 наиболее релевантных слов, и есть 3 возможных классификации.Поэтому мой вход - train_x.shape = (12501, 4000).Я изменил это в (12501, 4000, 1) для слоя Conv1D.Теперь мой train_y.shape = (12501,3), и я изменил это в (12501,3, 1).

Я использую функцию подгонки следующим образом:

model.fit(train_x, train_y, batch_size=32, epochs=10, verbose=1, validation_split=0.2, shuffle=True)

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

1 Ответ

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

Нет необходимости преобразовывать форму этикетки для классификации.И вы можете посмотреть на структуру вашей сети.

print(model.summary())
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_1 (Conv1D)            (None, 3996, 300)         1800      
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 3992, 300)         450300    
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 1330, 300)         0         
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 1326, 320)         480320    
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 442, 320)          0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 442, 320)          0         
_________________________________________________________________
dense_1 (Dense)              (None, 442, 3)            963       
=================================================================
Total params: 933,383
Trainable params: 933,383
Non-trainable params: 0
_________________________________________________________________

Последний вывод модели - (None, 442, 3), но форма вашей метки - (None, 3, 1).В конечном итоге вы должны заканчивать либо глобальным пулом GlobalMaxPooling1D(), либо слоем Flatten Flatten(), превращая 3D-выходы в 2D-выходы для классификации или регрессии.

...