【问题标题】:Finding loss mask of variable length in keras tensorflow在keras tensorflow中找到可变长度的损失掩码
【发布时间】:2019-09-05 07:04:12
【问题描述】:

尝试构建捕获以下功能的损失函数,一旦遇到“序列结束”,就会屏蔽输出值。

给定一个形状为 [BatchSize,MaxSequenceLenght,OutputNodes] 的张量

考虑下面的例子


    batch size = 3
    Max Sequence Length=4
    OutputNodes = 3
    predicted = [[[0.1,0.3,0.2],[0.4,0.6,0.8],[0.5,0.2,0.3],[0.0,0.0,0.99]],
            [[0.1,0.3,0.2],[0.4,0.9,0.8],[0.5,0.2,0.9],[0.4,0.6,0.8]],
            [[0.1,0.3,0.2],[0.4,0.9,0.8],[0.5,0.2,0.1],[0.4,0.6,0.1]]]

我将最后一个输出节点用于象征此处的“序列结束(EOS)” node=2 。节点标记为 (0, 1 和 2)

根据预测值,我必须返回一个掩码,它试图找到第一次出现的 EOS。

在上面的例子中, 第一行有以下序列 (argmax) => 1,2,0,2

第二行有以下序列 => 1,1,2,2

第三行有以下序列 => 1,1,9,1

所以我的面具应该是

[[1,0,0,0],
[1,1,0,0],
[1,1,1,1]

掩码将确保在计算损失时忽略或不考虑 EOS 后的值。

以下是我尝试过的代码片段


    sequence_cluster_asign = keras.backend.argmax(sequence_values,axis=-1)
    loss_mask = []
    for seq in K.tf.unstack(sequence_cluster_asign):
        ##appendEOS- To make sure tf.where is not empty
        seq = tf.concat([seq,endOfSequenceTensor],axis=0)
        endOfSequenceLocation = K.tf.where(K.tf.equal(seq,endOfSequence))[0][0]
        loss_mask.append(tf.sequence_mask(endOfSequenceLocation,max_decoder_seq_length,dtype=tf.float32))
    final_mask = K.stack(loss_mask)

遇到错误:ValueError: Cannot infer num from shape (?,?)

【问题讨论】:

  • 你的endOfSequenceTensormax_decoder_seq_length 是什么?

标签: tensorflow keras deep-learning unsupervised-learning


【解决方案1】:

如果你想在你的问题中得到掩码,你可以使用下面的方法。

import tensorflow as tf
import keras
from keras import backend as K

sequence_values = K.placeholder(shape=(None, 4, 3))
sequence_cluster_asign = keras.backend.argmax(sequence_values,axis=-1)

# keras version
result = K.cast(K.less(sequence_cluster_asign,sequence_values.get_shape().as_list()[-1]-1),dtype='int32')
result = K.cumprod(result,axis=-1)

# tensorflow version
# result = tf.cast(tf.less(sequence_cluster_asign,sequence_values.get_shape().as_list()[-1]-1),dtype=tf.int32)
# result = tf.cumprod(result,axis=-1)

predicted = [[[0.1,0.3,0.2],[0.4,0.6,0.8],[0.5,0.2,0.3],[0.0,0.0,0.99]],
             [[0.1,0.3,0.2],[0.4,0.9,0.8],[0.5,0.2,0.9],[0.4,0.6,0.8]],
             [[0.1,0.3,0.2],[0.4,0.9,0.8],[0.5,0.2,0.1],[0.4,0.6,0.1]]]

with tf.Session() as sess:
    print(result.eval(feed_dict={sequence_values:predicted}))

[[1 0 0 0]
 [1 1 0 0]
 [1 1 1 1]]

【讨论】:

    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 2016-03-11
    • 2019-01-20
    • 2021-09-06
    • 2020-03-13
    • 1970-01-01
    • 2018-05-30
    • 2016-12-18
    相关资源
    最近更新 更多