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

Ну, я пытаюсь использовать maxpooling в качестве первого слоя на keras framework. Я работаю над MNIST известным набором данных по распознаванию цифр и имею проблемы с размерами ввода и вывода.

Вот мой сводка модели:

    Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_5 (Conv2D)            (None, 26, 26, 32)        320       
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 24, 24, 64)        18496     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 12, 12, 64)        0         
_________________________________________________________________
dropout_6 (Dropout)          (None, 12, 12, 64)        0         
_________________________________________________________________
flatten_3 (Flatten)          (None, 9216)              0         
_________________________________________________________________
dense_7 (Dense)              (None, 128)               1179776   
_________________________________________________________________
dropout_7 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_8 (Dense)              (None, 10)                1290      
=================================================================
Total params: 1,199,882
Trainable params: 1,199,882
Non-trainable params: 0

На последнем этапе я получил эту ошибку:

ValueError: Error when checking target: expected dense_8 to have a shape (1,) but got an array with shape (10,)

Я пытаюсь выполнить задачу классификации.

Это основная часть моей программы:

from keras.utils import to_categorical
num_class = 10

y_train = to_categorical(y_train, num_class)
y_test = to_categorical(y_test, num_class)
#
#Model created
from keras.models import Sequential
#Layers added
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D

model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3),
     activation = 'relu', #A “relu” activation stands for “Rectified Linear Units”, which takes the max of a value or zero
     input_shape=(img_rows, img_cols, 1)))
#
model.add(Conv2D(64, (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(Dropout(0.5))
model.add(Dense(num_class, activation='softmax'))
#“softmax” activation is used 
#when we’d like to classify the data into a number of pre-decided classes
model.compile(loss = 'sparse_categorical_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])
#
batch_size = 128
epochs = 10

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
model.save("test_model.h5")

1 Ответ

0 голосов
/ 25 октября 2019

Вы используете неправильную потерю, sparse_categorical_crossentropy требуются целочисленные метки, а не метки с горячим кодированием, поэтому вы можете просто использовать categorical_crossentropy как потерю, которая требует меток с горячим кодированием.

...