Для меня проблема связана с размером вашей сети, у вас есть только один Conv2D с размером фильтра 10. Это слишком мало, чтобы изучить глубокое воспроизведение вашего изображения.
Попробуйте увеличитьэто много благодаря использованию блоков с общей архитектурой, таких как VGGnet!
Пример блока:
x = Conv2D(32, (3, 3) , padding='SAME')(model_input)
x = LeakyReLU(alpha=0.3)(x)
x = BatchNormalization()(x)
x = Conv2D(32, (3, 3) , padding='SAME')(x)
x = LeakyReLU(alpha=0.3)(x)
x = BatchNormalization()(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dropout(0.25)(x)
Вам нужно попробовать несколько таких блоков и увеличить размер фильтра, чтобы охватить более глубокие функции.
Другое дело, вам не нужно указывать input_dim вашего плотного слоя, keras автоматически позаботится об этом!
И последнее, но не менее важное: вам необходимо полностью подключить сеть, чтобыправильно классифицировать ваши изображения, а не только один слой.
Например:
x = Flatten()(x)
x = Dense(256)(x)
x = LeakyReLU(alpha=0.3)(x)
x = Dense(128)(x)
x = LeakyReLU(alpha=0.3)(x)
x = Dense(2)(x)
x = Activation('softmax')(x)
Попробуйте эти изменения и держите меня в курсе!
Обновите после вопросов оп
Изображения сложны, они содержат многоинформация, такая как формы, края, цвета и т. д.
Для того, чтобы получить максимум информации, вам необходимо пройти через множество сверток, которые изучат различные аспекты изображения.Представьте, что, как, например, первая свертка научится распознавать квадрат, вторая - распознавать круги, третья - распознавать ребра и т. Д.сеть conv будет выводить вектор, который «представляет» собаку или кошку, теперь вам нужно узнать, что этот тип вектора относится к одному или другому классу.
И прямая подача этого вектора в последний слой не являетсядостаточно, чтобы выучить это представление.
Это более понятно?
Последнее обновление для второго комментария op
Здесь два способа определения модели Keras, оба выводят одно и то же!
model_input = Input(shape=(200, 1))
x = Dense(32)(model_input)
x = Dense(16)(x)
x = Activation('relu')(x)
model = Model(inputs=model_input, outputs=x)
model = Sequential()
model.add(Dense(32, input_shape=(200, 1)))
model.add(Dense(16, activation = 'relu'))
Пример архитектуры
model = Sequential()
model.add(keras.layers.InputLayer(input_shape=input_shape))
model.add(keras.layers.convolutional.Conv2D(32, (3,3), strides=(2, 2), padding='same', activation='relu'))
model.add(keras.layers.convolutional.Conv2D(32, (3,3), strides=(2, 2), padding='same', activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.convolutional.Conv2D(64, (3,3), strides=(2, 2), padding='same', activation='relu'))
model.add(keras.layers.convolutional.Conv2D(64, (3,3), strides=(2, 2), padding='same', activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation='relu'))
model.add(keras.layers.Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Не забудьте нормализовать свои данные перед подачей в сеть.
Простые images_full = images_full / 255.0
ваших данных могут значительно повысить вашу точность.
Попробуйте и с изображениями в оттенках серого, это более эффективно для вычислений.