【问题标题】:Not able to get Softmax working in code无法让 Softmax 在代码中工作
【发布时间】:2019-06-25 17:10:04
【问题描述】:

您好,我正在使用图像形状 (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 (丢弃) (None, 65, 320, 3) 0


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


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


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


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


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


flat1(展平)(无,2112)0


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


drop2(丢弃)(无,100)0


Dense2(密集)(无,75)7575


drop3(辍学)(无,75)0


Dense3(密集)(无,10)760


softmax1(密集)(无,10)110

【问题讨论】:

  • X_train,y_train 的形状?
  • 您可以尝试使用 keras.utils.to_categorical(y, num_classes=None) 对 y 变量进行一次热编码。
  • 或者不要 one-hot 编码y_train 并使用'sparse_categorical_crossentropy' 作为损失函数。请参阅this answer 了解更多信息。
  • 使用了 'sparse_categorical_crossentropy' 并删除了错误,但结果为 loss = loss: nan

标签: python-3.x keras


【解决方案1】:

简介:

将 y_test 和 y_train 转换为分类。 Softmax 应该告诉每个类别的概率,该类别属于我们提供给神经网络的图像的百分比。所以你必须将你的 Y-test 转换为一个稀疏数组,其中所有的类都是零,真正的标签是 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]]So softmax 将能够给出概率每节课给你。在简单的 softmax 中,需要针对一个图像的数组,其中除真实标签外,所有元素均为 0。但是当 softmax 看到标签时它只是一个 1 元素,所以你会出现错误,即 softmax 正在寻找 10 元素数组但得到了 1 个元素。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多