首先是广泛的问题:
- 是否可以使用 tensorflow 构建条件图?
- 如果是,自动梯度计算和实施的优化器是否可以使用它?
- 我可以访问张量的形状并将其转换为整数,以便在“if”条件和“for i 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})