【问题标题】:How to generate sequence data with keras with multiple input?如何使用具有多个输入的 keras 生成序列数据?
【发布时间】:2023-04-07 16:48:01
【问题描述】:

我正在为 keras 中的序列到序列问题编写 VAE。解码器是一个自回归模型,所以我有两个不同的输入,一个用于编码器,一个用于解码器(移位 1,但这不是问题)。 我还想做数据扩充,所以我决定使用 fit_generator() 方法,但是在返回两个输入时我遇到了一些问题。

我试图返回一个包含两个输入向量的列表,像这样

class DataGenerator(Sequence):
    def __init__(....

    def __getitem__(self, index):
        data = create_data()
        return  [data, data]

或者像这样的字典

return {"encoder_input_name" : "data, decoder_input_name" : data } 

其中 data 是一个形状为 numpy 的张量(batch_size、max_sequence_len、input_dimention)。

我不能只使用相同的输入层,因为稍后两个输入会有点不同,正如我所说的解码器输入会因第一个元素不同以及其他原因移动一个。

当我返回列表 [data, data] 或出现此错误时:

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 2 array(s), but instead got the following list of 1 arrays

当我返回字典时出现此错误:

batch_size = x.shape[0]
AttributeError: 'str' object has no attribute 'shape'

我该如何解决这个问题?

非常感谢!

编辑

我将__getitem__ 的输出更改为 [inpuut_1, input_2], [] 并且成功了。

【问题讨论】:

    标签: python tensorflow keras generator autoregressive-models


    【解决方案1】:

    您应该从生成器/序列实例返回一个元组。元组的第一个元素是输入数组的列表(如果您的模型有一个输入层,则只有一个数组),第二个元素是输出数组的列表(如果您的模型有一个输出层,则只有一个数组)。

    因此,__getitem__ 应该返回如下内容:

    def __getitem__(self, index):
        # ...
        return  [inp_arr1, inp_arr2, ...], [out_arr1, out_arr2, ...]  # IMPORTANT: this is a tuple
    

    【讨论】:

    • 我没有输出对象,所以我必须返回[inp_1,inp_2],[]
    • @MarioBonsembiante 你的意思是你的模型没有输出??!那么是的,可能是[inp_1, inp_2], None[inp_1, inp_2], []
    • 我试过[input_1, input_2], [],它奏效了。谢谢!
    猜你喜欢
    • 2020-01-05
    • 2019-10-12
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多