在张量流中动态地将2d张量分成多个张量
给定2d张量(矩阵),我想将它分成几个大小相等的小张量。您可以将其视为最大池的预处理。例如,在张量流中动态地将2d张量分成多个张量
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 10
4 5 6 7 8 9 10 11
考虑到动态的desired_size
2 * 4,输出应该是:
1 2 3 4
2 3 4 5
5 6 7 8
6 7 8 9
3 4 5 6
4 5 6 7
7 8 9 10
8 9 10 11
我已经研究了一段时间slice
和gather
。但我仍然不知道如何去做。你能告诉我如何得到那个吗?提前致谢!
你可以使用tf.extract_image_patches
,即使原来有些冗长:
import numpy as np
import tensorflow as tf
x = tf.constant(np.arange(8) + np.arange(1,5)[:,np.newaxis])
e = tf.extract_image_patches(x[tf.newaxis,:,:,tf.newaxis],
[1, 2, 4, 1], [1, 2, 4, 1], [1, 1, 1, 1], padding='VALID')
e = tf.reshape(e, [-1, 2, 4])
sess = tf.InteractiveSession()
e.eval()
# returns
# array([[[ 1, 2, 3, 4],
# [ 2, 3, 4, 5]],
# [[ 5, 6, 7, 8],
# [ 6, 7, 8, 9]],
# [[ 3, 4, 5, 6],
# [ 4, 5, 6, 7]],
# [[ 7, 8, 9, 10],
# [ 8, 9, 10, 11]]])
我系有tf.split()
:
num_splits = 2
desired_size = (2, 4)
A = tf.constant(a)
C = tf.concat(tf.split(A, desired_size[0], 0),1)
D = tf.reshape(tf.concat(tf.split(C, num_splits*desired_size[0], 1), 0), (-1, desired_size[0], desired_size[1]))
#The result
[[[ 1 2 3 4]
[ 2 3 4 5]]
[[ 5 6 7 8]
[ 6 7 8 9]]
[[ 3 4 5 6]
[ 4 5 6 7]]
[[ 7 8 9 10]
[ 8 9 10 11]]]
# For num_splits = 4, desired_size = (2, 2) you get
[[[ 1 2]
[ 2 3]]
[[ 3 4]
[ 4 5]]
[[ 5 6]
[ 6 7]]
[[ 7 8]
[ 8 9]]
[[ 3 4]
[ 4 5]]
[[ 5 6]
[ 6 7]]
[[ 7 8]
[ 8 9]]
[[ 9 10]
[10 11]]]
感谢您的回答。我认为你对这个动态的'desired_size'很有希望。但我试过你的代码并收到这个错误:'IndexError:list index out of range'。它指向这行代码'C = tf.concat(tf.split(A,desired_height,0),1)'其中'desired_height'是一个标量变量。你有任何想法来解决它?谢谢! – user5779223
例如,将'desired_size'的定义更改为'desired_size = tf.placeholders(tf.int32,(2),name ='desired_size')'并保持不变。并看看它是否仍然有效 – user5779223
这将如何工作。你现在想要张量来分裂另一张张吗? –
不知是否形状可以按这个方法是动态的?谢谢! – user5779223
我不认为它可以,你必须知道图形构建过程中输出的大小。这通常是这种情况。如果您在运行时遇到可变张量尺寸问题,我会很乐意听到。 – user1735003
感谢您的回复!事实上,我需要处理'desired_size'是动态的情况,你有什么想法吗?谢谢! – user5779223