张量流中的条件图和访问张量大小的循环

首先是广泛的问题:

  • 是否有可能建立一个张量流条件图?
  • 如果是的话,自动渐变计算和实现的优化器是否可以使用它?
  • 我可以访问张量的形状并将其变成一个整数,以便在“if”条件和“for in in range()”循环中使用它吗?
  • 我的实际使用情况是我想要做一个具有可变张量长度的一维卷积。 为此,我首先需要一个if语句,它只在长度大于1时执行卷积。 然后我有一个for循环,它经历了卷积的张量。 问题是这个代码:

    for i in range(tf.shape(tensor)[0]): 
    

    不起作用,因为范围运算符需要一个整数。 我可以把它变成一个整数吗?

    最后,我想用adagrad来训练这个模型,无论是自动分化还是已经实现的优化器


    编辑:

    这是一维卷积,它将在我的模型中成为两层中的第一层。 类型错误位于触发一个for循环的每个版本的后面

    import tensorflow as tf 
    import numpy as np 
    
    def convolve(s, Tl, Tr, b):
    
        if (tf.shape(s)[0] == 1):
            return s
    
        sum = 0
    
        # for i in range(tf.shape(s)[0] - 1): # error: TypeError: range() integer end argument expected, got Tensor
        # for i in range(s._shape._dims[0]._value - 1): # error: TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'
        for i in range(s.get_shape().as_list()[0] - 1): # error: TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'
    
            sum += tf.tanh(tf.matmul(Tl,s[i]) + tf.matmul(Tr, s[i+1]) + b)
    
        return sum
    
    ModelSize = 3
    
    # tensor to be convolved
    s = tf.placeholder("float", shape = [None, ModelSize])
    
    # initialise weights
    Tl = tf.Variable(tf.random_normal(shape=[ModelSize,ModelSize], stddev = 0.1 ))
    Tr = tf.Variable(tf.random_normal(shape=[ModelSize,ModelSize], stddev = 0.1 ))
    b = tf.Variable(tf.random_normal(shape=[ModelSize], stddev = 0.1 ))
    
    #convolution
    s_convolved = convolve(s, Tl, Tr, b)
    
    # initialise variables.
    init = tf.initialize_all_variables()
    
    # run graph
    sess = tf.Session()
    sess.run(init)
    
    # test data
    s_dataLong = np.random.random((2,5,ModelSize))
    s_dataShort = np.random.random((2,1,ModelSize))
    
    for s_dataPart in s_dataLong:
        print sess.run(s_convolved, feed_dict = {s : s_dataPart})
    
    for s_dataPart in s_dataShort:
        print sess.run(s_convolved, feed_dict = {s : s_dataPart})
    

    我建议你以不同的方式编写每个问题。 否则它将被关闭得太宽泛。

    我只能回答你的第三个问题。 如何以编程方式获得张量的形状。 您正确使用形状来获得张量的形状,但在运行图之前仍然无法获得结果(请参阅此处的解释)。

    a = tf.truncated_normal([2, 3], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1)
    b = tf.shape(a)
    sess = tf.Session()
    print sess.run(b) # will give you [2 3]
    

    我发现从常量中获得形状而不运行图形的丑陋方式是做类似的事情(不知道为什么你需要它):

    print a._shape._dims[0]._value
    print a._shape._dims[1]._value
    

    要从变量中获取形状,可以这样做:

    weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35))
    print weights.get_shape().as_list()
    

    在评估之前访问张量形状的另一种方法是:tf.Tensor.get_shape()

    链接地址: http://www.djcxy.com/p/30307.html

    上一篇: conditional graph in tensorflow and for loop that accesses tensor size

    下一篇: How to use yesod per