簡體   English   中英

tensorflow中的條件圖和訪問張量大小的for循環

[英]conditional graph in tensorflow and for loop that accesses tensor size

首先是廣泛的問題:

  • 是否可以構建具有張量流的條件圖?
  • 如果是,那么自動梯度計算和已實現的優化器是否可以使用它?
  • 我可以訪問張量的形狀並將其轉換為整數,以便將其與“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})

我建議你以不同的方式寫每個問題。 否則它將被關閉太寬泛。

我只能回答你的第三個問題。 如何以編程方式獲得張量的形狀。 您正確使用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]

我發現從常量中獲取形狀而不運行圖形的丑陋方式是做一些事情(不知道你為什么需要它):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM