对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

如果您希望能够绘制模型的图形,请安装pydotgraphviz(如果可能,请使用conda install python graphvizforgraphviz)。

< 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.pyhp_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

培训、验证和(可选)测试数据字典,根据数据类型组织。

这个字典ionary必须有两个或三个键,分别是trainval,或trainvaltest。每个键指向另一个包含不同类型数据的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

  • 包含任务的目标(或标签)。总是必需的。它的形状必须与所构造模型的最终输出相匹配。

有效数据示例

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}

< A/>

参数:指令

这个字典包含了构建、训练和评估模型时使用的所有超参数。默认参数可以从函数deepcalo.utils.get_default_params

当在下面引用字典键时,实际上是指 对应于该键的值。例如,尽管键'epochs' 当然是str,下面的文档关注的是 在本例中是一个int

时代国际

  • 要为其训练的里程数。如果设置为 真的,在完成所选的 时代:

批量大小int

  • 小批量。注意,如果使用多个GPU,那么 将平均分配给他们。

损失str

  • 任何Keras损失函数名。参见中的 model_building_functions.py用于实现的自定义丢失函数, 以及如何实现自己的目标。

指标str或none列表

  • 可以是keras识别的任何度量的名称。这个(或这些) 指标将在培训期间和期末考试中显示 评价。 请注意,如果执行HP_搜索,则列表的最后一项 将是高斯过程使用的评估函数 超参数搜索。如果列表为空或,则丢失将是 高斯过程超参数搜索使用的评估函数。

优化器:str或config dict

  • 使用哪个优化器。任何keras优化器,以及padam 可以使用来自Keras_Contrib的Yogi优化器。

    如果不想简单地使用 选择优化器,而是给出一个配置dict。参见 str或config dict

lr_finderdict

  • 学习率查找器词典(摘自史密斯,2015)参数。 "使用"键是决定是否使用 在custom_classes.py中实现的学习率查找器。 "扫描范围"是一个包含最小值和最大值的列表 要扫描的学习率。 'epochs'键是一个int设置扫描中要使用的epochs数目。 根据训练集的大小,通常1-4个阶段就足够了。 如果'提示输入'真,则要求用户输入 周期性学习率表的范围(见下文) 应该在在完成学习率查找程序后 扫描。

LR U计划DICT

  • 学习速率表参数字典。 '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可找出适合您的问题的常数。

使用"提前停止"bool

  • 使用keras earlystup回调函数,其中min_delta=0.001patience=150(这些可以在model\u container.py中更改)。

恢复最佳权重布尔值

  • 在评估之前,恢复训练中找到的最佳重量。

预训练的U模型dict

  • 使用(部分)预训练模型的参数字典。 "使用"键是一个布尔值,决定是否加载 预先训练的重量。"权重路径"是权重的路径 预先训练好的网络。如果'params_path',则 预训练网络的参数假定在父网络中 "权重路径"的文件夹。 'layers_to_load'是一个带有层的keras名称的列表(或 子模型),其权重应从预训练的 为手边的人做模特。这些名字必须与 在预先训练的模型和手头的模型中的结构。 'freeze_loaded_layers'可以是布尔值(如果为真,则为, 如果 false)或具有与 "层到层加载"(当第一个boo向前一步 "冻结加载的层"回答是否冻结第一层 由"layers"到"load"或"not"等给出。

n_gpuint

  • 训练中使用的GPU数。通常可以从可见的GPU推断。

数据发生器

  • 与数据生成器相关的参数,当数据批量加载数据时,如果数据不适合内存,则此参数非常有用。其当前的实现与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

使用采样:dict

  • 用于在 网络。如果能够降低采样率 引入平移不变性)很重要,但输入 图像很小。 ""use"键是一个布尔值,决定是否进行上采样。" "所需大小"指所有图像应为的大小 在连接之前向上采样。"插值" 参数被传递到keras层upsample2d

    上采样后,对细胞图像张量进行归一化,以便 总的来说保持同样的能量,但是现在分散在 上采样像素。

< A/>

有关所有子模型的键:

初始化str或config dict

  • 初始化子模型的参数。可以是任何 由keras识别的初始值设定项。

    如果不想简单地使用 选择初始值设定项,而给出配置dict。请参阅说明 str或config dict的

规范化str或config dict或none

激活:str或config dict或none

  • 中所有致密或卷积层的激活函数 子模型,除了最后一个,如果a最终激活 变量存在。

    可以是'relu''leakyrelu''prelu''elu'"旋转"。 有关示例,请参见model\u building\u functions.py中的获取激活 自定义激活函数的实现。

    放置在每个规范化层之后 在子模型中,或-如果规范化,则在 子模型中的每个稠密或卷积层。

    如果不想简单地使用 选择激活,而给出配置dict。参见 str或config dict

层寄存器:dict,无或str或config dict作为值

退出浮点或dict或无

有关子模型的键top

用于收集输入(例如从其他子模型)和给出 完整模型的输出。

参见"与所有子模型相关的键"了解键初始化激活规范化层注册退出

单位:整数列表

最终激活str

有关子模型的键cnn

处理图像的子模型。仅当img_names不是none时才使用。

参见"与所有子模型相关的键"了解键初始化激活规范化层注册退出

CNN类型:str

转换维度:int

  • 23之一。是否使用二维或三维卷积。

块体深度:列表

  • 列出每个块的卷积层数作为元素。 请参见此处的插图了解块的构成。

    注意iscnn_type'res',两个卷积层是 根据int使用,例如[1,2,2,2]的a块深度值 结果CNN有18个卷积层,CNN将 如果cnn类型是'simple',则只有9个卷积层。

n初始过滤器int

  • 第一卷积层中应使用多少个滤波器。

初始内核大小int元组

  • 第一卷积层的核大小。

    如果给定和int,并且conv dim2,则内核大小为 (init_kernel_size,init_kernel_size)被使用。如果conv_dim 取而代之的是3,内核大小为(init_kernel_size,init_kernel_size,2) 使用。 如果给定元组,其长度必须等于conv dim

rest内核大小整数或元组

  • 除第一卷积层外所有卷积层的核大小。

    如果给定和int,并且conv dim2,则内核大小为 (init_kernel_size,init_kernel_size)被使用。如果conv_dim 取而代之的是3,内核大小为(init_kernel_size,init_kernel_size,2) 使用。 如果给定元组,其长度必须等于conv dim

基数:int

  • xie等人,2016,即当基数>;1时,将使用分组卷积(使用$1次$卷积没有瓶颈)而不是普通卷积。仅支持二维卷积。

使用挤压和激励

挤压和激励比

globalavgpoolbool

  • 是否在CNN结束时使用全球平均池。

下采样str或none

  • none(不使用下采样),'avgpool'(带有 池大小=2)、'maxpool'(池大小=2)或'spired' (当使用步长和核大小为2的跨步卷积时 以减少采样)。

    当一个维度大于另一个维度的1.5倍时 尺寸,那个(较大的)尺寸将被下采样 减少3倍,而不是2。这可以在中更改 model\u building\u functions.py中获取下采样

用于"下采样"的最小大小int

  • 进行卷积的任何维度的最小值(所以 不包括样品和通道尺寸)必须是如果下采样 就要发生了。这是为了防止下采样太小 图像:

    例如,如果尝试对(none,7,6,4)图像进行2d下采样 当min_size_for_downsampling6时,下采样 通过,结果将是(none,3,3,4)。如果,在 另一方面,用于下采样的最小尺寸是第三维度。 图像张量太小,没有下采样 发生。

有关子模型的键标量网络

处理标量变量的子模型。仅当标量名称不是none时才使用。

参见"与所有子模型相关的键"了解键初始化激活规范化层注册退出

单位:整数列表

  • 列出每个密集层中隐藏单元的数量,如下所示 元素。如果为空,则输入将在不进行任何处理的情况下传递。

连接到str列表

  • 其他哪些子模型应将scalar_net的输出作为 (部分)他们的投入。可以包含'top'和/或 "胶片生成"。原则上也可以是空的,但是你应该 而是通过设置 标量名称
有关子模型的键film-gen

用于调制cnn子模型的特征映射的子模型,称为 电影发生器有关概述,请参见此。仅当scalar_nettrack_net连接到列表包含film_gen(并且使用这些子模型)时才使用。

参见"与所有子模型相关的键"了解键初始化激活规范化层注册退出

使用bool

  • 是否使用胶片生成器。

单位:整数列表

  • 列出每个密集层中隐藏单元的数量,如下所示 元素。
有关子模型的键轨迹网

用于处理轨迹的子模型。仅当使用轨迹时才使用。 使用深度集,请参见Zaheer等人,2017年

参见"与所有子模型相关的键"了解键初始化激活规范化层注册退出

功率因数单位整数列表

  • 列出每个密度层中隐藏单元的数量 作为要素的网络(参见Zaheer等人,2017年)。 如果为空,输入将传递到rho网络。

rho单元整数列表

  • 列出rho每个密集层中隐藏单元的数量 作为要素的网络(参见Zaheer等人,2017年)。 如果为空,则输入将被传递而无需进一步处理。

连接到str列表

  • 其他哪些子模型应接收track\u net的输出 (部分)他们的投入。可以包含'top'和/或 "胶片生成"。原则上也可以是空的,但是你应该 而是通过设置use_tracks来关闭轨迹的使用false
有关子模型的键时间网络

用于处理时间图像的子模型。仅当使用次数真时才使用

参见"与所有子模型相关的键"了解键初始化激活规范化层注册退出

单位:整数列表

  • 列出每个密集层中隐藏单元的数量,如下所示 元素。如果为空,输入将传递到最终激活

使用资源:bool

  • 是否在下面给出的致密层上使用剩余连接 单位

最终激活str或config dict

  • 应用于最后一个致密层或 输入本身,以防单位为空。

    所选激活函数的输出应在范围内 〔0;1〕。 自定义激活 `"pgauss_f"已实现在此处使用。"P"代表 "参数",而"f"表示"翻转"。

最终激活初始化:列表

  • 参数激活函数的初始权重列表 "pgauss""pgauss\u f"。它们包含一个参数,即高斯宽度,因此final_activation_init应该包含一个浮点数,例如final_activation_init可以是[0.5]`。

    如果不想简单地使用 选择激活,而给出配置dict。参见 str或config dict

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的文档。

对于配置dict的更技术的定义:它是 从keras.utils.serialize\u keras\u object(keras\u object)返回 其中keras_object是要创建的类实例。

在大多数情况下,别名的设置使得 相同的类是有效的,例如,如果要使用批处理规范化 在某些子模型中,可以传递任何'batch''batchnormalization''batch\u norm'等,作为'class\u name'

< A/>

指令:指令

要放入日志的目录字典。应包含键'log'(放置所有其他目录的目录)、'fig'(用于保存图形)、'saved_models'(用于保存模型和/或在训练期间模型的重量g)和'lr_finder'(用于存储学习速率查找程序的结果,如果使用的话)。

函数deepcalo.utils.create_directories将返回这样一个字典(并创建它包含的目录)。

保存图:bool

是否保存模型及其子模型的绘图。

详细:bool

详细输出。设置为2可禁用每个历元的进度条。

方法

获取模型

创建由params定义的模型,并将其作为唯一输入。

列车

训练由get_model构造的模型

评估

评估由get_model构建的模型,通常在培训结束时使用验证或测试集。

< A/>

已知问题

  • 使用多GPU模型生成的模型权重不能使用单个GPU加载,请参见https://github.com/keras-team/keras/issues/9562" rel="nofollow">https://github.com/keras-team/keras/issues/9562

< A/>

待办事项

  • 为dropblock实现线性调度,如https://github.com/miguelvr/dropblock/blob/master/dropblock/scheduler.py" rel="nofollow">https://github.com/miguelvr/dropblock/blob/master/dropblock/scheduler.py

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Intellij通过方法中的包查找用法   java中VS代码和打包命名的问题   将java CMS功能集成到具有高度动态内容的网站(Lucene/Mysql/Nosql)的策略   oracle的java类强制转换异常。jdbc。驾驶员OracleConnection   字节码向JVM添加上指令   如何在抽象类中执行java方法?   java是否可以在apache访问日志中排除指定的GET参数?(作者:W7开发环境)   java如何获取已安装音频播放器的列表?   尝试向HS学生展示如何使用Java访问MS数据库   使用正则表达式java对给定行中的特定字符串进行计数   java JOOQ Select查询中的Select计数   方法Java,如何从二维双精度数组中找到特定值?   获取图像URL的java正则表达式   java在切换到新的窗口驱动程序后找不到元素