ValueError: Ошибка при проверке цели: ожидается, что плотность_3 будет иметь 2 измерения.Но я указал плотность_3, чтобы иметь 1 измерение - PullRequest
0 голосов
/ 02 января 2019

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

ValueError: Error when checking target: expected dense_3 to have 2 dimensions, but got array with shape (1, 10, 1)

, но я указал плотность_3, чтобы иметь 1 измерение, вот мой код:

X_train=X_train.reshape(1,10,200,200)
y_train=y_train.reshape(1,10,1)

model = Sequential()
model.add(Convolution2D(32, 3, 3, activation='relu', input_shape=(10,200,200)))
model.add(Convolution2D(32, 3, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

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

model.fit(X_train, y_train, 
      batch_size=3, epochs=100, verbose=1)

Даже если я изменю данные Y на 2 измерения, это не работает, и я получаю:

ValueError: Error when checking target: expected dense_3 to have 2 dimensions, but got array with shape (1, 10, 2)

То, что я в основном не понимаю, это то, что в другом проекте я сделал то же самое, и это сработало.

1 Ответ

0 голосов
/ 02 января 2019

Вы можете увидеть model.summary(), который кроме формы вывода равен (?,1). Но ваша форма y_train равна (1,10,1).

Таким образом, вы либо настраиваете y_train на (?,1), либо настраиваете модель в соответствии со своими входами в зависимости от ваших потребностей.

print(model.summary())
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 8, 198, 32)        57632     
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 6, 196, 32)        9248      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 3, 98, 32)         0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 3, 98, 32)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 9408)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               1204352   
_________________________________________________________________
dense_2 (Dense)              (None, 64)                8256      
_________________________________________________________________
dropout_2 (Dropout)          (None, 64)                0         
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 65        
=================================================================
Total params: 1,279,553
Trainable params: 1,279,553
Non-trainable params: 0
_________________________________________________________________

Редактировать

Вы должны изменить Flatten() слой и структуру модели, если вы используете 2 измерения. Поскольку я не знаю, какая структура сети вам нужна, я не могу исправить это для вас. Конечно, вы также можете оставить y_train равным (1,10,1). Пытаясь следовать ему.

model.add(Dense(10, activation='sigmoid'))
model.add(Reshape((10,1)))

Я рекомендую изменить y_train в соответствии с исходной структурой. Вы можете полностью изменить y_train на (?,10).

# shape=(?,10)
y_train=y_train.reshape(1,10)
# change shape
model.add(Dense(10, activation='sigmoid'))
...