首先是广泛的问题:
我的实际用例是我想用可变张量长度进行一维卷积.为此,我首先需要一个if语句,如果长度大于1,则只执行卷积.然后我有一个for循环,通过卷积的张量.问题是这段代码:
for i in range(tf.shape(tensor)[0]):
Run Code Online (Sandbox Code Playgroud)
不起作用,因为范围运算符需要一个整数.我能以某种方式将其转换为整数吗?
最后,我想用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})
Run Code Online (Sandbox Code Playgroud)
我建议您以不同的方式写每个问题。否则,它将因过于宽泛而被关闭。
我只能回答你的第三个问题。如何以编程方式获取张量的形状。您正确地使用shape 来获取张量的形状,但在运行图形之前仍然无法获得结果(请参阅我的解释此处)。
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]
Run Code Online (Sandbox Code Playgroud)
我发现在不运行图表的情况下从常量获取形状的丑陋方法是执行类似的操作(真的不知道为什么需要它):
print a._shape._dims[0]._value
print a._shape._dims[1]._value
Run Code Online (Sandbox Code Playgroud)
要从变量获取形状,您可以这样做:
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35))
print weights.get_shape().as_list()
Run Code Online (Sandbox Code Playgroud)
在评估之前访问张量形状的另一种方法是:tf.Tensor.get_shape()