gpt4 book ai didi

machine-learning - 为什么在 mnist fasion keras 代码中,softmax 工作正常,但 sigmoid 工作不正常?

转载 作者:行者123 更新时间:2023-11-30 09:15:56 26 4
gpt4 key购买 nike

我有简单的 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

现在,正如您在最后一层中看到的那样,我使用了“sigmoid”,但由于它是多标签分类,所以我想使用 sigmoid。但如果我这样做,我会收到以下错误。

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

这里有什么解决办法吗?

最佳答案

loss='binary_crossentropy' 更改为 loss='sparse_categorical_crossentropy'

当标签为one-hot encoded时使用categorical_crossentropy 。否则,请使用sparse_categorical_crossentropy

binary_crossentropy 用于两个类别的情况,它输出单个神经元(或者在多输出分类的情况下,它可以输出多个神经元)。例如,如果神经元的值大于0.5,则您选择类1,否则您选择类0(或者您不选择类0)如果该值低于某个阈值,则选择任何类别)。

此外,在某些 keras/tf.keras 版本中,时尚 MNIST 没有提供 channel 维度,因此您应该手动添加它:

x_train, x_test = np.expand_dims(x_train, -1), np.expand_dims(x_test, -1)

关于machine-learning - 为什么在 mnist fasion keras 代码中,softmax 工作正常,但 sigmoid 工作不正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56021357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com