2016-03-07 100 views
6

tensorflow恆定我有一個變量批量大小,所以我所有的投入都是形式可變大小

tf.placeholder(tf.float32, shape=(None, ...) 

的接受變量批量。但是,如何創建具有可變批量大小的常量值?問題是這一行:

log_probs = tf.constant(0.0, dtype=tf.float32, shape=[None, 1]) 

這是給我一個錯誤:

TypeError: unsupported operand type(s) for *: 'NoneType' and 'int' 

我敢肯定,這是可以初始化一個常數張量可變批量大小,怎麼可能我這樣做?

我也試過如下:

tf.constant(0.0, dtype=tf.float32, shape=[-1, 1]) 

我得到這個錯誤:

ValueError: Too many elements provided. Needed at most -1, but received 1 
+1

你不能 - 「tf.constant」顯式構造數組,因此它需要知道尺寸。然而,許多張量流操作支持廣播,所以也許你可以使用它呢? http://docs.scipy.org/doc/numpy-1.10.1/user/basics.broadcasting.html –

回答

13

一個tf.constant()已經固定在圖施工時間規模和價值,所以它可能是不正確操作您的應用程序。

如果您嘗試爲每個元素創建一個動態大小和相同(常數)值的張量,可以使用tf.fill()tf.shape()創建一個適當形狀的張量。例如,創建一個張量t具有相同的形狀input和值0.5無處不在:

input = tf.placeholder(tf.float32, shape=(None, ...)) 

# `tf.shape(input)` takes the dynamic shape of `input`. 
t = tf.fill(tf.shape(input), 0.5) 

由於Yaroslav mentions in his comment,您可能還可以使用(NumPy-style) broadcasting避免物化動態形狀的張量。例如,如果input具有形狀(None, 32)t具有形狀(1, 32),則計算tf.mul(input, t)將在第一維上廣播t以匹配input的形狀。

+0

如果我想讓形狀依賴於批量大小該怎麼辦?假設我有一個形狀爲'(batch_size,height,width,num_channels)'的輸入張量,其中batch_size是None。我想創建一個填充值爲'height'的形狀張量'(batch_size)'。 –

+0

您可以使用相同的方法:'height_vector = tf.fill(tf.shape(input_tensor)[0:1],tf.shape(input_tensor)[1])''。 – mrry