使用flow_from_dataframe方法时出现“列表索引超出范围”错误

时间:2019-07-30 12:01:17

标签: python tensorflow

我正在使用python和tensorflow,并已从dataframe方法(从kaggle查看开放源代码)创建了一个流,以生成训练和验证datagen。我的问题是,当我运行用于创建test_X的代码时,使用相同的flow_from_dataframe方法创建了test_Y集。

最初,此代码已按照kaggle代码显示的方式工作,但由于某种原因,它似乎对我不起作用。

我检查了许多kaggle内核,其中一些是:

https://www.kaggle.com/digitalchaos666/simple-vgg16/notebookhttps://www.kaggle.com/kmader/attention-on-pretrained-vgg16-for-bone-age

它们都具有相同的代码来解决该问题,但现在似乎无法运行。即使您分叉内核并仅按原样运行代码,而没有进行任何更改,这时它似乎仍会失败

describe file('~/.kube/config') do
  it { should exist }
end

1 个答案:

答案 0 :(得分:0)

我已经通过为每个生成器创建单独的数据帧解决了我的问题。 train_flow和valid_flow都使用flow_from_dataframe方法,该方法接受种子值。这样,每当我运行代码时,我的训练和验证设置都将是相同的,这是我所需要的。

另一方面,我的test_flows没有输入种子值,因此我为这些对象创建了一个新方法。

train_idg = ImageDataGenerator(zoom_range=0.2,
                           fill_mode='nearest',
                           rotation_range=25,  
                           width_shift_range=0.25,  
                           height_shift_range=0.25,  
                           vertical_flip=False, 
                           horizontal_flip=True,
                           shear_range = 0.2,
                           samplewise_center=False, 
                           samplewise_std_normalization=False)

val_idg = ImageDataGenerator(width_shift_range=0.25, 
                         height_shift_range=0.25, 
                         horizontal_flip=True)

test_idg = ImageDataGenerator()

####
def flow_from_dataframe(imgDatGen, df, batch_size, seed, img_size):
    gc.collect()
    gen_img = imgDatGen.flow_from_dataframe(dataframe=df,
        x_col='path', y_col='boneage_zscore',
        batch_size=batch_size, seed=seed, shuffle=True, class_mode='other',
        target_size=img_size, color_mode='rgb',
        drop_duplicates=False)

    gen_gender = imgDatGen.flow_from_dataframe(dataframe=df,
        x_col='path', y_col='gender',
        batch_size=batch_size, seed=seed, shuffle=True, class_mode='other',
        target_size=img_size, color_mode='rgb',
        drop_duplicates=False)

    while True:
        X1i = gen_img.next()
        X2i = gen_gender.next()
        gc.collect()
        yield [X1i[0], X2i[1]], X1i[1]

####

train_flow = flow_from_dataframe(train_idg, train_df, BATCH_SIZE_TRAIN, SEED, IMG_SIZE)

valid_flow = flow_from_dataframe(val_idg, valid_df, BATCH_SIZE_VAL, SEED, IMG_SIZE)

####


def test_gen_2inputs(imgDatGen, df, batch_size, img_size):
    gc.collect()
    gen_img = imgDatGen.flow_from_dataframe(dataframe=df,
        x_col='path', y_col='boneage_zscore',
        batch_size=batch_size, shuffle=False, class_mode='other',
        target_size=img_size, color_mode='rgb',
        drop_duplicates=False)

    gen_gender = imgDatGen.flow_from_dataframe(dataframe=df,
        x_col='path', y_col='gender',
        batch_size=batch_size, shuffle=False, class_mode='other',
        target_size=img_size, color_mode='rgb',
        drop_duplicates=False)

    while True:
        X1i = gen_img.next()
        X2i = gen_gender.next()
        gc.collect()
        yield [X1i[0], X2i[1]], X1i[1]

test_flow = test_gen_2inputs(test_idg, test_df, 789, IMG_SIZE)
male_test_flow = test_gen_2inputs(test_idg, male_df, 789, IMG_SIZE)
female_test_flow = test_gen_2inputs(test_idg, female_df, 789, IMG_SIZE)

此后,以下代码成功运行

train_X, train_Y = next(my_train_flow)
test_X, test_Y = next(test_flow)
male_test_X, male_test_Y = next(male_test_flow)
female_test_X, female_test_Y = next(female_test_flow)