Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TensorFlow 2 Keras中意外的遮罩形状_Tensorflow_Keras_Mask - Fatal编程技术网

TensorFlow 2 Keras中意外的遮罩形状

TensorFlow 2 Keras中意外的遮罩形状,tensorflow,keras,mask,Tensorflow,Keras,Mask,我有形状的批处理张量(批处理大小、n个时间步长、n个特征、n个通道)。它们产生于形状的张量(n_时间步、n_特征、n_通道),其中n_时间步不是常数。在构建批时,张量被填充到最大值n\u time\u steps 这些张量应输入以下结构的神经网络: 由于填充,输入被屏蔽 每个时间步的张量被馈送到时间分布的CNN块。掩码被传播 提取的特征被馈送到RNN 在最后一层中,我遇到了一个错误,因为遮罩具有形状(批大小,n时间步数,n时间特征),但RNN希望它具有形状(批大小,n时间步数) 有人知道如何得到

我有形状的批处理张量
(批处理大小、n个时间步长、n个特征、n个通道)
。它们产生于形状的张量
(n_时间步、n_特征、n_通道)
,其中
n_时间步
不是常数。在构建批时,张量被填充到最大值
n\u time\u steps

这些张量应输入以下结构的神经网络:

  • 由于填充,输入被屏蔽
  • 每个时间步的张量被馈送到时间分布的CNN块。掩码被传播
  • 提取的特征被馈送到RNN
  • 在最后一层中,我遇到了一个错误,因为遮罩具有形状
    (批大小,n时间步数,n时间特征)
    ,但RNN希望它具有形状
    (批大小,n时间步数)

    有人知道如何得到合适形状的面具吗

    下面是一个简单的例子:

    将tensorflow导入为tf
    类TimeDistributedMaskPropagating(tf.keras.layers.TimeDistributed):
    “”“传播掩码的时间分布层。”“”
    定义初始化(self,*args,**kwargs):
    super()
    self.supports\u masking=True
    def计算掩码(自身、输入、掩码=无):
    返回掩码
    n_特征=3
    n_通道=1
    cnn_block=tf.keras.layers.Flatten()
    估计量=tf.keras.Sequential([
    tf.keras.layers.Input(shape=(无,n个特征,n个通道)),
    tf.keras.layers.Masking(),
    时间分布的广播(cnn_区块),
    #tf.keras.layers.LSTM(10)
    #收益率值错误:维度必须相等,但为3和10
    ])
    x1=tf.随机.均匀((4,3,1))#形状:4,3,1
    x2=tf.随机.均匀((3,3,1))#形状:3,3,1
    填充=tf.常数([[0,1],[0,0],[0,0]])
    填充垫(x2,填充物)#形状:4,3,1
    小批量=tf.stack((x1,填充x2))#形状:2,4,3,1
    logits=估计器(小批量)#形状:2,4,3
    打印(logits._keras_mask)#形状:2,4,3
    #遮罩具有带值的形状2、4、3
    #真的
    #[对]
    #[对]
    #[正确]]
    # 
    #[[True]
    #[对]
    #[对]
    #[错误]]]
    #遮罩应具有带值的形状2、4
    #[[True]
    #[对错]]
    
    在实施
    tensorflow.keras.layers.Masking
    时,仅要求最后一个轴的所有值都等于
    mask_值
    ,以便在mask中生成条目
    False
    。因此,掩码的张量秩变为输入张量的张量秩减1(而不是2,一个用于
    批量大小
    ,一个用于
    时间步长
    ,如预期)

    这个问题可以通过定义一个自定义屏蔽层来解决,其中
    axis=-1
    来自方法
    compute\u mask
    中的原始代码,
    call
    axis=[2,3]
    (在我的例子中)或更一般地被
    axis=list(范围(2,len(inputs.shape))
    取代

    以下是完整的代码:

    类自定义屏蔽(层):
    定义初始值(自身,掩码值=0.,**kwargs):
    超级(自定义屏蔽,自我)。\uuuuu初始化(**kwargs)
    self.supports\u masking=True
    self.mask\u值=mask\u值
    self.\u compute\u output\u和\u mask\u联合=真
    def计算掩码(自身、输入、掩码=无):
    返回K.any(数学运算不相等(输入、自身掩码值),
    轴=列表(范围(2,len(inputs.shape)))
    def呼叫(自我,输入):
    轴=列表(范围(2,长度(inputs.shape)))
    布尔掩码=K.any(数学运算不相等(输入、自掩码值),
    轴=轴,keepdims=真)
    输出=输入*数学运算.cast(布尔掩码,输入.dtype)
    #同时计算掩码和输出。
    输出。_keras_mask=数组_ops.squence(布尔_mask,axis=轴)35; pylint:disable=受保护访问
    返回输出
    def计算输出形状(自身、输入形状):
    返回输入形状
    def get_配置(自身):
    config={'mask_value':self.mask_value}
    base_config=super(掩蔽,self).get_config()
    return dict(list(base_config.items())+list(config.items())
    
    在实施
    tensorflow.keras.layers.Masking
    时,仅要求最后一个轴的所有值都等于
    mask_值
    ,以便在mask中生成条目
    False
    。因此,掩码的张量秩变为输入张量的张量秩减1(而不是2,一个用于
    批量大小
    ,一个用于
    时间步长
    ,如预期)

    这个问题可以通过定义一个自定义屏蔽层来解决,其中
    axis=-1
    来自方法
    compute\u mask
    中的原始代码,
    call
    axis=[2,3]
    (在我的例子中)或更一般地被
    axis=list(范围(2,len(inputs.shape))
    取代

    以下是完整的代码:

    类自定义屏蔽(层):
    定义初始值(自身,掩码值=0.,**kwargs):
    超级(自定义屏蔽,自我)。\uuuuu初始化(**kwargs)
    self.supports\u masking=True
    self.mask\u值=mask\u值
    self.\u compute\u output\u和\u mask\u联合=真
    def计算掩码(自身、输入、掩码=无):
    返回K.any(数学运算不相等(输入、自身掩码值),
    轴=列表(范围(2,len(inputs.shape)))
    def呼叫(自我,输入):
    轴=列表(范围(2,长度(inputs.shape)))
    布尔掩码=K.any(数学运算不相等(输入、自掩码值),
    轴=轴,keepdims=真)
    输出=输入*数学运算.cast(布尔掩码,输入.dtype)
    #同时计算掩码和输出。
    输出。U keras_UMask=数组\u ops.挤压(布尔屏蔽,axis=axe