zoukankan      html  css  js  c++  java
  • DL项目代码目录结构管理

    参考自:https://blog.csdn.net/weixin_42287851/article/details/89055883

    https://www.kaggle.com/general/4815

    1.一个框架

     2.举例

     这个代码目录看起来就挺复杂的。

     分别包括:外面的对初始数据的处理函数/回调/参数/数据集/io/模型/输出保存/训练。

     总之,如何给代码构建目录,是有个大致框架,但也可以根据自己的项目调整。

     3.一个讲解

    讲解非常好!:http://arkitus.com/patterns-for-research-in-machine-learning/

    1.要使用版本控制,以便更好地合作、重复实验结果。

    2.要将数据和代码分开存放,能够方便地分享代码、替换数据集。

    project_name/code/ 
    project_name/data/

    更好的话,可以将两个部分完全分开存放,加强了数据隔离,是向修订控制隐藏数据的一种简单方法。

    /path/to/code/ 
    /other/path/to/data/

    3.将输入数据、工作数据、输出数据分开。

    /path/to/code/ 
    /other/path/to/data/input/ 
    /other/path/to/data/working/ 
    /other/path/to/data/output/

    因为输入数据是不变的;工作数据是算法模型产生的,一直在变;输出数据是由模型产生的,它们很少改变。

    这样可以安全地删除输出文件,能将输出文件方便地分享给他人。

    4.对输入文件有一个说明文件readme;

    编写一键式脚本,将原始数据转换为您自己的代码使用的任何格式; 永远不要手工清理数据,如果要清理,则要彻底记录下来,并不断变化。

    5.经常将所有内容保存到磁盘。

    以适当的时间间隔将模型参数保存到磁盘。
    如果图形对于运行时诊断很有用,则可能也应该将其保存到磁盘。
    在不同的数据集上运行算法时,请将输出存储在单独的文件夹中。
    将每天工作的输出存储在单独的文件夹中。

    工作文件夹的例子:

    working/18_07_2012/dataset_1/ 
    working/18_07_2012/dataset_2/ 
    working/19_07_2012/dataset_1/ 
    working/19_07_2012/dataset_2/

    在上述第一个数据集下,可以看到以下文件:

    dataset_1/likelihood_curve_iteration_100.eps 
    dataset_1/likelihood_curve_iteration_200.eps 
    dataset_1/likelihood_curve_iteration_300.eps 
    dataset_1/model_parameters_iteration_100.dat 
    dataset_1/model_parameters_iteration_200.dat 
    dataset_1/model_parameters_iteration_300.dat

    6.选项与参数分开。

    如下:

     这个是选项;

    这是模型参数。

    7.不要使用全局参数。

    而是通过过函数参数进行信息传递。

    #好的方法
    % set the options 
    options = ... 
    
    % load the data 
    data = ... 
    
    % learn the parameters 
    parameters = train_model(options, data);
    
    #不好的方法
    global options, data; 
    
    % set the options 
    options = ... 
    
    % load the data 
    data = ... 
    
    % learn the parameters 
    parameters = train_model(); % assumes options and data have been set globally

    不设置全局参数:

    更容易debug代码;更易并行化代码。

    8.保留用来产生模型的参数

    % set the options 
    options = ... 
    
    % load the data 
    data = ... 
    
    % learn the parameters 
    parameters = train_model(options, data); 
    
    % store the results 
    serialise(options, 'options.dat', options.working_path); 
    serialise(parameters, 'parameters.dat', options.working_path);

    更易复现结果。

    9.更易扫描选项:

    % set the options 
    options.learning_rate = 0.1; 
    options.latent_dimensions = {10, 20}; 
    options.num_iterations = {300, 600}; 
    
    % load the data 
    data = ... 
    
    % sweep the options 
    for options_configuration in get_configurations(options) 
    #这里的get_configurations函数就让能使在一个for循环里方便地实现多个模型的训练。
        % learn the parameters 
        parameters = train_model(options, data); 
    
        % store the results 
        serialise(parameters, 'parameters.dat'], ... 
                  [options.working_path '_' options_configuration.name]); 
    
    end

    并且通过options中的路径参数不同,则结果可以保存在不同的路径下:

    working/latent_dimensions_10_num_iterations_300/ 
    working/latent_dimensions_20_num_iterations_300/ 
    working/latent_dimensions_10_num_iterations_600/ 
    working/latent_dimensions_20_num_iterations_600/

    如果您有权访问群集,则可以轻松地使用它来将每次运行分发到另一台计算机。

    10.使仅执行部分代码变得容易。

    如果您的代码在概念上可以看作是按顺序进行计算的某种管道:
    以一种可以指定要执行的计算的方式编写主脚本。 将计算的每个部分的结果存储到磁盘。 例如,以下命令运行preprocess_data,initialise_model和train_model脚本。

    >> run_experiment('dataset_1_options', '|preprocess_data|initialise_model|train_model|');

    下面的命令是仅运行train_model脚本,并且评估模型:

    >> run_experiment('dataset_1_options', '|train_model|evaluate_model|');

    通过注释掉代码来模拟执行部分代码,是浪费时间的。

    11.使用检查点保存模型。

    你的实验可能会失败,尤其是在并行的时候:

    以适当的时间间隔将整个状态(计数器等)存储到磁盘。
    编写代码,一旦激活,它将从最新的保存状态继续运行算法。
    确保清楚可见算法从保存状态开始。

    % set the options 
    options = ... 
    
    % load the data 
    data = ... 
    
    if saved_state_exists(options)
    
        % load from disk 
        [parameters, state] = deserialize_latest_params_state(options.working_path); 
    
        % command line output 
        disp(['Starting from iteration ' state.iteration]); 
    
    else 
    
        % initialize 
        parameters = init_parameters(); 
        state = init_state(); 
    
    end 
    
    % learn the parameters 
    parameters = train_model(options, data, parameters, state);

    12.编写演示和测试。

    那么项目结构如下:

    project/ 
        code/ 
        data/ 
        demos/ 
        tests/

    13.其他想法

    务必估算您希望实验进行多长时间。

    保留一份日记,说明您进行每个实验的原因以及发现的结果。
    使用大约10秒钟或更短的时间来处理大多数数据集,进行编码和调试。
    轻松交换不同的型号和适用性指标。

  • 相关阅读:
    洛谷 3393 逃离僵尸岛
    洛谷 3275 [SCOI2011]糖果
    SP1437 Longest path in a tree(树的直径)
    洛谷2483 k短路([SDOI2010]魔法猪学院)
    洛谷3243 [HNOI2015]菜肴制作
    洛谷 4568 [JLOI2011] 飞行路线
    [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    手机端table表格bug
    手机端左右滑动效果
    去掉手机端延迟300ms
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/11924400.html
Copyright © 2011-2022 走看看