Целевой массив с формой (6400, 1) был передан для вывода формы (None, 2) при использовании в качестве потерь `binary_crossentropy`
Я пишу код CNN, но столкнулся с ошибкой. Я использую среду Anaconda Python в pycharm 2020.1 Код:
train_img,test_img,train_label,test_label = train_test_split(training_data,id,test_size = 0.20, random_state = 2)
train_img = np.expand_dims(train_img, axis=3)
#train_img = np.reshape(train_img , (6400,300,300,1))
print('train img',train_img.shape)
print('test img',test_img.shape)
train_label = np.array(train_label)
test_label = np.array(test_label)
print('train label',train_label.shape)
print('test label',test_label.shape)
# Applying CNN
# layer 1
my_model = tf.keras.models.Sequential()
my_model.add(tf.keras.layers.Conv2D(3, kernel_size=3, strides = 1,padding ='valid', input_shape = (300,300, 1)))
# layer 2
my_model.add(tf.keras.layers.Conv2D(3, kernel_size=3, strides = 1,padding ='valid'))
# layer 3
my_model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))
# layer 4
my_model.add(tf.keras.layers.Conv2D(5, kernel_size=3, strides = 1,padding ='valid'))
# layer 5
my_model.add(tf.keras.layers.ReLU())
# layer 6
my_model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))
# fully connected layer
my_model.add(tf.keras.layers.Flatten())
my_model.add(tf.keras.layers.Dense(1024, activation= "relu"))
my_model.add(tf.keras.layers.Dense(2, activation= "relu"))
my_model.summary()
# For compilation, training and making new predictions:
my_model.compile(optimizer="adam",loss="binary_crossentropy",metrics=['acc'])
my_model.fit(train_img,train_label,batch_size=5,epochs=10)
my_predictions = my_model.predict(test_img)
print(my_predictions)
Ошибка в коде:ValueError: A target array with shape (6400, 1) was passed for an output of shape (None, 2) while using as loss "binary_crossentropy". This loss expects targets to have the same shape as the output.
Я проверил некоторые методы изменения формы матрицы, но у меня нет матрицы для изменения формы с 6400,1 на 6400,2, но возможно только обратное. Пожалуйста, предложите мне решение этой ошибки.
1 ответ
Решение
Бинарная классификация требует, чтобы последний слой был плотным только с одним нейроном с активацией sigmoid
my_model.add(tf.keras.layers.Dense(1, activation= "sigmoid"))