Ошибка при проверке цели: ожидается, что плотность_2 имеет 2 измерения, но получен массив с формой (867, 44, 44) - PullRequest
0 голосов
/ 21 мая 2019

Я столкнулся с проблемой с "Ошибка при проверке цели: ожидалось, что плотность_2 имеет 2 измерения, но получен массив с формой (867, 44, 44)".

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

Я уже искал похожие вопросы по stackoverflow, но не смог их решить. Может кто-нибудь помочь мне, пожалуйста?

На вход выводятся несколько красочных картинок с высотой 46 и шириной 120, поэтому я установил вход с помощью (46,120,3).

Форма X_train: (1084, 46, 120, 3) Форма Y_train (которая является меткой) после перевода в одно горячее кодирование: (1084, 44, 44)

А детали предварительной обработки и модель приведены ниже:

model = Sequential()

X_train = X_train/255  Y_train = to_categorical(Y_train,num_classes = 44)

random_seed = 2 X_train, X_val, Y_train, Y_val = train_test_split(X_train, 
                Y_train, test_size = 0.2, random_state=random_seed)



model.add(Conv2D(filters=16,kernel_size=(5,5),padding='same',input_shape=(46,120,3),activation='relu',data_format
= 'channels_last')) 
model.add(Conv2D(filters=16,kernel_size=(5,5),padding='same',activation='relu'))

model.add(MaxPool2D(pool_size=(2,2),strides = (1,1))) 
model.add(Dropout(0.25))

model.add(Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu')) 
model.add(Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu'))

model.add(MaxPool2D(pool_size=(2,2),strides = (1,1))) model.add(Dropout(0.25))

model.add(Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu')) 
model.add(Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu'))

model.add(MaxPool2D(pool_size=(2,2),strides = (1,1))) 
model.add(Dropout(0.25))

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

model.add(Dense(44,activations='softmax'))

model.compile(loss='binary_crossentropy',
               optimizer='rmsprop',metrics=['accuracy']) 
model.summary()

# Set the learning rate annealer learning_rate_reduction = 
ReduceLROnPlateau(monitor='val_acc', 
                                            patience = 3,
                                            verbose = 1, 
                                            factor = 0.5, 
                                            min_lr = 0.00001) epochs = 100 batch_size = 86

model.fit(X_train,Y_train)  

ValueError: Ошибка при проверке цели: ожидается, что плотность_2 имеет 2 измерения, но получен массив с формой (867, 44, 44)

Кстати, плотность_2 - последний слой моей модели.

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Я исправляю проблему с удалением метода to_categorical () и использую binary_crossentropy в качестве потери.Поскольку каждый отдельный Y_train является двоичным вектором с формой (1,44), и если вы добавите еще один метод to_categorical (), он заставит форму каждого отдельного Y_train стать (1,44,44), я не будузнаю почему, и я все еще пытаюсь понять это.Но вот в чем проблема.Спасибо всем за помощь!

0 голосов
/ 21 мая 2019

Вы не можете ожидать, что надписи в 2D будут иметь плотный слой в качестве конечного результата. Так что либо вы хотите 2D-маркировку и вам нужен слой, который будет выводить 2D-тензор, либо вам нужно изменить Y_train на то, что может предсказать плотный слой.

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