15

我创建了一个深度卷积神经网络来对图像中的单个像素进行分类。我的训练数据将始终保持相同大小 (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')     
4

3 回答 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') 
于 2017-12-31T02:00:18.277 回答
1

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

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

于 2018-01-04T10:48:22.750 回答
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
于 2018-01-05T22:34:34.190 回答