Tensorflow CNN训练图像都是不同的大小

Dev*_*lam 12 python deep-learning conv-neural-network tensorflow deconvolution

我创建了一个深度卷积神经网络来对图像中的各个像素进行分类.我的训练数据总是相同的大小(32x32x7),但我的测试数据可以是任何大小.

Github存储库

目前,我的模型只适用于相同大小的图像.我已经广泛使用了tensorflow mnist 教程来帮助我构建我的模型.在本教程中,我们仅使用28x28图像.如何更改以下mnist模型以接受任何大小的图像?

 x = tf.placeholder(tf.float32, shape=[None, 784])
 y_ = tf.placeholder(tf.float32, shape=[None, 10])
 W = tf.Variable(tf.zeros([784,10]))
 b = tf.Variable(tf.zeros([10]))
 x_image = tf.reshape(x, [-1, 28, 28, 1])
Run Code Online (Sandbox Code Playgroud)

为了使事情变得更复杂,我的模型已经转置了需要指定输出形状的卷积.如何调整以下代码行,以便转置卷积将输出与输入大小相同的形状.

  DeConnv1 = tf.nn.conv3d_transpose(layer1, filter = w, output_shape = [1,32,32,7,1], strides = [1,2,2,2,1], padding = 'SAME')     
Run Code Online (Sandbox Code Playgroud)

gid*_*dim 5

不幸的是,没有办法在Tensorflow中构建动态图形(您可以尝试使用折叠,但这不在问题的范围内).这有两个选择:

  1. Bucketing:您可以用几个手工挑选的尺寸创建多个输入张量,然后在运行时选择正确的桶(参见示例).无论哪种方式,你可能都需要第二种选择.Seq2seq与bucketing

  2. 调整输入和输出图像的大小.假设图像都保持相同的宽高比,您可以尝试在推断之前调整图像大小.不知道为什么你关心输出,因为MNIST是一个分类任务.

无论哪种方式,您都可以使用相同的方法:

from PIL import Image

basewidth = 28 # MNIST image width
img = Image.open('your_input_img.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)

# Save image or feed directly to tensorflow 
img.save('feed_to_tf.jpg') 
Run Code Online (Sandbox Code Playgroud)