对Atlas数据进行深度监督学习的软件包。
deepcalo的Python项目详细描述
深蓝
python 3包,用于使用keras对atlas数据进行深度监督学习
作者:Frederik Faye,尼尔斯玻尔研究所,2019年
什么是Deepcalo?
此软件包允许您在任何后端使用keras来构建、训练和优化卷积神经网络(cnn)模型。
还可以集成用于处理非图像数据(如标量和序列)的模型。 可以构建的模型是专门为Atlas检测器设计的,但是您也可以将框架及其所有的好特性用于任何基于Keras的项目。
你为什么要用它?
- 所有的超参数都是通过一个python字典设置的,这使得在不同的模型上进行实验变得非常容易。
- 支持许多高级功能(如循环学习速率调度、分组卷积、dropblock正则化、挤压和激励模块、非标准优化器(如yogi和padam)等),而且很容易添加新功能。
- 模型的每次运行都会自动创建大量日志记录,包括超参数、模型架构图和模型在训练期间的权重,使您可以轻松地跟踪您尝试过的内容和结果。
目录
< A/>
安装
pip install deepcalo
< A/>
依赖关系
numpy,pandas,matplotlib,h5py,joblib,tqdm,keras,tensorflow,scikit-optimize,keras-contrib,keras-drop-block
如果您希望能够绘制模型的图形,请安装pydot
和graphviz
(如果可能,请使用conda install python graphviz
forgraphviz
)。
< A/>
用法
< A/>
快速启动
主要功能位于所谓的模型容器中,可以将其导入为
fromdeepcaloimportModelContainer
有关所有详细信息,请参见下面的文档。然而,一个例子往往是更好的学习方式。在演示文件夹中可以找到一些示例。
下载并运行mnist教程:
python mnist_tutorial.py --exp_dir ./my_mnist_experiment/ -v 1
这将训练一个小CNN一个历元来区分MNIST数据集的数字,在其第一个历元之后,应达到$>;95\%
$测试精度。
打开脚本查看发生了什么;重要的部分是超参数部分。试着用这些参数玩,看看你是否能找到一个更好的网络!还可以查看实验目录(/my\u mnist\u experiment/
)中logs文件夹的内容,以查看此框架必须提供的一些不错的日志功能。
还有很多超参数可供使用。见文档了解可能的内容。
< A/>
使用Atlas数据
在demos文件夹中,您还可以找到run_model.py
和hp_search.py
的更实际的示例。前者显示如何运行单个模型(非常像mnist示例),而后者则显示如何使用此包进行超参数优化(使用scikit optimize的bayesian优化)。
两者都使用实际的atlas模拟数据进行能量回归。这里使用的数据可以从lxplus(cernbox)目录/eos/user/l/lehrke/data/data下载(它应该对所有当前cern成员可见)。
脚本使用函数deepcalo.utils.load_atlas_data函数,该函数是为这些数据集定制的。如果需要,您可以修改此函数来处理数据,但是请注意,此框架使用'channels\u last'
格式,这是Keras中的标准格式。
< A/>
模型架构
以下是对现有不同开箱即用型号的快速浏览。每个模型都是为不同类型的输入(如图像、标量变量、轨迹或其他模型的输出)而创建的。
所有型号,除了顶部是可选的。但是,模型与它们的输入绑定的方式是,例如,如果atracks
数据集存在于所提供的数据中,则track net将集成到track net中。llow">组合模型
有关如何设置这些模型的超参数的信息,请参见文档,其中每个模型都有自己的部分。
< A/>
< H3>美国有线电视新闻网< /H3>下面,可以看到默认cnn架构的说明。它是由块组成的。对于除第一个块以外的所有块,一个块以降采样开始,并且特征映射的数量加倍。
输入下面的元组表示输入的大小(这里是高度、宽度、通道)。
请注意,规范化、激活功能、下采样和全局平均池都可以打开或关闭。
cnn的输出被传递到顶部
< A/>
<顶部>顶层模型是一个简单、密集的神经网络,它将其他模型的串联输出作为输入,并给出最终输出,可以是任何一维大小的$\geq 1
$。
< A/>
标量网
标量网络又是一个简单、密集的网络,它处理任何您可能想要包含的标量变量。它的输出可以连接到顶部、胶片生成器或两者。
< A/>
薄膜发生器
电影发生器是一种用标量变量调节cnn的好方法。您可以在这里阅读该技术的详细介绍。
胶片生成器可以从标量网络和跟踪网络中获取输入。我TS输出调节CNN
< A/>
轨道网
此模型将数据点的(变化的)轨迹向量数作为输入,并输出该数据点的固定大小表示,然后将其传递到胶片生成器或两者。
由于我们给出模型的数据点轨迹向量的顺序不包含任何信息,因此使用了深度集的置换不变方法。
以$x{\mathrm{track}
$形式的$t
$是数据集中任何数据点的最大跟踪向量数,如果给定数据点的实际跟踪数小于$t
$,则使用零填充。
请注意,现在,track net的聚合部分是一个简单的和,如深度集论文中所述。
< A/>
时间网
可以扩展cnn体系结构,使其包括每个单元确定其信号的时间信息,以帮助减轻超时的堆积。
每个通道中每个单元的时间(通常对应于量热计中的一层)在图像张量$x{\mathrm{time img}}
$中收集,该图像张量的分辨率和维度与标准单元图像张量$x{\mathrm{img}
$相同。
$x{\mathrm{time img}
$首先通过选通机制(时间网),该机制为每个通道中的每个像素输出一个介于0和1之间的实数。然后,这些数字与$x{\mathrm{img}
$合并,可以按元素进行乘法,然后沿通道轴进行连接,也可以仅按元素进行乘法。其思想是,基于元素的乘法允许网络降低超时单元格的值。
然后,将得到的合并张量作为cnn的输入(而不是$x{\mathrm{img}
$)。
建议使用pgauss\u f
作为时间网中的最后激活。
< A/>
组合
在下图中,您可以看到这些模型是如何组合在一起的。
良好的超参数配置
参见https://indico.cern.ch/event/800614/contributions/3327152/attachments/1799540/2936007/presentation_cnn.pdf了解有关能量回收的一些稍微过时的结果使用具有良好超参数的上述网络进行会话。
< A/>
文档
deepcalo的核心是model container类,可以在deepcalo.model\u container中找到,下面有文档说明。
classModelContainer:""" A class for organizing the creation, training and evaluation of models. """def__init__(self,data,params,dirs,save_figs=True,verbose=True):
参数
< A/>
数据:dict
培训、验证和(可选)测试数据字典,根据数据类型组织。
train
和val
,或train
,val
和test
。每个键指向另一个包含不同类型数据的dict。这些字典的键可以是'images'
、'scalars'
、'tracks'
、'sample_weights'
和'targets'
中的任意一个或全部。下面给出了这些键所指的文档。请注意,'images'
、'scalars'
和'tracks'
被视为输入,其中至少有一个必须为非空。请注意,数据
中包含的数据集的形状在模型创建中使用(但是一个数据点就足够了)。
图像:nDarrays的dict
- 如果
'images'
是数据[设置名称]
中的一个键,并且数据[设置名称]['images']
不是空的(其中设置名称可以是
'train'
,'val'
或'test'
),则将创建一个sed来处理这些图像。
为了使您能够跟踪不同类型的图像(用于不同类型的事物),与data
的'images'
键对应的值也是adict
假设你有两种不同类型的图片,你想由cnn处理。让我们称它们为"低分辨率图像"和"高分辨率图像"(即,这些是数据[集合名称][图像]字典中的键),每个都是4D numpy数组,形状为$(n,h,w,c)
$,其中$h
$和$w
$对于这两种类型是不同的图像。然后,您可以使用upsampling
功能(请参见params
)将它们放大到公共分辨率,以便在CNN中一起处理。
如果要使用时间图像,这些名称应与它们对应的单元格的名称完全相同,并预先设置'time'
;使用上面的示例,数据[设置名称]['images']
字典将有四个键"低分辨率图像"
,"低分辨率图像时间"
,"高分辨率图像"和
"高分辨率图像时间"
。只有以这种方式命名图像时,才能创建和使用用于处理时间图像的子模型。
标量:ndarray
- 如果
'scalars'
是数据[集合名称]
中的一个键,并且数据[集合名称]['scalars']
不为空(其中集合名称
可以是'train'
,'val'
或'test'
),则a标量网络将创建并用于处理这些标量。
标量应该以$(n,s)
$numpy数组的形式出现,其中$n
$是集合中的数据点数量,其中$s
$是标量的数量。
曲目:ndarray
- 如果
'tracks'
是数据[设置名称]
中的一个键,并且数据[设置名称]['tracks']
不为空(其中设置名称
可以是'train'
,'val'
或'test'
),则a轨迹网将是c已创建并用于处理这些曲目。
轨迹向量应以$(n,t,f)
$形状的numpy数组的形式出现,其中$n
$是数据点的数目,$t
$是最大轨迹数目,其中$f
$是每个轨迹向量的长度,即特征的数目。
由于每个数据点可以有一个与之相关联的可变数量的轨迹向量,因此数据点可以th$t<;t
$轨迹向量应为零填充(有关如何进行零填充的示例,请参见deepcalo.utils.load_atlas_data
)。由于其所有功能都在磁道网内部被屏蔽,因此所有具有唯一零的磁道都不会有助于磁道网的输出。
样本权重:ndarray
- 如果
'sample\u weights'
是数据[设置名称]
中的一个键,并且数据[设置名称]['sample\u weights']
是非空的(其中设置名称
可以是'train'
,'val'
或'test'
),则这些样本权重将用于所有损失中功能和指标(在培训和评估期间)。
目标:ndarray
- 包含任务的目标(或标签)。总是必需的。它的形状必须与所构造模型的最终输出相匹配。
有效数据示例
< A/> 这个字典包含了构建、训练和评估模型时使用的所有超参数。默认参数可以从函数 当在下面引用字典键时,实际上是指
对应于该键的值。例如,尽管键 时代:国际 批量大小:int 损失:str 指标:str或none列表 优化器:str或config dict
使用哪个优化器。任何keras优化器,以及padam
可以使用来自Keras_Contrib的Yogi优化器。 如果不想简单地使用
选择优化器,而是给出一个配置dict。参见
str或config dict lr_finder:dict LR U计划:DICT 请注意, 除上述内容外,还可以使用 自动导航:布尔 使用"提前停止":bool 恢复最佳权重:布尔值 预训练的U模型:dict n_gpu:int 数据发生器
与数据生成器相关的参数,当数据批量加载数据时,如果数据不适合内存,则此参数非常有用。其当前的实现与 "使用"键是决定是否使用数据生成器的布尔键。
使用采样:dict 用于在
网络。如果能够降低采样率
引入平移不变性)很重要,但输入
图像很小。
" 上采样后,对细胞图像张量进行归一化,以便
总的来说保持同样的能量,但是现在分散在
上采样像素。 < A/> 初始化:str或config dict 初始化子模型的参数。可以是任何
由keras识别的初始值设定项。 如果不想简单地使用
选择初始值设定项,而给出配置dict。请参阅说明
str或config dict的
规范化:str或config dict或none 标准化层。如果不是 可以是 如果不想简单地使用
选择规范化层,而给出一个配置dict。见
解释str或config dict 激活:str或config dict或none
中所有致密或卷积层的激活函数
子模型,除了最后一个,如果a 可以是 放置在每个规范化层之后
在子模型中,或-如果 如果不想简单地使用
选择激活,而给出配置dict。参见
str或config dict 层寄存器:dict,无或str或config dict作为值 应用于所有密集或卷积的层正则化
子模型中的层。这个dict收集 退出:浮点或dict或无 用于收集输入(例如从其他子模型)和给出
完整模型的输出。 参见"与所有子模型相关的键"了解键 单位:整数列表
最终激活:str 处理图像的子模型。仅当 参见"与所有子模型相关的键"了解键 CNN类型:str 转换维度:int 块体深度:列表
列出每个块的卷积层数作为元素。
请参见此处的插图了解块的构成。 注意is n初始过滤器:int 初始内核大小:int或元组 第一卷积层的核大小。 如果给定和int,并且 rest内核大小:整数或元组 除第一卷积层外所有卷积层的核大小。 如果给定和int,并且 基数:int 使用挤压和激励
挤压和激励比
globalavgpool:bool 下采样:str或none 当一个维度大于另一个维度的1.5倍时
尺寸,那个(较大的)尺寸将被下采样
减少3倍,而不是2。这可以在中更改
用于"下采样"的最小大小:int 进行卷积的任何维度的最小值(所以
不包括样品和通道尺寸)必须是如果下采样
就要发生了。这是为了防止下采样太小
图像: 例如,如果尝试对 处理标量变量的子模型。仅当 参见"与所有子模型相关的键"了解键 单位:整数列表
连接到:str列表 用于调制 参见"与所有子模型相关的键"了解键 使用:bool 单位:整数列表
用于处理轨迹的子模型。仅当 参见"与所有子模型相关的键"了解键 功率因数单位:整数列表 rho单元:整数列表 连接到:str列表 用于处理时间图像的子模型。仅当 参见"与所有子模型相关的键"了解键 单位:整数列表
使用资源:bool 最终激活:str或config dict 应用于最后一个致密层或
输入本身,以防 所选激活函数的输出应在范围内
〔0;1〕。
自定义激活
`"pgauss_f"已实现在此处使用。"P"代表
"参数",而"f"表示"翻转"。 最终激活初始化:列表
参数激活函数的初始权重列表
"pgauss" 如果不想简单地使用
选择激活,而给出配置dict。参见
str或config dict 假设您想使用
初始化某些子模型的权重。如果你想使用
此类参数的默认值( 例如,您可以将以下值作为
有关其他示例,请参见上面 对于配置dict的更技术的定义:它是
从 在大多数情况下,别名的设置使得
相同的类是有效的,例如,如果要使用批处理规范化
在某些子模型中,可以传递任何 < A/> 要放入日志的目录字典。应包含键 函数 是否保存模型及其子模型的绘图。 详细输出。设置为 创建由 训练由 评估由 < A/> < A/>importnumpyasnpset_names=['train','val','test']# Could also just be ['train', 'val']# Number of datapoints for each setn_points={set_name:int(1e3)forset_nameinset_names}# Dimension of images, which we will call 'example_imgs'h,w,c=14,25,2# Number of scalarsn_scalars=7# Create the datadata={set_name:{'images':{'example_imgs':np.random.randn(n_points[set_name],h,w,c)},'scalars':np.random.randn(n_points[set_name],n_scalars),'tracks':{},# Is empty, so track_net won't be created and used'targets':np.random.randn(n_points[set_name])# Here, the target is a single number per datapoint}forset_nameinset_names}
参数:指令
deepcalo.utils.get_default_params
'epochs'
当然是str,下面的文档关注的是
在本例中是一个int真的
,在完成所选的
时代:model_building_functions.py
用于实现的自定义丢失函数,
以及如何实现自己的目标。无
,则丢失
将是
高斯过程超参数搜索使用的评估函数。custom_classes.py
中实现的学习率查找器。
"扫描范围"是一个包含最小值和最大值的列表
要扫描的学习率。
'epochs'
键是一个int设置扫描中要使用的epochs数目。
根据训练集的大小,通常1-4个阶段就足够了。
如果'提示输入'
为真,则要求用户输入
周期性学习率表的范围(见下文)
应该在在完成学习率查找程序后
扫描。
'name'
键可以是none
(当没有学习率计划时
将使用),'clr'
(Smith,2015),
'onecycle'
(Smith等人,2017)或'sgdr'
(Loshchilov and Hutter,2017)。
'range'
键应该是一个包含两个浮点数的列表,第一个浮点数是最小学习速率,第二个浮点数是最大学习速率。
对于可能的学习速率计划,'步长因子'
键的含义不同:如果$s
$是'步长因子'
值,$k
$是每个历元的小批量更新数$e
$,则for'clr'
,周期的步长(即每半个周期的小批量更新数)由$ks
$,'onecycle'
,步长$k乘以e/s
$,表示$s
$是半个周期的数目,包括冷却到基本学习速率的百分之一。例如,如果$s=2.25
$,则将使用小批量更新总数的最后$\frac{0.25}{2.25}
$进行冷却,'sgdr'
,$s
$只是一个周期中的初始阶段数。'onecycle'
中的循环动量==true
只适用于具有动量
属性(例如'sgd'
)的优化器。'kwargs'
键传递特定于每个学习率计划类的关键字参数,该键应具有关键字参数字典作为其值。model_building_functions.py
自动设置良好学习的
基于所选优化器和批处理大小的速率,取
学习率与批的平方根有关
尺寸。比例常数从优化器到
优化器,可能从一个问题到另一个问题-使用学习
Rate Finder可找出适合您的问题的常数。min_delta=0.001
和
patience=150
(这些可以在model\u container.py
中更改)。'params_path'
为无
,则
预训练网络的参数假定在父网络中
"权重路径"的文件夹。
'layers_to_load'
是一个带有层的keras名称的列表(或
子模型),其权重应从预训练的
为手边的人做模特。这些名字必须与
在预先训练的模型和手头的模型中的结构。
'freeze_loaded_layers'
可以是布尔值(如果为真,则为
,
如果
false
)或具有与
"层到层加载"
(当第一个boo向前一步
"冻结加载的层"
回答是否冻结第一层
由"layers"到"load"或"not"等给出。deepcalo.utils.load_atlas_data
一起工作,可以在deepcalo.data_generator
中看到。
'n_workers'
键是一个int键,用于设置准备批处理时使用的CPU工作线程数。
"最大队列大小"
键是一个int设置一次可以准备多少批的上限。
'path'
键是一个str键,它给出数据集的路径。
'n嫒points'
键是一个带'train'
和'val'
键(或'train'
、'val'
和'test'
)的dict,其对应值是一个int,给定每组数据点的数量。
'load_kwargs'
键是一个包含要传递给数据生成器
类的\u init
的参数的dict。"use"
键是一个布尔值,决定是否进行上采样。"
"所需大小"
指所有图像应为的大小
在连接之前向上采样。"插值"
参数被传递到keras层upsample2d
有关所有子模型的键:
none
,则选择的规范化层是
放置在子模型中的每个稠密或卷积层之后,
即,在激活功能之前。'batch'
、'layer'
、'instance'
或'group'
中的任何一个。
注意最后三个是通过一个组实现的
规范化层(包含层和实例
标准化)。这意味着规范化的名称
当使用keras.utils.plot_model时,layer将是
当使用最后三个标准层中的任何一个时,对标准化层进行分组。
最终激活
变量存在。'relu'
,'leakyrelu'
,'prelu'
,'elu'
或
"旋转"
。
有关示例,请参见model\u building\u functions.py中的
获取激活
自定义激活函数的实现。
规范化
为无
,则在
子模型中的每个稠密或卷积层。核正则化器
s,
偏置正则化器
s,活动正则化器
s,核约束
s
以及要应用的"偏移"约束。无
,则不会添加dropout或dropblock层。有关子模型的键
top
:初始化
,
激活
,规范化
,层注册
和退出
单元中的最后一个元素
应该是所需输出的数目。
'sigmoid'
,使用'linear'
或none
(或'relu'
强制非负性)用于回归。有关子模型的键
cnn
:img_names
不是none时才使用。初始化
,
激活
,规范化
,层注册
和退出
'res'
以使用剩余
区块,如他等人,2016年。
将cnn_type设置为其他字符串是实现
其他类型的cnn,然后集成到框架中。
例如,要使用keras_contrib的resnet18,请将其设置为'res18'
-请参见get_cnn
下的model_building_functions.py
是
完成了2
或3
之一。是否使用二维或三维卷积。cnn_type
是'res'
,两个卷积层是
根据int使用,例如[1,2,2,2]
的a块深度值
结果CNN有18个卷积层,CNN将
如果cnn类型是
'simple'
,则只有9个卷积层。
conv dim
是2
,则内核大小为
(init_kernel_size,init_kernel_size)
被使用。如果conv_dim
取而代之的是3
,内核大小为(init_kernel_size,init_kernel_size,2)
使用。
如果给定元组,其长度必须等于conv dimconv dim
是2
,则内核大小为
(init_kernel_size,init_kernel_size)
被使用。如果conv_dim
取而代之的是3
,内核大小为(init_kernel_size,init_kernel_size,2)
使用。
如果给定元组,其长度必须等于conv dim基数>;1
时,将使用分组卷积(使用$1次
$卷积没有瓶颈)而不是普通卷积。仅支持二维卷积。使用挤压和激励是
真的
。比率不应小于传入通道的数目,这意味着,如果使用挤压和激励
为
真,则应设置
n_init_filters>;=比率
。
none
(不使用下采样),'avgpool'
(带有
池大小=2
)、'maxpool'
(池大小=2)或'spired'
(当使用步长和核大小为2的跨步卷积时
以减少采样)。在
model\u building\u functions.py中获取下采样
(none,7,6,4)
图像进行2d下采样
当min_size_for_downsampling
是6
时,下采样
通过,结果将是(none,3,3,4)
。如果,在
另一方面,用于下采样的最小尺寸是第三维度。
图像张量太小,没有下采样
发生。有关子模型的键
标量网络
:标量名称
不是none时才使用。初始化
,
激活
,规范化
,层注册
和退出
scalar_net
的输出作为
(部分)他们的投入。可以包含'top'
和/或
"胶片生成"
。原则上也可以是空的,但是你应该
而是通过设置
标量名称
到无
有关子模型的键
film-gen
:cnn
子模型的特征映射的子模型,称为
电影发生器有关概述,请参见此。仅当scalar_net
或track_net
的连接到列表包含
film_gen
(并且使用这些子模型)时才使用。初始化
,
激活
,规范化
,层注册
和退出
有关子模型的键
轨迹网
:使用轨迹
为真
时才使用。
使用深度集,请参见Zaheer等人,2017年初始化
,
激活
,规范化
,层注册
和退出
track\u net的输出
(部分)他们的投入。可以包含
'top'
和/或
"胶片生成"
。原则上也可以是空的,但是你应该
而是通过设置use_tracks
来关闭轨迹的使用false
有关子模型的键
时间网络
:使用次数
为
真时才使用
初始化
,
激活
,规范化
,层注册
和退出
最终激活
单位
单位
为空。和
"pgauss\u f"。它们包含一个参数,即高斯宽度,因此
final_activation_init应该包含一个浮点数,例如
final_activation_init可以是
[0.5]`。str或config dict解释:
mean=0.0,stddev=0.05,seed=none
),您只需将str'randomNormal'
作为
上述初始化
键的值。
但是,如果要向类传递一些其他参数,则
可以给一个配置dict作为
初始化
键。配置dict必须有两个键,
"类名称"
和"配置"
。对应于
"类名称"
键应为astr,例如"randomNormal"
,而
对应于'config'
键的值应该是包含
要传递给类的关键字参数(空的'config'
dict将使用默认值)。初始化
键:
{'类名':'randomnormal','config':{'stddev':1.0}}
layer_reg
的文档。keras.utils.serialize\u keras\u object(keras\u object)返回
其中
keras_object
是要创建的类实例。'batch'
,
'batchnormalization'
,'batch\u norm'
等,作为'class\u name'
指令:指令
'log'
(放置所有其他目录的目录)、'fig'
(用于保存图形)、'saved_models'
(用于保存模型和/或在训练期间模型的重量g)和'lr_finder'
(用于存储学习速率查找程序的结果,如果使用的话)。deepcalo.utils.create_directories
将返回这样一个字典(并创建它包含的目录)。保存图:bool
详细:bool
2
可禁用每个历元的进度条。方法
获取模型
params
定义的模型,并将其作为唯一输入。列车
get_model
构造的模型
评估
get_model
构建的模型,通常在培训结束时使用验证或测试集。已知问题
待办事项
推荐PyPI第三方库