Tensorflow卷积神经网络训练图像大小不一。

16

我创建了一种深度卷积神经网络,用于对图像中的每个像素进行分类。我的训练数据始终是相同的尺寸(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])

为了让事情变得更加复杂,我的模型具有需要指定输出形状的转置卷积。我应该如何调整下面这行代码,以便转置卷积将输出与输入大小相同的形状。

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

通常情况下,您应该使用相同的流程将数据输入到分类系统中进行训练和推断。您如何生成32x32x7图像?无论您的任务是什么,都可以使用相同的技术将数据输入到分类系统中。 - RagingRoosevelt
3个回答

6
很不幸,在Tensorflow中没有办法构建动态图表(您可以尝试使用fold,但这超出了问题的范围)。这给你留下了两个选择:
  1. 桶:您创建多个手动选择的大小的输入张量,然后在运行时选择正确的桶(请参见示例)。无论如何,您可能需要第二个选项。带有桶的Seq2seq

  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') 

1
忘记我之前关于最小数据的说法,我如何实现可变大小的输入以完成我的任务?在论文中提到,他们使用反卷积以实现任意大小的输入。然而,当我像在我的问题中所看到的那样使用反卷积时,我需要指定一个输出大小。 - Devin Haslam

1
你提到的mnist模型代码是使用全连接网络的示例,而不是卷积网络。[None,784]的输入形状是为了适应mnist数据集大小(28 x 28)而给出的。该示例是一个具有固定输入大小的全连接网络。
在全连接网络中,权重和偏差的数量取决于输入形状,所以你所要求的是不可能实现的。如果你使用完全卷积结构,则可以实现这一点。因此,我的建议是使用完全卷积结构,以便权重和偏差不依赖于输入形状。

1

@gidim的回答的基础上,以下是如何调整Tensorflow中的图像大小,并直接将结果馈送到推理中。注意:此方法会缩放和扭曲图像,可能会增加损失。

所有功劳归功于Prasad Pai的数据增强文章

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

你如何使用TF加载数据,然后使用resize?因为Pillow解码不是数值精确的。 - Echo9k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接