Я строю нейронную сеть для двоичной классификации изображений с использованием Python и TensorFlow . Я использую контейнер Docker для выполнения внутри кода (это стандартизирует мою среду разработки и производства), базовый образ - это изображение официального тензорного потока ( здесь ), и я просто установите требуемые минимальные пакеты.
Проблема в следующем, после того как я обучу net Я хочу создать конвейер для его загрузки новыми изображениями, не используя функцию flow_from_directory
, передавая каждое изображение в отдельности.
Структура сети в этом коде, пока процесс ее сохранения:
train_dir = 'data_set/train'
train_dir_A = os.path.join(train_dir, 'A')
train_dir_B = os.path.join(train_dir, 'B')
validation_dir = 'data_set/validation'
validation_dir_A = os.path.join(validation_dir, 'A')
validation_dir_B = os.path.join(validation_dir, 'B')
train_datagen = ImageDataGenerator( rescale = 1.0 / 255.0 )
dev_datagen = ImageDataGenerator( rescale = 1.0 / 255.0 )
test_datagen = ImageDataGenerator( rescale = 1.0 / 255.0 )
train_generator = train_datagen.flow_from_directory(train_dir,
batch_size = 20,
class_mode = 'binary',
target_size = (300,300))
validator_generator = test_datagen.flow_from_directory(validation_dir,
batch_size = 20,
class_mode = 'binary',
target_size = (300,300))
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1024, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# train the model
model.compile(optimizer=RMSprop(lr=0.001),
loss='binary_crossentropy',
metrics=['acc'])
history = model.fit_generator(train_generator,
validation_data = validator_generator,
steps_per_epoch = 100,
epochs = 15,
validation_steps = 50,
verbose=1)
model.save('results/model_v0')
model.summary()
Я пытаюсь передать новое изображение, выполнив это:
image_data = (ndimage.imread(ROUTE_TO_NEW_IMAGE).astype(float))
image_data = image_data / 255
data = image_data[np.newaxis, ...]
# load model
model = load_model(ROUTE_MODEL)
# summarize model.
model.summary()
# Predict
model.predict(data)
Сообщение об ошибке: ValueError: Error when checking input: expected conv2d_input to have shape (300, 300, 3) but got array with shape (375, 375, 4)
Вопрос в том, как я могу использовать эти изображения в качестве входных данных?
Наблюдения: размер всех изображения (оригинальные, те, которые я использую) одинаковы во всех случаях. Мне не нужен цвет, для меня не проблема адаптировать все для работы в оттенках серого.