繁体   English   中英

Keras 自定义数据生成器提供多输入和多输出的维度错误(功能 api 模型)

[英]Keras custom data generator giving dimension errors with multi input and multi output( functional api model)

我已经用 Keras 编写了一个生成器函数,在从__getitem__返回 X,y 之前,我仔细检查了 X 和 Y 的形状,它们没问题,但是生成器给出了维度不匹配数组和警告。

(Colab 代码重现: https ://colab.research.google.com/drive/1bSJm44MMDCWDU8IrG2GXKBvXNHCuY70G?usp = sharing)

我的训练和验证生成器与

class ValidGenerator(Sequence):
    def __init__(self, df, batch_size=64):
        self.batch_size = batch_size
        self.df = df
        self.indices = self.df.index.tolist()
        self.num_classes = num_classes
        self.shuffle = shuffle
        self.on_epoch_end()

    def __len__(self):
        return int(len(self.indices) // self.batch_size)

    def __getitem__(self, index):
        index = self.index[index * self.batch_size:(index + 1) * self.batch_size]
        batch = [self.indices[k] for k in index]
        
        X, y = self.__get_data(batch)
        return X, y

    def on_epoch_end(self):
        self.index = np.arange(len(self.indices))
        if self.shuffle == True:
            np.random.shuffle(self.index)

    def __get_data(self, batch):
        #some logic is written here
        #hat prepares 3 X features and 3 Y outputs 
        X = [input_array_1,input_array_2,input_array_3]
        y = [out_1,out_2,out_3]
        #print(len(X))
        
        return X, y

我是 X,y 的返回元组,每个元组有 3 个输入特征和 3 个输出特征,所以 X 的形状是(3,32,10,1)

我正在使用函数式 api 来构建模型(我有诸如串联、多输入/输出之类的东西,这在顺序中是不可能的)具有以下结构

在此处输入图片说明

当我尝试使用以下代码使用生成器拟合模型时

train_datagen = TrainGenerator(df=train_df,  batch_size=32, num_classes=None, shuffle=True)
valid_datagen = ValidGenerator(df=train_df,  batch_size=32, num_classes=None, shuffle=True)
model.fit(train_datagen, epochs=2,verbose=1,callbacks=[checkpoint,es])

我收到这些警告和错误,但不会消失

Epoch 1/2 WARNING:tensorflow:Model 是用形状 (None, 10) 构建的,用于输入 >Tensor("input_1:0", shape=(None, 10), dtype=float32),但它被称为 >on an input形状不兼容(无、无、无)。

警告:tensorflow:Model 是用形状 (None, 10) 构建的,用于输入 Tensor("input_2:0", shape=(None, 10), dtype=float32),但在形状不兼容的输入上调用它 (None,无,无)。 警告:tensorflow:Model 是用形状 (None, 10) 构建的,用于输入 Tensor("input_3:0", shape=(None, 10), dtype=float32),但在形状不兼容的输入上调用它 (None,无,无)。 ……调用return super(RNN, self)。 调用(输入,**kwargs)/home/eduardo/.virtualenvs/kgpu3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:975调用input_spec.assert_input_compatibility(self.input_spec,输入,/home/eduardo/.virtualenvs/kgpu3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:176 assert_input_compatibility raise ValueError('Input ' + str(input_index) + ' of层 ' +

 ValueError: Input 0 of layer lstm is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, None, None, 88]

我已经重新检查了整个代码,并且不可能像警告或错误那样输入 (None,None,None),我的输入维度是(3,32,10,1)

更新

我也尝试用 python 编写一个生成器函数,但得到了完全相同的错误。

我的生成器功能

def generate_arrays_from_file(batchsize,df):
    #print(bat)
    inputs = []
    targets = []
    batchcount = 0
    while True:
            
            df3 = df.loc[np.arange(batchcount*batchsize,(batchcount*batchsize)+batchsize)]
            #Some pre processing
            X = [input_array_1,input_array_2,input_array_3]
            y = [out_1,out_2,out_3]
            yield X,y 
            batchcount = batchcount +1

keras 内部似乎有问题(可能是因为我使用的是函数式 API)

更新 2

我也尝试输出元组

       X = (input1_X,input2_X,input3_X)
       y = (output1_y,output2_y,output3_y)

也命名为输入/输出,但它不起作用

        X =  {"input_1": input1_X, "input_2": input2_X,"input_3": input3_X}
        y = {"output_1": output1_y, "output_2": output2_y,"output_3": output3_y}

关于问题表述的注意事项:

将单个 X 特征更改为形状 (32,10) 而不是 (32,10,1) 可能有助于摆脱这个错误,但这不是我想要的,它改变了我的问题(我不再有 10 个时间步每个功能一个)

我用Keras编写了一个生成器函数,然后从__getitem__返回X,y之前,我仔细检查了X和Y的形状,它们都还好,但是生成器给出了尺寸不匹配数组和警告。

(要复制的Colab代码: https ://colab.research.google.com/drive/1bSJm44MMDCWDU8IrG2GXKBvXNHCuY70G?usp = sharing)

我的训练和验证生成器与

class ValidGenerator(Sequence):
    def __init__(self, df, batch_size=64):
        self.batch_size = batch_size
        self.df = df
        self.indices = self.df.index.tolist()
        self.num_classes = num_classes
        self.shuffle = shuffle
        self.on_epoch_end()

    def __len__(self):
        return int(len(self.indices) // self.batch_size)

    def __getitem__(self, index):
        index = self.index[index * self.batch_size:(index + 1) * self.batch_size]
        batch = [self.indices[k] for k in index]
        
        X, y = self.__get_data(batch)
        return X, y

    def on_epoch_end(self):
        self.index = np.arange(len(self.indices))
        if self.shuffle == True:
            np.random.shuffle(self.index)

    def __get_data(self, batch):
        #some logic is written here
        #hat prepares 3 X features and 3 Y outputs 
        X = [input_array_1,input_array_2,input_array_3]
        y = [out_1,out_2,out_3]
        #print(len(X))
        
        return X, y

我返回X,y的元音,其中每个都有3个输入要素和3个输出(3,32,10,1) ,所以X的形状是(3,32,10,1)

我正在使用功能性的api构建具有以下结构的模型(我有串联,多输入/输出等功能,而顺序操作是不可能的)

在此处输入图片说明

当我尝试使用以下代码将模型与生成器拟合时

train_datagen = TrainGenerator(df=train_df,  batch_size=32, num_classes=None, shuffle=True)
valid_datagen = ValidGenerator(df=train_df,  batch_size=32, num_classes=None, shuffle=True)
model.fit(train_datagen, epochs=2,verbose=1,callbacks=[checkpoint,es])

我收到这些警告和错误,这些警告和错误不会消失

时代1/2警告:tensorflow:为输入> Tensor(“ input_1:0”,shape =(None,10),dtype = float32)构造了形状为(None,10)的模型,但在输入上调用了它具有不兼容的形状(无,无,无)。

警告:tensorflow:为输入Tensor(“ input_2:0”,shape =(None,10),dtype = float32)构造了形状为(None,10)的模型,但是在形状不兼容的输入(None,10)上调用了该模型无,无)。 警告:tensorflow:为输入Tensor(“ input_3:0”,shape =(None,10),dtype = float32)构造了形状为(None,10)的模型,但是在形状不兼容的输入(None,10)上调用了该模型无,无)。 ……调用return super(RNN,self)。 调用(输入,** kwargs)/home/eduardo/.virtualenvs/kgpu3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:975调用input_spec.assert_input_compatibility(self.input_spec,输入/home/eduardo/.virtualenvs/kgpu3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:176 assert_input_compatibility提高ValueError('Input'+ str(input_index)+'层'+

 ValueError: Input 0 of layer lstm is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, None, None, 88]

我已经重新检查了整个代码,并且无法输入(无,无,无),如警告或错误,我的输入尺寸为(3,32,10,1)

更新

我也试图用python编写一个生成器函数,并得到了完全相同的错误。

我的发电机功能

def generate_arrays_from_file(batchsize,df):
    #print(bat)
    inputs = []
    targets = []
    batchcount = 0
    while True:
            
            df3 = df.loc[np.arange(batchcount*batchsize,(batchcount*batchsize)+batchsize)]
            #Some pre processing
            X = [input_array_1,input_array_2,input_array_3]
            y = [out_1,out_2,out_3]
            yield X,y 
            batchcount = batchcount +1

内部keras似乎有问题(可能是由于我使用的是功能性API)

更新2

我也尝试输出元组

       X = (input1_X,input2_X,input3_X)
       y = (output1_y,output2_y,output3_y)

并且也命名为输入/输出,但是它不起作用

        X =  {"input_1": input1_X, "input_2": input2_X,"input_3": input3_X}
        y = {"output_1": output1_y, "output_2": output2_y,"output_3": output3_y}

有关问题表述的注意事项:

将单个X特征更改为形状(32,10)而不是(32,10,1)可能有助于消除此错误,但这不是我想要的,这改变了我的问题(我不再有10个时间步长每个都有一个功能)

我用Keras编写了一个生成器函数,然后从__getitem__返回X,y之前,我仔细检查了X和Y的形状,它们都还好,但是生成器给出了尺寸不匹配数组和警告。

(要复制的Colab代码: https ://colab.research.google.com/drive/1bSJm44MMDCWDU8IrG2GXKBvXNHCuY70G?usp = sharing)

我的训练和验证生成器与

class ValidGenerator(Sequence):
    def __init__(self, df, batch_size=64):
        self.batch_size = batch_size
        self.df = df
        self.indices = self.df.index.tolist()
        self.num_classes = num_classes
        self.shuffle = shuffle
        self.on_epoch_end()

    def __len__(self):
        return int(len(self.indices) // self.batch_size)

    def __getitem__(self, index):
        index = self.index[index * self.batch_size:(index + 1) * self.batch_size]
        batch = [self.indices[k] for k in index]
        
        X, y = self.__get_data(batch)
        return X, y

    def on_epoch_end(self):
        self.index = np.arange(len(self.indices))
        if self.shuffle == True:
            np.random.shuffle(self.index)

    def __get_data(self, batch):
        #some logic is written here
        #hat prepares 3 X features and 3 Y outputs 
        X = [input_array_1,input_array_2,input_array_3]
        y = [out_1,out_2,out_3]
        #print(len(X))
        
        return X, y

我返回X,y的元音,其中每个都有3个输入要素和3个输出(3,32,10,1) ,所以X的形状是(3,32,10,1)

我正在使用功能性的api构建具有以下结构的模型(我有串联,多输入/输出等功能,而顺序操作是不可能的)

在此处输入图片说明

当我尝试使用以下代码将模型与生成器拟合时

train_datagen = TrainGenerator(df=train_df,  batch_size=32, num_classes=None, shuffle=True)
valid_datagen = ValidGenerator(df=train_df,  batch_size=32, num_classes=None, shuffle=True)
model.fit(train_datagen, epochs=2,verbose=1,callbacks=[checkpoint,es])

我收到这些警告和错误,这些警告和错误不会消失

时代1/2警告:tensorflow:为输入> Tensor(“ input_1:0”,shape =(None,10),dtype = float32)构造了形状为(None,10)的模型,但在输入上调用了它具有不兼容的形状(无,无,无)。

警告:tensorflow:为输入Tensor(“ input_2:0”,shape =(None,10),dtype = float32)构造了形状为(None,10)的模型,但是在形状不兼容的输入(None,10)上调用了该模型无,无)。 警告:tensorflow:为输入Tensor(“ input_3:0”,shape =(None,10),dtype = float32)构造了形状为(None,10)的模型,但是在形状不兼容的输入(None,10)上调用了该模型无,无)。 ……调用return super(RNN,self)。 调用(输入,** kwargs)/home/eduardo/.virtualenvs/kgpu3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:975调用input_spec.assert_input_compatibility(self.input_spec,输入/home/eduardo/.virtualenvs/kgpu3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:176 assert_input_compatibility提高ValueError('Input'+ str(input_index)+'层'+

 ValueError: Input 0 of layer lstm is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, None, None, 88]

我已经重新检查了整个代码,并且无法输入(无,无,无),如警告或错误,我的输入尺寸为(3,32,10,1)

更新

我也试图用python编写一个生成器函数,并得到了完全相同的错误。

我的发电机功能

def generate_arrays_from_file(batchsize,df):
    #print(bat)
    inputs = []
    targets = []
    batchcount = 0
    while True:
            
            df3 = df.loc[np.arange(batchcount*batchsize,(batchcount*batchsize)+batchsize)]
            #Some pre processing
            X = [input_array_1,input_array_2,input_array_3]
            y = [out_1,out_2,out_3]
            yield X,y 
            batchcount = batchcount +1

内部keras似乎有问题(可能是由于我使用的是功能性API)

更新2

我也尝试输出元组

       X = (input1_X,input2_X,input3_X)
       y = (output1_y,output2_y,output3_y)

并且也命名为输入/输出,但是它不起作用

        X =  {"input_1": input1_X, "input_2": input2_X,"input_3": input3_X}
        y = {"output_1": output1_y, "output_2": output2_y,"output_3": output3_y}

有关问题表述的注意事项:

将单个X特征更改为形状(32,10)而不是(32,10,1)可能有助于消除此错误,但这不是我想要的,这改变了我的问题(我不再有10个时间步长每个都有一个功能)

我有一个与自定义生成器类似的问题,它只需要传递一个大小为 10 的 numpy 数组作为输入和一个输出。

为了解决这个问题,我必须像这样转换传递给神经网络的 2 个向量的形状:

def slides_generator(integer_list):
    
    # stuff happens

    x = np_ts[np_index:np_index+10] # numpy array
    y = np_ts[np_index+10] # numpy array

    yield tf.convert_to_tensor(x)[np.newaxis, ...], tf.convert_to_tensor(y)[np.newaxis, ...]
    
doge_gen = slides_generator(integer_list) #next(doge_gen)

基本上你需要传递形状为 (None,size) 的 2 个数组,所以在我的情况下是 (None,10) 和 (None,1),为了实现这一点,我只传递了 2 个重塑的张量。

您需要 None 维度作为批量大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM