嗨,我正在处理图像形状(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
答案 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)