2017-02-20 209 views
1

有沒有辦法來墊可變大小的張量給定的形狀與特定的填充值?例如,給定張量:TensorFlow - 將未知尺寸張量填充到特定尺寸?

[[1, 2], 
[3, 4]] 

[[1, 2, 3], 
[4, 5, 6]] 

有沒有辦法讓這將需要或者並用價值墊它們的通用操作(比如,與價值,塑造[2, 4]-1)導致:

[[1, 2, -1, -1], 
[3, 4, -1, -1]] 

[[1, 2, 3, -1], 
[4, 5, 6, -1]] 

分別?我的推理(如果有一個更好的解決方案)是,我有從TFRecords文件,其中有一部分具有可變長度的例子。對於處理,靜態長度使它們更容易處理。

回答

-1

有一個在TensorFlow沒有辦法做this.You將不得不對數據進行預處理,並添加-1一套讓你需要的長度。例如,通過list[0].append(-1)list[1].append(-1)得到所需長度和循環的長度 - 列表的長度。希望這可以幫助!

0

我遇到了類似的事情。不完全一般,但你可以做類似:

test_a = tf.constant([[1, 2], [3, 4]]) 
test_b = tf.constant([[1, 2, 3], [4, 5, 6]]) 

def pad_second_dim(input, desired_size): 
    padding = tf.tile([[0]], tf.stack([tf.shape(input)[0], desired_size - tf.shape(input)[1]], 0)) 
    return tf.concat([input, padding], 1) 

with tf.Session() as sess: 
    print sess.run(pad_second_dim(test_a, 4)) 
    # [[1 2 0 0] [3 4 0 0]] 
    print sess.run(pad_second_dim(test_b, 4)) 
    # [[1 2 3 0] [4 5 6 0]] 
1

是的。有。如果你不需要改變張量的等級,那很簡單。

tf.pad()接受與張量是常規的Python列表。填充格式是在該維度的每一邊填充多少對的列表。

例如

t = tf.constant([[1, 2], [3, 4]]) 
paddings = [[0, 0], [0, 4-tf.shape(t)[0]]] 
out = tf.pad(t, paddings, 'CONSTANT', constant_values=-1) 
sess.run(out) 
# gives: 
# array([[ 1, 2, -1, -1], 
#  [ 3, 4, -1, -1]], dtype=int32) 

如果要概括這一個有用的功能,你可以這樣做:

def pad_up_to(t, max_in_dims, constant_values): 
    s = tf.shape(t) 
    paddings = [[0, m-s[i]] for (i,m) in enumerate(max_in_dims)] 
    return tf.pad(t, paddings, 'CONSTANT', constant_values=constant_values) 

其中max_in_dims基本上是輸出所需要的形狀。 注意:如果您在任何維度中提供嚴格小於t的形狀,則此功能將失敗。

你可以用它喜歡:

t = tf.constant([[1, 2], [3, 4]]) # shape = [2, 2] 
t_padded = pad_up_to(t, [2, 4], -1) # shape = [2, 4], padded with -1s