Keras-边界上具有值的填充张量

时间:2018-08-12 15:00:34

标签: tensorflow image-processing keras padding conv-neural-network

我的图像尺寸不均匀,所以当卷积将图像缩小2倍,然后我进行.test时,就得不到一致的尺寸,这是一个问题。

所以我认为我应该在中间张量上填充额外的行和列,其值与边缘上看到的值相同,以最大程度地减少干扰。我如何在Keras中做到这一点,甚至有可能吗?我有什么选择?

1 个答案:

答案 0 :(得分:2)

使用Tensorflow作为背景,您可以使用tf.concat()向张量中添加行/列的副本。

假设您要复制最后一行/列:

import tensorflow as tf
from keras.layers import Lambda, Input
from keras.models import Model
import numpy as np

def duplicate_last_row(tensor):
    return tf.concat((tensor, tf.expand_dims(tensor[:, -1, ...], 1)), axis=1)

def duplicate_last_col(tensor):
    return tf.concat((tensor, tf.expand_dims(tensor[:, :, -1, ...], 2)), axis=2)

# --------------
# Demonstrating with TF:

x = tf.convert_to_tensor([[[1, 2, 3], [4, 5, 6]],
                          [[10, 20, 30], [40, 50, 60]]])

x = duplicate_last_row(duplicate_last_col(x))
with tf.Session() as sess:
    print(sess.run(x))
# [[[ 1  2  3  3]
#   [ 4  5  6  6]
#   [ 4  5  6  6]]
#
#  [[10 20 30 30]
#   [40 50 60 60]
#   [40 50 60 60]]]


# --------------
# Using as a Keras Layer:

inputs = Input(shape=(5, 5, 3))
padded = Lambda(lambda t: duplicate_last_row(duplicate_last_col(t)))(inputs)

model = Model(inputs=inputs, outputs=padded)
model.compile(optimizer="adam", loss='mse', metrics=['mse'])
batch = np.random.rand(2, 5, 5, 3)
x = model.predict(batch, batch_size=2)
print(x.shape)
# (2, 6, 6, 3)