首页 文章

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

提问于
浏览
9

首先是广泛的问题:

  • 是否可以使用tensorflow构建条件图?

  • 如果是,自动梯度计算和已实现的优化器是否可以使用?

  • 我可以访问张量的形状并将其转换为整数,以便在"if"条件和"for i in range()"循环中使用它吗?

我的实际用例是我想用可变张量长度进行一维卷积 . 为此,我首先需要一个if语句,如果长度大于1,则只执行卷积 . 然后我有一个for循环通过卷积的张量 . 问题是这段代码:

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

不起作用,因为范围运算符需要一个整数 . 我能以某种方式将其转换为整数吗?

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


编辑:

这是1D卷积,后来将成为我模型中两个层中的第一个 . 类型错误是每个触发一个版本的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})

1 回答

  • 3

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

    我只能回答你的第三个问题 . 如何以编程方式获得张量的形状 . 您正在使用shape to get the shape of the tensor,但在运行图形之前仍然无法获得结果(请查看我的explanation here) .

    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()
    

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

相关问题