动态切片后无法预测的张量形状

时间:2019-03-06 20:11:11

标签: tensorflow keras tensor

我对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....
    ...

0 个答案:

没有答案