最初の広範な質問:
- テンソルフローで条件付きグラフを構築することは可能ですか?
- はいの場合、自動勾配計算と実装されたオプティマイザーはそれで動作しますか?
- テンソルの形状にアクセスし、それを「if」条件と「for i in range()」ループで使用するために整数に変換できますか?
私の実際の使用例は、可変テンソル長で 1D 畳み込みを実行したいということです。このためには、最初に、長さが 1 より大きい場合にのみ畳み込みを実行する if ステートメントが必要です。次に、畳み込みのテンソルを通過する for ループがあります。問題は、このコード:
for i in range(tf.shape(tensor)[0]):
範囲演算子には整数が必要なため、機能しません。これをどういうわけか整数に変えることはできますか?
最後に、自動微分または既に実装されているオプティマイザのいずれかを使用して、adagrad でこのモデルをトレーニングしたいと考えています。
編集:
これは 1D 畳み込みで、後でモデルの 2 つのレイヤーの最初になります。型エラーは、1 つをトリガーする 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})