我有一个数据生成器,可以生成成批的输入数据(X)和目标(Y),还有一个应用于模型输出的掩码(batch_mask)(同一个掩码适用于该批中的所有数据点;不同的批次有不同的掩码,数据生成器负责执行此操作).

因此,batch_mask的第一维度可以具有形状1batch_size(通过沿第一维度重复相同遮罩batch_size次).我希望Keras允许我使用其中一种,我只想在第一维度上创建形状为1的面具.

然而,当我try 这个时,我得到了一个错误:

ValueError: Data cardinality is ambiguous:
  x sizes: 128, 1
  y sizes: 128
Make sure all arrays contain the same number of samples.

这似乎并不复杂.

下面是一些观察这种行为的简单示例代码

import tensorflow.keras as tfk
import numpy as np

#######################
# 1. model definition #
#######################

# model parameters
nfeatures_in = 6
target_size = 8

# model inputs
input = tfk.layers.Input(nfeatures_in)
input_mask = tfk.layers.Input(target_size)

# model graph
out = tfk.layers.Dense(target_size)(input)
out_masked = tfk.layers.Multiply()((out,input_mask)) # multiply all model outputs in the batch by the same mask
model = tfk.Model(inputs=(input, input_mask), outputs=out_masked)

##########################
# 2. dummy data creation #
##########################

batch_size = 32

# create masks the batch
zeros_vector = np.zeros((1,target_size)) # "batch_size"==1
zeros_vector[0,:6] = 1
batch_mask = zeros_vector

# dummy data creation
X = np.random.randn(batch_size, 6)
Y = np.random.randn(batch_size, target_size)*batch_mask # the target is masked by design in each batch


############################
# 3. compile model and fit #
############################

model.compile(optimizer="Adam", loss="mse")
model.fit((X, batch_mask),Y, batch_size=batch_size)

我知道我可以通过以下两种方式来实现这一目标:

  • 重复遮罩,使第一个维度batch_mask的大小为第一个维度X的大小(而不是1).
  • 使用纯tensorflow(但我觉得对Keras来说,沿着批处理维度进行广播应该不是问题).

How can I make this work with Keras?

非常感谢.

推荐答案

您可以创建一个IdentityLayer,它接收batch_mask作为外部输入参数,并将其作为张量返回.

class IdentityLayer(tfk.layers.Layer):
    def __init__(self, my_mask, **kwargs):
        super(IdentityLayer, self).__init__()
        self.my_mask = my_mask
    def call(self, _):
        my_mask = tf.convert_to_tensor(self.my_mask, dtype=tf.float32)
        return my_mask
    def get_config(self):
        config = super().get_config()
        config.update({
            "my_mask": self.my_mask,
        })
        return config

在模型中使用IdentityLayer很简单:

# model inputs
input = tfk.layers.Input(nfeatures_in)
input_mask = IdentityLayer(batch_mask)(input) 

# model graph
out = tfk.layers.Dense(target_size)(input)
out_masked = tfk.layers.Multiply()((out,input_mask)) 
model = tfk.Model(inputs=input, outputs=out_masked)

其中batch_mask是您报告时创建的numpy数组:

zeros_vector = np.zeros((1,target_size)) # "batch_size"==1
zeros_vector[0,:6] = 1
batch_mask = zeros_vector

Python相关问答推荐

tempfile.mkstemp(text=.)参数实际上是什么?

为什么判断pd.DataFrame的值与判断pd.Series的值存在差异(如果索引中有值)?

自动编码器和极坐标

尽管进程输出错误消息,subProcess.check_call的CalledProcess错误.stderr为无

避免循环的最佳方法

Polars Dataframe:如何按组删除交替行?

如何使用PyTest根据self 模拟具有副作用的属性

如何让pyparparsing匹配1天或2天,但1天和2天失败?

Python:记录而不是在文件中写入询问在多文件项目中记录的最佳实践

使用argsorted索引子集索引数组

遵循轮廓中对象方向的计算线

根据给定日期的状态过滤查询集

仅从风格中获取 colored颜色 循环

try 在树叶 map 上应用覆盖磁贴

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

如何使用html从excel中提取条件格式规则列表?

按顺序合并2个词典列表

将输入聚合到统一词典中

提取相关行的最快方法—pandas

手动设置seborn/matplotlib散点图连续变量图例中显示的值