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

时间:2017-12-21 17:00:54

标签: python tensorflow deep-learning conv-neural-network deconvolution

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

Github Repository

目前,我的模型仅适用于大小相同的图像。我已经广泛使用了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')     

3 个答案:

答案 0 :(得分:5)

不幸的是,没有办法在Tensorflow中构建动态图表(您可以尝试使用fold,但这不在问题的范围内)。这为您提供了两个选项:

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

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

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

    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