0

我已将数据拆分为训练和验证样本(80% 用于训练,20% 用于验证):

Total_Samples = 1147
Training_Samples = 918
Validation_Samples = 229

但是,我面临与我的最后一批数据小于batch_size我为我的问题定义的数据相关的维度错误问题。假设我使用 a batch_size = 32,您可以看到最后一批训练和验证数据都比这小。我创建了一个 python 生成器来提供这些批次,如下所示:

def power_data_generator(batch_size,gen_type=''):
    while 1:
        df_input_train=pd.read_csv('some arguments')
        df_target_train=pd.read_csv('some arguments')
        df_input_valid=pd.read_csv('some arguments')
        df_target_valid=pd.read_csv('some arguments')
        for chunk, chunk2, chunk3, chunk4 in zip(df_input_train,df_target_train,df_input_valid,df_target_valid):
            X_train = chunk.values
            X_train = np.resize(X_train,(batch_size,24,2,1))
            Y_train = chunk2.values
            X_valid = chunk3.values
            X_valid = np.resize(X_valid,(batch_size,24,2,1))
            Y_valid = chunk4.values
            if gen_type =='training':
                yield (X_train[0:batch_size],Y_train[0:batch_size])
            elif gen_type =='validation':
                yield (X_valid[0:batch_size],Y_valid[0:batch_size])
            elif gen_type =='inference':
                yield X_valid

如果最后一批小于batch_size我定义的,我可以添加任何命令来忽略最后一批(或添加一些条目以使其完全等于我的batch_size)?

4

1 回答 1

0

我假设您chunksize=batchsize在函数中添加了一个参数read_csv

比方说batch_size=32

这使得 pandas 为您提供 32 大小的数据帧。但最后它会给你剩下的。

然后你尝试重塑 X_train :

  • X_train = np.resize(X_train,(batch_size,24,2,1))

问题必须出现在最后一块。

我认为 try + except 可以解决它。

如果引发异常,您可以尝试重塑和中断 for 循环。

def power_data_generator(batch_size,gen_type=''):
    while 1:
        df_input_train=pd.read_csv('some arguments')
        df_target_train=pd.read_csv('some arguments')
        df_input_valid=pd.read_csv('some arguments')
        df_target_valid=pd.read_csv('some arguments')
        for chunk, chunk2, chunk3, chunk4 in zip(df_input_train,df_target_train,df_input_valid,df_target_valid):
            X_train = chunk.values
            ######################
            try:
                X_train = np.resize(X_train,(batch_size,24,2,1))
            except:
                break
            Y_train = chunk2.values
            X_valid = chunk3.values
            try:
                X_valid = np.resize(X_valid,(batch_size,24,2,1))
            except:
                break
            #######################
            Y_valid = chunk4.values
            if gen_type =='training':
                    yield (X_train[0:batch_size],Y_train[0:batch_size])
            elif gen_type =='validation':
                yield (X_valid[0:batch_size],Y_valid[0:batch_size])
            elif gen_type =='inference':
                yield X_valid

您可能想根据线休息的数量重塑并让出其余部分。

于 2019-12-02T21:27:02.993 回答