Ошибка при проверке цели: ожидается, что dens_101 будет иметь форму (143, 3), но получил массив с формой (855, 3) - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть модель Keras, подобная этой:

model=Sequential()
'''
filters=number of conv kernel
strides=step
'''
model.add(Convolution1D(filters=1000, kernel_size=11,strides=3,
                    input_shape=(train_num,data_dim),padding='same',
                    activation='relu',kernel_initializer='uniform'))

model.add(Convolution1D(filters=1000, kernel_size=7, strides=2,        padding='same',
                    activation='relu',kernel_initializer='uniform'))

model.add(Convolution1D(filters=1000, kernel_size=3, strides=1, padding='same',
                    activation='relu',kernel_initializer='uniform'))


model.add(Dense(128,activation='relu'))  
model.add(Dropout(0.3))  

model.add(Dense(128,activation='relu'))  
model.add(Dropout(0.3))  

model.add(Dense(128,activation='relu'))  
model.add(Dropout(0.3))  

model.add(Dense(3,activation='softmax'))  
model.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])  
model.summary()


print("training starts.....")
model.fit(trX,trY,epochs=30,batch_size=100)


accuracy=model.evaluate(teX,teYY,batch_size=100)
predict_y = model.predict(teX)
print('\nTest accuracy:',accuracy[1])
#predict=model.predict(teY,batch_size=30)

save_model(model,'my_model_com3hl')

Моя форма входных данных (1,855,1000).Это значит, что у меня 855 сэмплов, а у каждого сэмпла 1000 дим.Но когда я тренировался, выборочная яркость выходной формы уменьшилась следующим образом, и произошла следующая ошибка:

Ошибка при проверке цели: ожидалось, что плотность_101 будет иметь форму (143, 3), но получен массив с формой(855, 3)

Вот краткое описание модели:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_50 (Conv1D)           (None, 285, 1000)         11001000  
_________________________________________________________________
conv1d_51 (Conv1D)           (None, 143, 1000)         7001000   
_________________________________________________________________
conv1d_52 (Conv1D)           (None, 143, 1000)         3001000   
_________________________________________________________________
dense_98 (Dense)             (None, 143, 128)          128128    
_________________________________________________________________
dropout_71 (Dropout)         (None, 143, 128)          0         
_________________________________________________________________
dense_99 (Dense)             (None, 143, 128)          16512     
_________________________________________________________________
dropout_72 (Dropout)         (None, 143, 128)          0         
_________________________________________________________________
dense_100 (Dense)            (None, 143, 128)          16512     
_________________________________________________________________
dropout_73 (Dropout)         (None, 143, 128)          0         
_________________________________________________________________
dense_101 (Dense)            (None, 143, 3)            387       
=================================================================

1 Ответ

0 голосов
/ 18 сентября 2018

Согласно вашему комментарию:

Да, это проблема классификации трех классов.У меня 855 тренировочных образцов и 214 тестовых образцов.Оба образца имеют 1000 символов размера.Ярлыки находятся в режиме «один горячий».Формы trX, trY, teX, teYY имеют вид (855,1000,1), (214,3,1), (214,1000,1), (214,3,1) соответственно ...

каждый образец с формой (1000,1) классифицируется как один из трех классов.Итак, чтобы сделать выходную форму сети совместимой с формой меток, вы должны использовать слой Flatten прямо перед первым плотным слоем:

model.add(Flatten())
model.add(Dense(128,activation='relu'))  
model.add(Dropout(0.3)) 

# ... the rest

Теперь выходная формамодели будет (None,3), и это именно то, что нам нужно.Вам также может понадобиться удалить последнюю ось меток, чтобы они имели форму (*,3) (а не (*,3,*)):

trY = np.squeeze(trY, axis=2)
teYY = np.squeeze(teYY, axis=2)

Далее, не забудьте мой комментарий о input_shape,Вы также должны исправить это.


В качестве примечания, наличие 1000 тысяч фильтров в каждом из трех слоев свертки (учитывая, что длина каждого обучающего образца равна 1000) может быть (очень)неэффективен.Вместо этого лучше использовать фильтры 32, 64, 128 или 256 (и увеличивать количество фильтров по мере углубления в модель).Кроме того, если вы хотите узнать больше о том, как работает 1D-свертка , этот ответ может вам помочь.

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