Почему softmax работает нормально, но не сигмоидально в коде mnist fasion keras? - PullRequest
1 голос
/ 07 мая 2019

У меня есть простой код Keras для классификации по нескольким меткам,

from keras.models import Sequential
from keras.layers import Conv2D, GlobalAveragePooling2D, Dense, MaxPooling2D, Flatten
from keras.callbacks import EarlyStopping
import keras

(x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data()
model = Sequential()

model.add(Conv2D(64, (3,3), activation='relu', padding='same', input_shape=(x_train.shape[1],x_train.shape[2],1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
#model.add(Dense(128, activation='relu'))

model.add(Dense(10, activation='softmax'))

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

model.summary()

Сводка, enter image description here

Теперь, как вы можете видеть на последнем слоеЯ использовал «сигмоид», но так как это классификация по нескольким меткам, я хочу использовать сигмоид.Но я получаю следующую ошибку, если я делаю то же самое.

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

Что может быть здесь исправлено?

1 Ответ

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

Измените loss='binary_crossentropy' на loss='sparse_categorical_crossentropy'.

Используйте categorical_crossentropy, если метки имеют однократное кодирование .В противном случае использование sparse_categorical_crossentropy.

binary_crossentropy используется в случае двух классов и выдает один нейрон (или в случае классификации с несколькими выходами может выводить более одного нейрона).Например, если значение нейрона больше 0.5, чем вы выбираете класс 1, в противном случае вы выбираете класс 0 (или вы не выбираете какой-либо класс, если значение ниже некоторого порогового значения).

Кроме того, в некоторых версиях keras / tf.keras модный MNIST указывается без измерения каналов, поэтому его следует добавить вручную:

x_train, x_test = np.expand_dims(x_train, -1), np.expand_dims(x_test, -1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...