Это не то, что я ожидал!
Я обучил CNN на SVHN .Точность близка к ~ 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
Есть 10 классов от 0 до 9. Буду ли я такженужно иметь 11-й класс, который имеет несколько случайных изображений?Но это звучит очень странно.Я выбрал неправильные функции потери / активации?