python-3.x - 无法让 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
解决方案
介绍:
将您的 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)
推荐阅读
- machine-learning - 分层K折后怎么办?
- javascript - 如何用单一功能在单页中实现多类型元素
- postgresql - 尝试克隆 postgres 数据库时出错(pg_dump、pg_restore)
- python - 有没有人尝试过使用“NuScenes 数据集”?
- flutter - 如何:根据传入数据更新(并允许更改)下拉菜单
- sql - SQL 更新多个值
- reactjs - 在子路由上找不到反应构建静态
- java - 删除语句后的 Spring 事务管理回滚
- python - 如何在神经网络训练进行时显示预测值
- python - 找不到 pywin32>=223 的匹配分布(来自 pypiwin32->-r /tmp/app/requirements.txt