首页 > 解决方案 > 无法让 Softmax 在代码中工作

问题描述

嗨,我正在使用图像形状 (160,320,3),我已经设置了下面的代码并希望使用 Softmax 函数结束它,但是出现如下错误“ ValueError:检查目标时出错:预期 softmax1 具有形状 (10,)但得到了形状为 (1,) 的数组

请看以下代码:

model = Sequential()

with tf.name_scope("Lamda"):
    model.add(Lambda(lambda x: (x / 255.0) - 0.5, input_shape=(160,320,3), name='lamda1'))
with tf.name_scope("Cropping"):
    model.add(Cropping2D(cropping=((70,25), (0,0)), input_shape=(160,320,3), name='crop1'))
with tf.name_scope("Drop"):
    model.add(Dropout(0.5, name='drop1'))
with tf.name_scope("conv"):
    model.add(Convolution2D(24, (5,5), activation="relu", strides=(2, 2), name='conv1'))
    model.add(Convolution2D(36, (5,5), activation="relu", strides=(2, 2), name='conv2'))  
    model.add(Convolution2D(48, (5,5), activation="relu", strides=(2, 2), name='conv3'))
    model.add(Convolution2D(64, (3,3), activation="relu", name='conv4'))
    model.add(Convolution2D(64, (3,3), activation="relu", name='conv5'))
with tf.name_scope("Flat"):
    model.add(Flatten(name='flat1'))
with tf.name_scope("Dencity"):
    model.add(Dense(100, name='Dense1'))
with tf.name_scope("Drop"):
    model.add(Dropout(0.2, name='drop2'))
with tf.name_scope("Dencity"):
    model.add(Dense(75, name='Dense2'))
with tf.name_scope("Drop"):
    model.add(Dropout(0.2, name='drop3'))
with tf.name_scope("Dencity"):
    model.add(Dense(10, name='Dense3'))
with tf.name_scope("Soft"):
    model.add(Dense(10, activation="softmax", name='softmax1'))

model.summary()

with tf.name_scope("Loss"):
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, validation_split=0.2, shuffle=True, epochs=EPOCHS, batch_size=BATCH_SIZE, callbacks=[cb], verbose=2)

模型摘要显示输出形状为 10,并尝试了各种模式,但仍然遇到同样的问题,非常感谢一些支持和指导,因为我是 Keras 的新手。


层(类型)输出形状参数#

lamda1 (Lambda) (无, 160, 320, 3) 0


crop1 (Cropping2D) (无, 65, 320, 3) 0


drop1(丢弃)(无、65、320、3)0


conv1 (Conv2D) (无, 31, 158, 24) 1824


conv2 (Conv2D) (无, 14, 77, 36) 21636


conv3 (Conv2D) (无, 5, 37, 48) 43248


conv4 (Conv2D) (无, 3, 35, 64) 27712


conv5 (Conv2D) (无, 1, 33, 64) 36928


flat1(展平)(无,2112)0


密集1(密集)(无,100)211300


drop2(丢弃)(无,100)0


密集2(密集)(无,75)7575


drop3(辍学)(无,75)0


密集3(密集)(无,10)760


softmax1(密集)(无,10)110

标签: python-3.xkeras

解决方案


介绍:

将您的 y_test 和 y_train 转换为分类。Softmax 应该告诉每个类别的概率,该类别属于我们提供给神经网络的图像的百分比。因此,您必须将 Y 检验转换为一个稀疏数组,其中所有类都为零,真实标签为 1。

就像我有 3 个类(1.cat、2.dog、3.goat)一样,我喂了一张狗的图像,它在数组中的标签将为 2。但是当我将它转换为分类数组时,它就变成了。[0,1,0] 现在当 softmax 预测这个图像时,它变成了。[0.12,0.98,0.11] 表示其

0.12% 与猫相似 0.98% 与狗相似 0.11% 与山羊相似

这就是 softmax 给我们预测的方式。

问题:

现在你的问题是你的 y_test 以 [1,2,3] 的形式,但是 softmax 要求它们将是一个针对每个标签的 3 元素数组。也就是说[[1,0,0],[0,1,0],[0,0,1]],softmax 将能够为你提供每个类的概率。在简单的 softmax 中,需要针对一个图像的数组,其中除真实标签外,所有元素均为 0。但是当 softmax 看到标签时它只是一个 1 元素,所以你的错误出现了,softmax 正在寻找 10 元素数组但得到了 1 个元素。

解决方案: 添加此行代码,这会将您的每个图像标签转换为您的 softmax 所需的 10 元素数组。

from keras.utils import np_utils
y_train = np_utils.to_categorical(y_train)

推荐阅读