我正在尝试使用TensorFlow来实现一个神经网络,该神经网络可以独立地处理图像的单独补丁。
我的网络由一个带有3个卷积层的内部网络组成,后面是2个完全连接的层,最后有10个输出神经元(10个类)。此内部网络独立应用于输入图像的不同块。
例如,对于32x32x3
输入图像,我希望我的网络以4像素的空间跨度拍摄图像的16x16x3
个色块,并将每个色块与其他色块分开处理。结果是一个25x10
张量,平均为整个网络的1x10
最终分类。
我当前的实现包括使用tf.extract_image_patches
创建单独的补丁,然后再通过内部网络传递,但结果非常慢。
有没有办法将整个内部网络定义为一种操作,然后我在图像上滑动,就像在单个卷积层使用过滤器一样?
批量大小为100的当前实施:
def model(data, k_rate=1.0):
# Patch extraction:
data_patches = tf.extract_image_patches(data,[1,NiN_size,NiN_size,1],[1,NiN_stride,NiN_stride,1],[1, 1, 1, 1], 'VALID')
NiN_data = tf.reshape(data_patches, [-1, NiN_size, NiN_size, 3])
# Convolutional layer 1:
conv_1 = tf.nn.conv2d(NiN_data, w1,
strides=[1, 1, 1, 1],
padding='SAME')
relu_1 = tf.nn.relu(conv_1 + b1)
.
.
.
.
# Fully-connected layer 5:
local_score = tf.matmul(drop_out, w5) + b5 # -> (2500,10)
reshape = tf.reshape(local_score, [batch_size, -1, num_labels]) # -> (100,25,10)
local_ptach_mean = tf.reduce_mean(reshape,1) # -> (100,10)
return local_ptach_mean
# Training computation:
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits( labels=labels, logits=model(dataset, k_rate))