Git 如何在版本控制系统中使用随机数组织代码进行分析?
这主要是一个关于VCS(如git)中文件组织的问题,但为了更好地了解我的问题,这里简要介绍一下主题: 项目概述 我正在从事一个项目,在这个项目中,类似神经网络的概率模型被实现,并针对不同的参数集进行测试。目前我们正在用Python实现,尽管这个问题可能也与不同的编程语言有关。结果通常是误差测量或图表或类似的东西。目前,我们的项目如下:Git 如何在版本控制系统中使用随机数组织代码进行分析?,git,random,version-control,Git,Random,Version Control,这主要是一个关于VCS(如git)中文件组织的问题,但为了更好地了解我的问题,这里简要介绍一下主题: 项目概述 我正在从事一个项目,在这个项目中,类似神经网络的概率模型被实现,并针对不同的参数集进行测试。目前我们正在用Python实现,尽管这个问题可能也与不同的编程语言有关。结果通常是误差测量或图表或类似的东西。目前,我们的项目如下: 有几个人正在开发项目的代码库,并正在实现新特性 其他一些人已经在尝试探索不同参数集的模型行为,即找出模型在哪些参数范围内表现出定性不同的行为 目前,我们使用g
- 有几个人正在开发项目的代码库,并正在实现新特性
- 其他一些人已经在尝试探索不同参数集的模型行为,即找出模型在哪些参数范围内表现出定性不同的行为
将numpy导入为np
np.随机种子(42)
a=np.random.rand()#->将始终为0.37454011188473625
b=np.random.rand()#->将始终为0.9507143064099162
版本控制问题
我们发现当前设置存在两个问题:
1)如何存储特定行为的快照以供以后探索?
为了恰当地标记快照,我们考虑在特定实验中使用分支和标记,并找到了一组参数,如下所示:
* master
|
*---------------
|\ \
* * experiment1 * experiment2
| | |
. * tag setting1 * tag setting1
. | |
. * tag setting2 * tag setting2
这里的问题是,据我们所知,带有标记的提交并不意味着以后要更改。由于我们以后可能会处理这些设置,因此必须再次从特定标记进行分支
另一种方法是只使用分支,每找到一个设置一个分支,这样每个分支头对应系统的一个工作状态。但这将导致我们确定的所有这些东西的大量分支
那么,你将如何组织这样一个结构?特别是考虑到以下问题:
2)如何在不改变概率行为的情况下将更改合并到存储的快照中
假设我们的一个开发人员在到目前为止的实现中发现了一个bug,或者实现了一个非常有用的特性并在主分支中修复了它。现在,将这些更改用于以后对模型的一个已识别行为的分析可能非常有益。问题是,如果更改使用随机数,则合并后模型的行为可能会完全不同
将numpy导入为np
np.随机种子(42)
a=np.random.rand()#->将始终为0.37454011188473625
#在这里修理一些东西
c=np.random.rand()
#->将为0.9507143064099162,与之前的“b”相同
b=np.random.rand()
#->现在将是0.7319939418114051,不再是0.9507143064099162
# ...
#使用“b”的代码将表现出不同的行为
这确实是一个大问题,因为这意味着:
- 要么我们不能(或者只有在不改变随机数的情况下)使用新功能,要么应用错误修复来分析已经确定的有趣的参数集和随机条件
- 或者,在每次使用随机数的更改之后,我们必须一次又一次地识别这些设置
您对这个问题有什么建议吗?下面是我们如何处理此类开发和实验工作流的 单独的代码和实验 真的,这是最重要的事情要记住。 这就像设计糟糕的计算机模拟,模拟模型和模拟算法完全交织在一起。由于许多原因,将模型和代码分离是非常重要的 同样,将项目分为:
- 一个用于核心算法实际代码开发的存储库
- 每个模型一个存储库 当然,模型可能包含特定于模型的代码,例如如何在ANN中设置神经元以及解析训练数据的代码等
- 每个实验一个存储库
实验就是你用一个明确的科学问题进行的每一次分析,比如“优化x如何影响分类精度?”。
有这样清晰的研究q
X-<date>-<title>/ # repository for experiment |___ models/ | |___ M1/ # submodule for M1's repository | |___ M2/ # submodule for M2's repository | | | ... |___ code/ # submodule for your core algorithms |___ data/ # a copy or link to your data sets |___ experiment1.sh # script to run your experiment |___ experiment2.sh # possibly some more sub-experiments