如何将TensorFlow Dataset API与密集层结合使用 [英] How to use TensorFlow Dataset API in combination with dense layers

查看:65
本文介绍了如何将TensorFlow Dataset API与密集层结合使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试 TensorFlow文档,并使用几乎相同的代码:

I am trying out the Dataset API for my input pipeline shown in the TensorFlow documentation and use almost the same code:

tr_data = Dataset.from_tensor_slices((train_images, train_labels))
tr_data = tr_data.map(input_parser, NUM_CORES, output_buffer_size=2000)
tr_data = tr_data.batch(BATCH_SIZE)
tr_data = tr_data.repeat(EPOCHS)

iterator = dataset.make_one_shot_iterator()
next_example, next_label = iterator.get_next()

# Script throws error here
loss = model_function(next_example, next_label)

with tf.Session(...) as sess:
    sess.run(tf.global_variables_initializer())

     while True:
        try:
            train_loss = sess.run(loss)
        except tf.errors.OutOfRangeError:
            print("End of training dataset.")
            break

这应该更快,因为它避免使用缓慢的feed_dicts。但是我无法使其与我的模型兼容,该模型是简化的LeNet架构。 问题是我的 model_function()中的 tf.layers.dense 已知的输入形状(我想是因为它必须事先知道权重的数量)。但是 next_example next_label 只能通过在会话中运行它们来确定形状。在评估它们的形状之前,它们只是不确定的

This should be faster since it avoids using the slow feed_dicts. But I can't make it work with my model, which is a simplified LeNet architecture. The problem is the tf.layers.dense in my model_function() which expects an known input shape (I guess because it has to know the number of weights beforehand). But next_example and next_label only get their shape by running them in the session. Before evaluating them their shape is just undefined ?

声明 model_function()抛出此错误:


ValueError:输入到 Dense 应该定义为
。找到

现在,我不知道我是否

预先感谢!

编辑1:
下面是我的模型,它在第一个密集层抛出了错误

Edit 1: Below is my model and it throws the error at the first dense layer

def conv_relu(input, kernel_shape):
    # Create variable named "weights".
    weights = tf.get_variable("weights", kernel_shape,
        initializer=tf.random_normal_initializer())
    # Create variable named "biases".
    biases = tf.get_variable("biases", kernel_shape[3],
        initializer=tf.constant_initializer(0.0))
    conv = tf.nn.conv2d(input, weights,
        strides=[1, 1, 1, 1], padding='VALID')
    return tf.nn.relu(conv + biases)

def fully(input, output_dim):
    assert len(input.get_shape())==2, 'Wrong input shape, need flattened tensor as input'
    input_dim = input.get_shape()[1]

    weight = tf.get_variable("weight", [input_dim, output_dim],
        initializer=tf.random_normal_initializer())
    bias = tf.get_variable('bias', [output_dim],
        initializer=tf.random_normal_initializer())

    fully = tf.nn.bias_add(tf.matmul(input, weight), bias)
    return fully


def simple_model(x):

    with tf.variable_scope('conv1'):
        conv1 = conv_relu(x, [3,3,1,10])
        conv1 = tf.nn.max_pool(conv1,[1,2,2,1],[1,2,2,1],'SAME')

    with tf.variable_scope('conv2'):
        conv2 = conv_relu(conv1, [3,3,10,10])
        conv2 = tf.nn.max_pool(conv2,[1,2,2,1],[1,2,2,1],'SAME')

    with tf.variable_scope('conv3'):
        conv3 = conv_relu(conv2, [3,3,10,10])
        conv3 = tf.nn.max_pool(conv3,[1,2,2,1],[1,2,2,1],'SAME')

    flat = tf.contrib.layers.flatten(conv3)
    with tf.variable_scope('fully1'):
        fully1 = tf.layers.dense(flat, 1000)
        fully1 = tf.nn.relu(fully1)

    with tf.variable_scope('fully2'):
        fully2 = tf.layers.dense(fully1, 100)
        fully2 = tf.nn.relu(fully2)

    with tf.variable_scope('output'):
        output = tf.layers.dense(fully2, 4)
        fully1 = tf.nn.relu(output)


    return output

编辑2:

在这里您可以看到张量的打印。请注意,next_example没有形状

Here you see the print of the tensors. Notice that next_example does not have a shape


next_example:Tensor( IteratorGetNext:0,dtype = float32)

next_label:Tensor( IteratorGetNext:1,shape =(?, 4),dtype = float32)

next_example: Tensor("IteratorGetNext:0", dtype=float32)
next_label: Tensor("IteratorGetNext:1", shape=(?, 4), dtype=float32)


推荐答案

我自己找到了答案。

遵循此线程如果您事先知道图像的大小,则简单的解决方法是使用 tf.Tensor.set_shape 设置形状。

Following this thread the easy fix is to just set the shape with tf.Tensor.set_shape if you know your image sizes beforehand.

def input_parser(img_path, label):

    # read the img from file
    img_file = tf.read_file(img_path)
    img_decoded = tf.image.decode_image(img_file, channels=1)
    img_decoded = tf.image.convert_image_dtype(img_decoded, dtype=tf.float32)
    img_decoded.set_shape([90,160,1]) # This line was missing

    return img_decoded, label

如果tensorflow文档包含这一行,那将是很好的。

It would have been nice if the tensorflow documentation included this line.

这篇关于如何将TensorFlow Dataset API与密集层结合使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆