我对TF比较陌生,想知道如何从未知的张量形状中动态获取张量切片?
我想从最后一层(output_layer
)获得权重并进行softmax,然后仅在第二维度上(从out_reshape
看那些索引)。 numpy类型的跨步不起作用,因此我改用tf.gather
(在更改轴以使所需的轴位于第一个轴上之后)。
这可行:
out_reshape = tf.gather(out_reshape, [1,2,3,4])
这将输出带有[4,3,?]的张量(如我们所预期)。但是我想基于馈给T
的数据(而不是如上所述的[1,2,3,4]
)来更改索引。
这样会产生意外的结果(如下面的代码所示):
out_reshape = tf.gather(out_reshape, T)
和
out_reshape.shape
这得到TensorShape(None))
,但是我希望得到[?,3,?],其中第一个值与T
相同(输入的数据T
中是一个1-d数组,例如[100, 200, 300, 400]
)。
这里发生了什么?为什么其输出形状会崩溃为“无”?
整个代码是这样的:
graph = tf.Graph()
tf.reset_default_graph()
with graph.as_default():
y=tf.placeholder(tf.float32, shape =(31, 3, None), name = 'Y_observed') # (samples x) ind x seqlen
T=tf.placeholder(tf.int32, shape =(None), name = "T_observed")
x = tf.placeholder(tf.float32, shape = (None, None, 4) , name = 'X_observed')
model = Conv1D(filters = 16,
kernel_size = filter_width,
padding = "same",
activation='relu')(x)
model = Conv1D(filters = 16,
kernel_size = filter_width,
padding = "same",
activation='relu')(model)
model = Conv1D(filters = n_output_channels,
kernel_size = 1,
padding = "same",
activation='relu')(model)
model_output = tf.identity(model, name='last_layer')
output_layer = tf.get_default_graph().get_tensor_by_name('last_layer:0')
out = output_layer[:, 512:, :]
out_norm = tf.nn.softmax( out, axis=1 )
out_reshape = tf.transpose(out_norm, (1, 2, 0)) # this gives a [?,3,?] tensor
out_reshape = tf.gather(out_reshape, T) # --> Problematic part !
...
updates = tf.train.AdamOptimizer(1e-4).minimize....
...