Похоже, env_size()
и env()
размеры изображения беспорядка как-то. Рассмотрим этот пример:
image1 = np.random.rand(1, 1, 270, 480) #First dimension is batch size for test purpose
image2 = np.random.rand(1, 4, 268, 1) #Or any other arbitrary dimensions
input_img = layers.Input(shape=image1[0].shape)
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(32, (3, 3), activation='relu')(x)
x = layers.UpSampling2D((2, 2))(x)
decoded = layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
model = tf.keras.Model(input_img, decoded)
model.compile('adam', 'mean_squared_error')
model.summary()
Эта строка будет работать:
model.fit(image1, nb_epoch=1, batch_size=1)
Но это не
model.fit(image2, nb_epoch=1, batch_size=1)
Edit:
Чтобы получить выходные данные того же размера, что и входные данные, необходимо тщательно рассчитать размер ядра свертки.
image1 = np.random.rand (1, 1920, 1080, 1)
input_img = layers.Input(shape=image1[0].shape)
x = layers.Conv2D(32, 3, activation='relu', padding='same')(input_img)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(16, 3, activation='relu', padding='same')(x)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, 3, activation='relu', padding='same')(x)
encoded = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(8, 3, activation='relu', padding='same')(encoded)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(16, 3, activation='relu', padding='same')(x)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(32, 1, activation='relu')(x) # set kernel size to 1 for example
x = layers.UpSampling2D((2, 2))(x)
decoded = layers.Conv2D(1, 3, activation='sigmoid', padding='same')(x)
model = tf.keras.Model(input_img, decoded)
model.compile('adam', 'mean_squared_error')
model.summary()
Это выведет те же размеры.
Согласно данному руководству http://cs231n.github.io/convolutional-networks/
Мы можем вычислить пространственный размер выходного объема как функцию
размер входного тома (W), размер рецептивного поля слоя Conv
нейроны (F), шаг, с которым они применяются (S), и
количество использованного дополнения нулями (P) на границе. Вы можете убедить
Сами то, что правильная формула для расчета сколько нейронов
«Соответствие» задается как (W-F + 2P) / S + 1 . Например, для входа 7x7 и 3x3
отфильтровывая шаг 1 и площадку 0, мы получили бы выход 5x5. С шагом
2 мы бы получили выход 3х3.