无法使Softmax在代码中工作

时间:2018-07-15 09:46:29

标签: python-3.x keras

嗨,我正在处理图像形状(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(Flatten)(无,2112)0


Dense1(Dense)(None,100)211300


drop2(退出)(无,100)0


Dense2(Dense)(无,75)7575


drop3(退出)(无,75)0


Dense3(密集)(无,10)760


softmax1(密集)(无,10)110

1 个答案:

答案 0 :(得分:0)

简介:

将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)