Use Graph Neural Network in High Energy Physics

高能粒子物理中使用图神经网络 参考图片和文章地址: The next big thing: the use of graph neural networks to discover particles 思考 文章描述的是高能物理研究所费米实验室为了从海量的粒子碰撞图像中筛选有价值的图像,研发了一套图神经网络模型,这套模型部署在LHC实验室中,用来直接处理粒子对撞过程中产生的数据。 传统的数字图像中我们使用的点阵像素结构,每个像素都是由RGB 红绿蓝结合而成,使用传统的卷积神经网络,我们可以很好的去训练模型,使得模型能够分辨出每张图中的特征属性,然而在分子领域,科学家为了能够辨别出某种化学物质是否有毒性,需要使用X射线拍摄该化学物质的分子结构,从而去定位像碳环和羧基这类功能团的物理属性。研究这类X射线的3D图像与我们日常见到的2D图像有很大的区别,化学中我们会碰到很多同分异构体,如果采用2D CNN的思路,我们就很难去知道原子之间连接的结构,如果采用GNNs,它能够在图像中检测像素与像素之间的关系,原子代表节点,原子的相互作用和邻近关系可以通过边来描述,这样我们就能通过GNNs模型快速定位分子结构的特征,而不像CNN采用卷积核在固定的像素区域内扫描整张图片的有效特征,但并不考虑像素与像素之间的连接关系。 费米实验室采用GNNs模型去快速筛选在每一秒之间高能粒子相互碰撞所产生的海量图像,过滤掉无用的图像,从而更快速的验证新粒子存在的证明。 启发 是否能够将GNNs用在医学领域,比如CT检测,Chest-XRay检测,疾病预防,目前看到的医学领域采用的模型大部分是基于CNN的,采用GNNs是否能够做到更精准更可靠的判断,从而辅助医生快速定位病人的疾病情况。

September 25, 2020

What Is Lung Opacity

课题研究 参考文献 What are lung opacities? 本篇文章是Covid-19 Xray 肺部检测的续写,因为在对前期样本数据处理时,需要能够更清楚的知道医学领域是如何处理和分析这些X射线图的,这样我们能够更好的设计自己的深度神经网络架构。 先来看一张我们正常人的肺部X光片,通过图片中的黑白灰来判断肺部是否有病变。 黑色 -> 空气 白色 -> 骨架 灰色 -> 软组织或者液体 可以这么理解透明度,黑色部分就像是图像中alpha通道,这里充满着空气是,骨架会呈现白色相当于这块区域不透明,灰色区域相当于一个透明度,透明度越高,说明黑色占的越多,这里空气也就越多,当灰色慢慢靠近白色时,说明有一定密度的物质积累在这一个区域。 对比有病变症状病人的X光片,可以发现图中的标记处出现了模糊的透明度阴影,说明这里有病症出现。 透明度的变化表明了一点,当肺部被感染时,本来应该有空气的地方,被一些其他物质填充,比如液体,细菌,抗体,这样原本应该是偏黑色的区域的地方,在X光片中会看到模糊的灰色。 通过透明度上的变化,我们可以去判断肺部的病症出现在哪里。 左边是正常肺部,右边是存在肺炎的肺部,可以发现图中标记的区域有明显的毛玻璃模糊状,透明度明显减弱,说明肺部本应该是充满空气的地方被一些其他的物质填充着。 为什么我们可以通过辨别透明度来分析肺部的健康状态,下图可以给我们解开这个谜题。 当我们吸入空气时,连接在我们肺部支气管上的肺泡是用来交换气体的,将二氧化碳排出体外,并输入氧气到血液中。当肺泡出现炎症,肺泡中的细胞就会被细菌或者病毒侵占,原本肺泡中存在着大量的空气,现在肺泡中出现大量的液体和其他物质,从而导致肺泡中存放空气的空间减少,这就是我们能够从X光片中读到的信息,灰色区域会像毛玻璃状态一样占据在肺部那些发生病变的区域。 关于透明度的分类具体可以参看专业书籍Felson’s Principles of Chest Roentgenology 下图为Consolidation和Ground Glass两种病变。 理解了上述内容之后,我们就可以更加仔细地去分析和处理前期的X光片数据,并为后面自动图像分割找到病变区域做准备。

September 4, 2020

Covid19 AI Research

A Review of Automated Diagnosis of COVID-19 Based on Scanning Images 最近一周一直在优化自己结合论文和其他研究资料开发的Covid-Net,用于诊断Covid19的深度学习模型,在2万+的xRay数据集上训练得到的精度低于90%,为了能够达到更高的精度,自己尝试了改进模型和做数据集增强,但是还会有两个极端,要不就是精度达不到标准,要不就出现过拟合,自己的工作站用的显卡是P2000 5G,当模型越来越复杂时,显存明显会不够,于是狠了狠心,卖掉了DJI Inspire 2,用赚来的钱买了一张TITAN RTX 24G,然后继续优化模型,并增加训练的batch_size。 后面自己的目标就是建立能够精准判断肺炎,并且将肺炎的特征区域自动标注和分割出来的深度模型,然后运行在本地Coral TPU设备上,研发肺炎检测的原型设备。在调研过程中发现了一个很好的关于Covid19-AI的收集网站COVID-19 Imaging-based AI Research Collection,作者是一位人工智能领域的科研人员,发表过很多论文,作者的个人网站。

August 31, 2020

Automate Analyse Covid 19 XRay Image by DeepLearning

动画程式代码如下: lung-3D.nb lung3d = AnatomyPlot3D[lung anatomical structure, PlotTheme->"XRay"] gif = {}; Do[ image = ImageResize[ Show[lung3d, ViewPoint -> {3 Cos[x], 3 Sin[x], 0}, ViewAngle -> 20 Degree], {256, 256}]; gif = Append[gif, image], {x, 0, 2 Pi, 0.1}] Export["lung-3D.gif", gif, "AnimationRepetitions" -> Infinity ] image = ImageResize[ Show[lung3d, ViewPoint -> {3 Cos[Pi/2], 3 Sin[Pi/2], 0}, ViewAngle -> 20 Degree], {512, 512}] 训练集收集 covid-chestxray-dataset paultimothymooney/chest-xray-pneumonia muhammedtalo/COVID-19 Labeled Optical Coherence Tomography (OCT) and Chest X-Ray Images for Classification ...

July 13, 2020

TF-MPI-分布式训练

Horovod 之前写过一篇文章讨论如何使用TF2.0自带的分布式训练系统,在树莓派4上建立分布式训练集群。然而这里会有一个缺陷,我们需要在每一个节点上去启动写好的训练程式,等全部启动之后,整个分布式训练才会开始运作,那么能否通过MPI消息传递接口来完成分布式的训练,答案就在Uber开发的Horovod,MPI主要用在超算领域,在树莓上搭建MPI集群,第一个可以用来学习超算上的分布式计算,第二可以在实际中观察TF在ARMv8上进行分布式训练的性能。 回顾 horovod的开发可以从研究这篇论文开始Horovod: fast and easy distributed deep learning in Tensorflow 一般常见的分布式并行处理有两种,一种是数据并行,一种是模型并行,这个在之前的文章中讨论过,数据并行的优势是相对简单的。 数据并行流程: 在每个节点上分发拷贝模型代码并运行 每个节点读取数据集开始训练 根据损失函数计算模型的梯度 合并每个节点所计算得到的梯度值,计算出新的平均梯度 根据计算得到的新梯度,更新每个节点上模型的参数和权重 重复上述过程 早期TF的分布式训练为PS架构,Worker训练模型,将获得的梯度发往parameter server,PS服务将收集到的数据进行均值化处理,开发人员需要在每台节点上启动Worker和PS,然后TF通过服务发现机制接入整个训练集群,这样就会出现两个瓶颈。 当只有一台PS服务时,会出现PS负载过高的情况 当有多台PS和多台Worker时,训练的瓶颈会出现在网络带宽层面 接下来就有了Ring-All-Reduce算法: 每个Worker节点连在一起形成闭环,通过以下算法将所有节点的梯度值的聚合存储在worker节点上: (->代表将数值传递到下一个worker节点,k代表数组号) 在MPI消息接口中,已经实现了AllReduce功能,MPICH MPI_Allreduce,程式中关于梯度的均值计算就只需要一个AllReduce()操作,然后再将得到的新梯度重新传递给每一个Worker。 使用horovod只需要在程式中增加horovod初始化和基于MPI的optimizer更新 论文中关于使用ring-allreduce和之前原版本TF性能利用率对比图: 以下所有分布式训练均可在树莓派4集群上完成。 训练MNIST LeNet代码如下: #!/bin/env python3 # -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ import numpy as np import tensorflow as tf from tensorflow import keras import horovod.tensorflow.keras as hvd hvd.init() // horovod 初始化 mnist = keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 x_train,x_test = np.expand_dims(x_train, axis=3), np.expand_dims(x_test, axis=3) model = keras.models.Sequential([ keras.layers.Conv2D(32, 3, padding='same', activation='relu',input_shape=(28,28,1)), keras.layers.MaxPool2D(2), keras.layers.Conv2D(64, 3, padding='same',activation='relu'), keras.layers.MaxPool2D((2)), keras.layers.Flatten(), keras.layers.Dense(512, activation='relu'), keras.layers.Dense(10, activation='softmax')]) opt = tf.optimizers.Adam(0.001 * hvd.size()) opt = hvd.DistributedOptimizer(opt) // 增加分布式的优化器 model.compile(optimizer=opt,loss='sparse_categorical_crossentropy', metrics=['accuracy']) callbacks = [ hvd.callbacks.BroadcastGlobalVariablesCallback(0), ] if hvd.rank() == 0: callbacks.append(keras.callbacks.ModelCheckpoint('./checkpoint-{epoch}.h5')) model.fit(x_train, y_train,steps_per_epoch=500, callbacks=callbacks, epochs=20, verbose=1 if hvd.rank() == 0 else 0) MPICH 版本 构建镜像 Dockerfile ...

July 9, 2020

Tensorflow Lite对模型的量化

TFlite 组成 Tensorflow Lite interpreter 在部署的硬件上进行推演,硬件可以包括,手机,微控制器,嵌入式设备。 Tensorflow Lite Converter 转换模型,使其容量更小,推理速度更快。 TFlite Converter Tensorflow Converter 可以将模型转化成FlatBuffers格式,FlatBuffers是一款跨平台序列化工具,结构化数据都以二进制形式进行存储,在微控制器上的表现就是节省内存, Python Keras Converter: converter = tf.lite.TFLiteConverter.from_keras_model(model) tflite_model = converter.convert() with tf.io.gfile.GFile('mode1.tflite','wb') as f: f.write(tflite_model) Command line Converter: tflite_convert --saved_model_dir=$modelDir --output_file=mode1.tflite TFlite 模型量化 Quantizing models for CPU model size 量化权重从原先的32bits降到8bits,可以加快推理的时间。 Python: converter.optimizations = [tf.lite.Optimize.DEFAULT] tflite_quantize_model1 = converter.convert() with tf.io.gfile.GFile('mode1-default-quant.tflite','wb') as f: f.write(tflite_quantize_model1) Full integer quantization of weights and activations 将所有计算全部限定在整数集,进一步缩减模型的大小,和加快模型的推演速度。 下图列出了不同的量化方式下对于同一个模型所产生的效率。

July 2, 2020

边缘领域的ML

本文用到的Mathematica notebook源码可以在这里下载 为什么写这篇文章 从目前的市场环境看,有很多大型公司都在提倡人工智能的发展,然而绝大部分我们能看到的AI的应用就是智能小车,自动驾驶,图像识别,行为预测,医疗辅助,智能推荐系统,语音识别,图像与语音生成,在这些应用中,很少会与大规模工业领域有交集,原因就在于机器学习运算的成本。 首先像工业领域的机器学习的推演预测,第一个要保证就是数据安全性和实时性,在介绍Coral Dev Board本地机器学习的文章中,我们可以看到本地机器学习的应用范围,在工业范围内的AI应用中,我们可以看出占比很少,像自动驾驶,医疗辅助可以算是在工业领域的初探,大部分的人工智能应用都是停留在一个概念上,很少出现有能应用在工业领域并且具有商业性质的项目,原因就是在安全性和低成本。 试想你开发了一个ML应用,如果要应用到工业领域,比如检测设备故障,预测机器运行的下一个状态,公司盈利与设备故障率及工人流动情况的关系,在部署这些模型时,我们要考虑在工业方面的苛刻要求,比如这个工厂基本上没有覆盖网络,那么你要去部署检测设备故障模型的这一个环节就会遇到问题,是采用本地集群部署,还是部署一个终端,然后终端的数据由人为来进行录入,在采用集群部署时,因为会有成千上万台机器设备,所以部署的节点也会有很大的成本,像部署模型在一台Jetson Nano的设备上,虽然成本已经很低,但是部署成千上万个Jetson Nano,你就要考虑功耗,考虑nano模块的故障率以及模块更换的成本,还需要考虑模块与模块之间的高可用网络成本。那么能否将模型部署到更低廉的设备上,比如像微控制器的单片机,这样可以降低很多成本,并且功耗很低,对于大型公司采购此方案的成功率就会有很大的提升。 接下来的5-10年,或许就是机器学习在工业领域的兴起,TinyML意指在小型的微控制器上运算和推演模型,它可以运行在像我们平时接触的家电设备的微控制器上,可以运行在很小的集成电路里面和无处不在的小型设备上。 ML在工业领域的展望,比如像电影领域,通过小型穿戴设备进行演员的动作捕捉计算,目前购买一套动作捕捉的设备是相当昂贵的,还有电影中故事板的制作,对于独立电影人来说将是福利,通过运行有生成模型的小型设备,独立电影人可以通过所处的环境,来生成三维结构的环境,然后导入模型人物来进行预演,最后生成一张张故事板,提高了整个独立创作的效率,也让演员能够更好的理解现场的氛围和如何更好的表演。当然要让ML去创作出好听的小提琴音乐,那是相当难的,更不用说拉小提琴🎻,因为有灵魂注入到了琴中😄。 TinyML的工作流程 确定目标 收集数据 针对实际场景设计神经网络架构 训练模型 转换和部署模型 排查运行过程中的错误问题 实例 拟合Sin(x)函数,在给定x的情况下预测出Sin(x)的值 Mathematica 原型设计: data = Table[ x -> Sin[x] + RandomVariate[NormalDistribution[0, .15]] , {x, 0, 2 \[Pi], .001}]; ListPlot[List @@@ data, PlotStyle -> Dashed] data = RandomSample[data]; trainData = Take[data, {1, Floor[0.6*Length[data]]}]; validationData = Take[data, {Floor[0.6*Length[data]] + 1, Floor[0.8*Length[data]]}]; testData = Take[data, {Floor[0.8*Length[data]] + 1, Length[data]}]; Total[Length /@ {trainData, validationData, testData}] - Length[data] Length /@ {trainData, validationData, testData} 模型1: ...

June 16, 2020

DeepMind UCL 深度学习在线课程6总结

June 13, 2020

DeepMind UCL 深度学习在线课程3总结

June 9, 2020