我在处理由2D图像组成的数据样本时使用卷积层。滤波器的形状之一是1x2,它作用于由两个相邻像素组成的1x2连续块。如果我想要一个同时作用于2个像素的滤波器,但这两个像素之间隔了另外一个像素怎么办?在神经网络中是否可能对这样的卷积滤波器进行编码?
我在处理由2D图像组成的数据样本时使用卷积层。滤波器的形状之一是1x2,它作用于由两个相邻像素组成的1x2连续块。如果我想要一个同时作用于2个像素的滤波器,但这两个像素之间隔了另外一个像素怎么办?在神经网络中是否可能对这样的卷积滤波器进行编码?
这里有一些示例代码,它定义了Conv2d的内核和一个5x5的掩码,只允许中心和外部值通过。
image = np.array( range(25) ).reshape([1,5,5,1] ).astype( float )
kern = tf.Variable( tf.ones( [5,5,1,1] , dtype=tf.float32) )
mask = np.array([[ 1, 1, 1, 1, 1],
[ 1, 0, 0, 0, 1],
[ 1, 0, 1, 0, 1],
[ 1, 0, 0, 0, 1],
[ 1, 1, 1, 1, 1]]).reshape( [5,5,1,1] )
mask_variable = tf.constant( mask , dtype=tf.float32 )
output = tf.nn.conv2d( image , kern , strides=[1,1,1,1] , padding="VALID" )
output_with_mask = tf.nn.conv2d( image , kern * mask , strides=[1,1,1,1] , padding="VALID" )
print("Using whole kernal :",output.numpy())
print("Using kernal with a mask :",output_with_mask.numpy())
输出结果
Using whole kernal : [[[[ 300.]]]]
Using kernal with a mask : [[[[ 204.]]]]
def conv_weight_variable(w, h, in_ch, out_ch, learn):
d = 1.0 / np.sqrt(in_ch * w * h)
initial = tf.truncated_normal([w, h, in_ch, out_ch], stddev=d)
return tf.Variable(initial, trainable=learn), iEnd
def conv_bias_variable(w, h, in_ch, out_ch, learn):
d = 1.0 / np.sqrt(in_ch * w * h)
initial = tf.constant([0.1*d]*out_ch, dtype=tf.float32)
return tf.Variable(initial, trainable=learn), iEnd
def relu_conv_layer(input, in_ch, out_ch, learn):
W, iEnd = conv_weight_variable(3, 3, in_ch, out_ch, learn)
o = np.zeros((in_ch, out_ch), np.float32)
i = np.ones((in_ch, out_ch), np.float32)
maskW = np.array([[ o, i, i],
[ i, i, i],
[ i, i, o]])
maskW = tf.constant(maskW, dtype=tf.float32)
b, iEnd = conv_bias_variable(3, 3, in_ch, out_ch, learn)
conv = tf.nn.conv2d(input, W * maskW, strides=[1, 1, 1, 1], padding='SAME')
o = np.zeros(out_ch, np.float32)
i = np.ones(out_ch, np.float32)
maskO = np.array([[ i, i, i, i, i, i, i, i],
[ i, i, i, i, i, i, i, o],
[ i, i, i, i, i, i, o, o],
[ i, i, i, i, i, o, o, o],
[ i, i, i, i, o, o, o, o],
[ i, i, i, o, o, o, o, o],
[ i, i, o, o, o, o, o, o],
[ i, o, o, o, o, o, o, o]])
maskO = tf.constant(maskO, dtype=tf.float32)
return tf.nn.relu(conv + b)*maskO, W, b, iEnd
任意过滤器(权重放置在任何位置)不可用,但存在一种称为空洞卷积的有限但有用的版本,它将权重放置在稀疏网格上,可以处理您的特定示例。
例如,在您的情况下,您可以尝试
W = tf.Variable(tf.random_uniform((1, 2, n_in, n_out))
tf.nn.atrous_conv2d(value, W, (1, 2), 'SAME')