【发布时间】:2019-04-20 06:07:35
【问题描述】:
这不是我所期望的!
我已经在SVHN 上训练了一个 CNN。准确度接近 ~0.93,总体而言,在单个数字图像上测试时效果非常好。因此,如果我使用包含单个数字的图像测试模型,如下所示:
它适用于接近1 的预期类别概率。但是,如果我为模型提供诸如 house 或 lion 之类的随机图像,它仍然会预测一个概率接近 1 的类别。我无法理解其原因。它应该预测每个类的概率非常低。
这是我创建网络的方式。
import tensorflow.keras as keras
model = keras.Sequential()
# First Conv Layer
model.add(keras.layers.Conv2D(filters = 96, kernel_size = (11,11), strides = (4,4), padding = "same", input_shape=(227,227,3)))
model.add(keras.layers.Activation("relu"))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPooling2D(pool_size = (3,3), strides = (2,2), padding="same"))
# .. More Convolution Layer ...
# .. SOME Fully Connected Layers ..
# Final Fully Connected Layer
model.add(keras.layers.Dense(10))
model.add(keras.layers.Activation("softmax"))
model.compile(loss="categorical_crossentropy", optimizer=keras.optimizers.RMSprop(lr=0.0001), metrics=['accuracy'])
data_generator = keras.preprocessing.image.ImageDataGenerator(rescale = 1./255)
train_generator = data_generator.flow_from_directory(
'train',
target_size=(227, 227),
batch_size=batch_size,
color_mode='rgb',
class_mode='categorical'
)
model.fit_generator(
train_generator
epochs = 12,
steps_per_epoch = math.ceil(num_train_samples / batch_size),
verbose = 2
)
从我上面分享的代码也可以看出,我使用过:
- 损失函数为
categorical_crossentropy - 最后一层激活函数为
softmax
从 0 到 9 有 10 个班级。我是否还需要第 11 个班级有一些随机图像?但这听起来很奇怪。我是否选择了不正确的损失/激活函数?
【问题讨论】:
-
你应该调低你的期望值,这个模型除了数字之外从来没有见过任何东西,所以它不适用于负样本。贝叶斯模型可能效果更好。
-
图像识别的前提是你展示的图像是可以识别的。
-
@TheLoneDeranger 当然。但即使模型没有看到示例,我也不会期望负示例的概率接近 1。
标签: python tensorflow keras computer-vision conv-neural-network