Ошибка при проверке цели: ожидается, что плотность_3 будет иметь форму (256,), но получен массив с формой (1,) - PullRequest
1 голос
/ 16 мая 2019

Я работаю над обучением VGG16-подобной модели в Керасе, пытаюсь предсказать значение продолжения / времени события (регрессия), имеющее в качестве входных изображений, и столкнулся со следующей ошибкой:

Ошибка при проверке цели: ожидается, что плотность_3 будет иметь форму (256,), но получил массив с формой (1,)

Это структура модели:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 256, 256, 64)      1792      
_________________________________________________________________
batch_normalization_1 (Batch (None, 256, 256, 64)      256       
_________________________________________________________________
.
.
.

_________________________________________________________________
conv2d_16 (Conv2D)           (None, 16, 16, 512)       2359808   
_________________________________________________________________
batch_normalization_16 (Batc (None, 16, 16, 512)       2048      
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 8, 8, 512)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 32768)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 1000)              32769000  
_________________________________________________________________
dense_2 (Dense)              (None, 1000)              1001000   
_________________________________________________________________
dense_3 (Dense)              (None, 256)               256256    

Total params: 54,072,656
Trainable params: 54,061,648
Non-trainable params: 11,008

Я попытался добавить еще один слой в конце только с одним нейроном, и, похоже, это работает, но я не думаю, что это правильный способ сделать это. Я читал о подобной проблеме, но мне не удалось найти решение.

Последние слои модели построены по коду ниже

#Convolution Layer
#input: 64x64x128, image with 128 channels, appy 256 convolution filters
model.add(Conv2D(512, kernel_size=3, activation='relu',padding='same' ))
#the output of the layer above is 64x64x256

#Normalization layer
model.add(BatchNormalization())

#Convolution Layer
#input: 64x64x128, image with 128 channels, appy 256 convolution filters
model.add(Conv2D(512, kernel_size=3, activation='relu',padding='same' ))
#the output of the layer above is 64x64x256

#Normalization layer
model.add(BatchNormalization())

#Max-Pooling
#poolsize:(2,2), factors by which to downscale (vertical, horizontal)
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering="tf"))

#Flatten layer
model.add(Flatten())

#Fully connected layer 
#number of neurons is chosen randomly
model.add(Dense(1000, activation='relu'))

#Fully connected layer 
model.add(Dense(1000, activation='relu'))


#Fully connected layer 
model.add(Dense(256, activation='softmax'))

model.summary()


#Compile model
model.compile(loss='categorical_crossentropy', optimizer='adagrad')

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

1 Ответ

0 голосов
/ 16 мая 2019
model.add(Dense(256, activation='relu'))
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adagrad')

Измените свой последний, кроме одного слоя, на активацию relu и, наконец, добавьте один слой линейной активации.Используйте потерю MSE, поскольку это проблема регрессии.

...