Deep learning Pytorch:小批量过盈:调试

Deep learning Pytorch:小批量过盈:调试,deep-learning,computer-vision,pytorch,image-classification,Deep Learning,Computer Vision,Pytorch,Image Classification,我正在构建一个多类图像分类器。 有一种调试技巧可以在单个批处理上进行过度调整,以检查程序中是否存在更深层次的错误。 如何以可移植的格式设计代码? 一个艰难但不明智的方法是为一小批测试构建一个保持训练/测试文件夹,其中测试类由2个分布-可见数据和不可见数据组成,如果模型在可见数据上表现更好,而在不可见数据上表现较差,那么我们可以得出结论,我们的网络没有任何更深层次的结构缺陷。 但是,这似乎不是一种智能和便携的方式,而且必须解决所有问题 目前,我有一个dataset类,我在其中以下面的方式对trai

我正在构建一个多类图像分类器。
有一种调试技巧可以在单个批处理上进行过度调整,以检查程序中是否存在更深层次的错误。
如何以可移植的格式设计代码?
一个艰难但不明智的方法是为一小批测试构建一个保持训练/测试文件夹,其中测试类由2个分布-可见数据和不可见数据组成,如果模型在可见数据上表现更好,而在不可见数据上表现较差,那么我们可以得出结论,我们的网络没有任何更深层次的结构缺陷。
但是,这似乎不是一种智能和便携的方式,而且必须解决所有问题

目前,我有一个dataset类,我在其中以下面的方式对train/dev/test中的数据进行分区-

def split_equal_into_val_test(csv_file=None, stratify_colname='y',
                              frac_train=0.6, frac_val=0.15, frac_test=0.25,
                              ):
    """
    Split a Pandas dataframe into three subsets (train, val, and test).

    Following fractional ratios provided by the user, where val and
    test set have the same number of each classes while train set have
    the remaining number of left classes
    Parameters
    ----------
    csv_file : Input data csv file to be passed
    stratify_colname : str
        The name of the column that will be used for stratification. Usually
        this column would be for the label.
    frac_train : float
    frac_val   : float
    frac_test  : float
        The ratios with which the dataframe will be split into train, val, and
        test data. The values should be expressed as float fractions and should
        sum to 1.0.
    random_state : int, None, or RandomStateInstance
        Value to be passed to train_test_split().

    Returns
    -------
    df_train, df_val, df_test :
        Dataframes containing the three splits.

    """
    df = pd.read_csv(csv_file).iloc[:, 1:]

    if frac_train + frac_val + frac_test != 1.0:
        raise ValueError('fractions %f, %f, %f do not add up to 1.0' %
                         (frac_train, frac_val, frac_test))

    if stratify_colname not in df.columns:
        raise ValueError('%s is not a column in the dataframe' %
                         (stratify_colname))

    df_input = df

    no_of_classes = 4
    sfact = int((0.1*len(df))/no_of_classes)

    # Shuffling the data frame
    df_input = df_input.sample(frac=1)


    df_temp_1 = df_input[df_input['labels'] == 1][:sfact]
    df_temp_2 = df_input[df_input['labels'] == 2][:sfact]
    df_temp_3 = df_input[df_input['labels'] == 3][:sfact]
    df_temp_4 = df_input[df_input['labels'] == 4][:sfact]

    dev_test_df = pd.concat([df_temp_1, df_temp_2, df_temp_3, df_temp_4])
    dev_test_y = dev_test_df['labels']
    # Split the temp dataframe into val and test dataframes.
    df_val, df_test, dev_Y, test_Y = train_test_split(
        dev_test_df, dev_test_y,
        stratify=dev_test_y,
        test_size=0.5,
        )


    df_train = df[~df['img'].isin(dev_test_df['img'])]

    assert len(df_input) == len(df_train) + len(df_val) + len(df_test)

    return df_train, df_val, df_test

def train_val_to_ids(train, val, test, stratify_columns='labels'): # noqa
    """
    Convert the stratified dataset in the form of dictionary : partition['train] and labels.

    To generate the parallel code according to https://stanford.edu/~shervine/blog/pytorch-how-to-generate-data-parallel
    Parameters
    -----------
    csv_file : Input data csv file to be passed
    stratify_columns : The label column

    Returns
    -----------
    partition, labels:
        partition dictionary containing train and validation ids and label dictionary containing ids and their labels # noqa

    """
    train_list, val_list, test_list = train['img'].to_list(), val['img'].to_list(), test['img'].to_list() # noqa
    partition = {"train_set": train_list,
                 "val_set": val_list,
                 }
    labels = dict(zip(train.img, train.labels))
    labels.update(dict(zip(val.img, val.labels)))
    return partition, labels
另外,我知道Pytork lightning,并且知道它们有一个可以轻松使用的过度装配功能,但我不想转移到Pytork lightning。

我不知道它的便携性有多好,但我使用的一个技巧是修改
数据集中的
\len\uuu
函数

如果我从

def\uuuu len\uuuu(自):
返回长度(自数据列表)

def\uuuu len\uuuu(自):
返回20

它将只输出数据集中的前20个元素(不考虑无序排列)。您只需更改一行代码,其余的代码就可以正常工作,因此我认为它非常简洁。

您所说的可移植是什么意思?为什么不训练20个样本,直到你的模型达到100%成功(不管你的指标是什么)如何限制代码只训练20个样本,而不创建另一个数据集文件夹。谢谢回答。这会给train和dev set提供相同的元素吗?因为如果我们提供不同的dev set和train set,那么您不认为如果模型在dev set上表现不佳,那么它也可能由于各种其他原因发生。我的意思是发现网络正常运行(没有任何更深层次的结构缺陷),它必须在不同的开发环境中表现不佳,在列车组中遇到的相同元素上也表现出色。为此,开发集应该包含这两种元素的组合。@Mark I不同意“必须在不同的开发上执行得很差”。对于调试,我们只需要对一小部分数据进行过度拟合。我们甚至不需要在这里设置“dev”。@标记它应该能够达到非常高的精度(或非常低的损耗)。好的,我明白你的意思了。我把事情复杂化了。我刚刚通过了火车装载机,也代替了有效装载机,还通过了您的建议更改了限制len功能。我设法发现我的网络有一个bug。谢谢