首页 文章

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

提问于
浏览
11

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

Github Repository

目前,我的模型只适用于相同大小的图像 . 我已经广泛使用了tensorflow mnist tutorial来帮助我构建我的模型 . 在本教程中,我们仅使用28x28图像 . How would the following mnist model be changed to accept images of any size?

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 回答

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

    您提到的mnist模型代码是使用FC网络而不是卷积网络的示例 . [None,784]的输入形状是针对mnist尺寸(28 x 28)给出的 . 该示例是具有固定输入大小的FC网络 .

    您在FC网络中无法提出要求,因为权重和偏差的数量取决于输入形状 . 如果您使用完全卷积架构,这是可能的 . 所以我的建议是使用完全卷积结构,以便权重和偏差不依赖于输入形状

  • 1

    添加到@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
    

相关问题