我创建了一个深度卷积神经网络来对图像中的各个像素进行分类。我的训练数据总是相同的大小(32x32x7),但我的测试数据可以是任何大小。
目前,我的模型仅适用于大小相同的图像。我已经广泛使用了tensorflow mnist tutorial来帮助我构建我的模型。在本教程中,我们仅使用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])
为了使事情变得更复杂一点,我的模型已经转换了需要指定输出形状的卷积。如何调整以下代码行,以便转置卷积将输出与输入大小相同的形状。
DeConnv1 = tf.nn.conv3d_transpose(layer1, filter = w, output_shape = [1,32,32,7,1], strides = [1,2,2,2,1], padding = 'SAME')
答案 0 :(得分:5)
不幸的是,没有办法在Tensorflow中构建动态图表(您可以尝试使用fold,但这不在问题的范围内)。这为您提供了两个选项:
Bucketing:您可以在几个手工挑选的尺寸中创建多个输入张量,然后在运行时选择正确的铲斗(参见示例)。无论哪种方式,您都可能需要第二种选择。 Seq2seq with bucketing
调整输入和输出图像的大小。 假设图像都保持相同的宽高比,您可以尝试在推断之前调整图像大小。不知道为什么你关心输出,因为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')
答案 1 :(得分:1)
您提到的mnist模型代码是使用FC网络而不是卷积网络的示例。 [None,784]的输入形状是针对mnist尺寸(28 x 28)给出的。该示例是具有固定输入大小的FC网络。
在FC网络中无法提出要求,因为权重和偏差的数量取决于输入形状。如果您使用完全卷积架构,这是可能的。所以我的建议是使用完全卷积架构,以便权重和偏差不依赖于输入形状
答案 2 :(得分:0)
添加到@gidim's answer,您可以在此处调整Tensorflow中图片的大小,并将结果直接提供给您的推理。注意:此方法会缩放和扭曲图像,这可能会增加您的损失。
所有赠送金额都归Prasad Pai's article on Data Augmentation。
import tensorflow as tf
import numpy as np
from PIL import Image
IMAGE_SIZE = 32
CHANNELS = 1
def tf_resize_images(X_img_file_paths):
X_data = []
tf.reset_default_graph()
X = tf.placeholder(tf.float32, (None, None, CHANNELS))
tf_img = tf.image.resize_images(X, (IMAGE_SIZE, IMAGE_SIZE),
tf.image.ResizeMethod.NEAREST_NEIGHBOR)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
# Each image is resized individually as different image may be of different size.
for index, file_path in enumerate(X_img_file_paths):
img = Image.open(file_path)
resized_img = sess.run(tf_img, feed_dict = {X: img})
X_data.append(resized_img)
X_data = np.array(X_data, dtype = np.float32) # Convert to numpy
return X_data