具有不同大小图像的Tensorflow输入数据集

具有不同大小图像的Tensorflow输入数据集,tensorflow,input,Tensorflow,Input,我正在尝试使用不同大小的输入图像来训练一个完全卷积的神经网络。我可以通过在训练图像上循环并在每次迭代时创建一个numpy输入来实现这一点,即 for image_input, label in zip(image_data, labels): train_input_fn = tf.estimator.inputs.numpy_input_fn( x= {"x":image_input},

我正在尝试使用不同大小的输入图像来训练一个完全卷积的神经网络。我可以通过在训练图像上循环并在每次迭代时创建一个numpy输入来实现这一点,即

for image_input, label in zip(image_data, labels):
    train_input_fn = tf.estimator.inputs.numpy_input_fn(
                                         x= {"x":image_input},
                                         y=label,
                                         batch_size=1, 
                                         num_epochs=None,
                                         shuffle=False)
    fcn_classifier.train(input_fn=input_func_gen, steps=1)
然而,通过这种方式,模型在每个步骤后都会被保存和加载,从而浪费了大量的资源。我还尝试使用生成器一次性创建整个数据集,即

def input_func_gen():
    dataset = tf.data.Dataset.from_generator(generator=generator, 
                                  output_types=(tf.float32, tf.int32))
    dataset = dataset.batch(1)
    iterator = dataset.make_one_shot_iterator()
    return iterator.get_next()

def generator():
    filenames = ['building-d-mapimage-10-gt.png', 'building-dmapimage- 
                                                   16-gt.png']
    i = 0
    while i < len(filenames):        
        features, labels = loading.read_image_data(filenames[i])
        yield features, labels
        i += 1
        if i >= len(filenames):
            i = 0
但是,通过这种方式,训练变得非常缓慢,并且在第一次迭代后内存不足,这表明数据集有问题(在第一种情况下,如果使用单个输入,训练运行必须更快)。生成器中特征的形状也是
(1,图像高度,图像宽度,3)
。然而,在模型中,我必须将它们重塑为4-d张量

input_shape = tf.shape(input)
input = tf.reshape(input, [1, input_shape[2], input_shape[3], 3])

而不是
tf.reforme(输入[1,输入形状[1],输入形状[2],3])
,这表明输入的尺寸有点奇怪?在第一种情况下,我可以直接使用输入,而不需要重塑或做任何事情

我通过将
input\u func\u gen
更改为以下选项,解决了不同大小图像的问题

def input_func_gen():
    load_path = '/path_to_images'
    data_set = 'dataset_to_use'
    image_data, labels = loading.load_image_data_grayscale(load_path,data_set)
    dataset = tf.data.Dataset.from_generator(lambda: 
                              itertools.zip_longest(image_data, labels),
                              output_types=(tf.float32, tf.int32),
                              output_shapes=(tf.TensorShape([1, None, None, 
                                             3]), tf.TensorShape([1, None])))
    dataset = dataset.repeat()
    iterator = dataset.make_one_shot_iterator()
    return iterator.get_next()

这并不是你直接要求的,但我想值得指出的是:即使你避开了内存问题,你所做的也会产生很差的结果。由于输入维数不断变化,卷积核不会得到很好的优化,使用批量大小为1的训练将使梯度下降很难收敛。考虑调整所有图像的大小并使用至少20的批次大小。我认为在训练完全卷积网络时,使用批量大小为1的不同大小的图像是一种常见的方法()。然而,通常梯度是在几个批次中累积的,但我不确定如何在tensorflow估计器api中实现这一点?
def input_func_gen():
    load_path = '/path_to_images'
    data_set = 'dataset_to_use'
    image_data, labels = loading.load_image_data_grayscale(load_path,data_set)
    dataset = tf.data.Dataset.from_generator(lambda: 
                              itertools.zip_longest(image_data, labels),
                              output_types=(tf.float32, tf.int32),
                              output_shapes=(tf.TensorShape([1, None, None, 
                                             3]), tf.TensorShape([1, None])))
    dataset = dataset.repeat()
    iterator = dataset.make_one_shot_iterator()
    return iterator.get_next()