1080×1920 для CNN слишком большой, как его оптимизировать?

#python #tensorflow #keras #neural-network

#python #тензорный поток #keras #нейронная сеть

Вопрос:

Я пытаюсь проанализировать скриншот из нашей среды, чтобы создать бота.

Ввод: скриншот 1080×1920

Вывод: влево, вправо, вверх, вниз, x_click, y_click, LeftMouseIsPressed

 def get_model():
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(64, 64), strides=(1, 1),
                     activation='relu',
                     input_shape=(1080,1920,1)))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
    model.add(Flatten())
    model.add(Dense(7, activation='softmax'))
    model.compile(loss=categorical_crossentropy,
              optimizer=SGD(lr=0.01),
              metrics=['accuracy'])
    return model
 
 OOM when allocating tensor with shape[1,1888569,4096]
 

Вопрос: Есть ли что-то, что я могу сделать, чтобы уменьшить размер моего ввода? Как люди справляются с этой проблемой?

Ответ №1:

Вам нужно будет уменьшить разрешение вашего изображения, чтобы соответствовать объему памяти, который у вас есть. Допустим, вы уменьшаете размер изображения на 8.

 from PIL import Image

im = Image.open("test.jpg") # 1080x1920 image 520K
foo = im.resize((135,240),Image.ANTIALIAS)
foo.save("test_135_240.jpg") #135x240 image 7.8K
 

Если у вас 1 М изображений, то это будет около 8 ГБ. Итак, вам нужно проверить, поместится ли это на вашей видеокарте. Не забывайте, что вам также понадобится место для преобразований.

Другая полезная информация здесь

Комментарии:

1. Почему бы и нет tf.image.resize(image, (height, width)) ? Тогда вы не добавляете другую зависимость

2. Честно говоря, я не знал, что tensorflow включил это.

Ответ №2:

Вы можете использовать tf.keras.layers...Resizing в качестве первого слоя, это уменьшит размер изображения:

 tf.keras.layers.experimental.preprocessing.Resizing(
    height, width
)
 

Уменьшите его, пока он не поместится в памяти.

Комментарии:

1. Именно то, что мне было нужно, спасибо! И хорошего Нового года 🙂