前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >交叉新趋势|采用神经网络与深度学习来预报降水、温度等案例(附代码/数据/文献)

交叉新趋势|采用神经网络与深度学习来预报降水、温度等案例(附代码/数据/文献)

作者头像
MeteoAI
发布2019-07-30 15:30:14
7.9K7
发布2019-07-30 15:30:14
举报
文章被收录于专栏:MeteoAIMeteoAI

阅读建议

随着人工智能的发展,拥有了越来越丰富的应用场景,气象行业也不例外,在突破传统预报方法的情况下,神经网络与深度学习来预报气象要素也取得了不错的效果,下面就给出一些比较典型的开源案例,条件允许不妨按图索骥实践一下,代码、数据、文献都给各位客官老爷一一奉上,也欢迎大家在圈内转载和分享!

内容目录

  • ConvLSTM 和 TrajGRU降水预测
  • “基于雷达图像预测未来降水”模型
  • "MOS-X"机器学习来做模式输出统计
  • 进行中比赛·台风图像时间序列预测
  • 推荐学习资料以及参考链接

前言介绍

本文所有的案例都是整理于互联网中,本文会提供相应的开源代码链接、数据集、相关论文。部分数据集可能需要申请才能获取。另外,就新旧方法的效果好坏也不是立马就能高下立判,但是无论是科研需求还是业务实践中去突破传统思维,用好新方法来解决旧问题都是非常值得一试的。其实,也无需先入为主地认为新方法效果就一定好,而传统方案就是一定是更差的,关键还在于应用技巧及方法的适用性。

典型案例

1.雷达回波外推和施行健的两篇降水预测文章介绍

施行健,中国香港科技大学四年级博士,师从杨瓞仁教授。现于Amazon AWS Deep Learning组实习,岗位为应用科学家。他的主要研究方向为深度学习,时空序列分析和计算机视觉。他是apache/mxnet的开发成员,同时是DMLC协会会员。

雷达回波外推是一个还算处女的方向,本质上来说这就是一个视频序列预测视频序列的问题,比如这里的使用已知的 5 帧预测未来的 20 帧雷达回波序列(通常每6分钟采集一次)。所以这个问题是可以使用现有的一些处理视频的方法来解决的,例如 RNN 和 Conv3D 等能处理时空信息的结构。

目前这个领域中文的一些资料很少有人介绍和总结。在这里Hzzone会介绍雷达回波外推这个问题、HKO-7数据集以及施行健的两篇 nips 文章,分别是 ConvLSTM 和 TrajGRU。

Hzzone用 pytorch 实现了这两篇文章,并在 HKO-7数据集上取得了和施行健近似的结果。原始代码在HKO-7,使用 mxnet 实现,其中有 ConvGRU和TrajGRU,没有ConvLSTM。作者的代码实现了整个数据加载、训练和测试流程,封装的也非常好,Hzzone在实现时也使用了一部分施行健的代码,Hzzone认为自己的实现要更容易理解一些。代码挂在了 Github(链接 https://github.com/Hzzone/Precipitation-Nowcasting)。如果你觉得代码对你有一定帮助,欢迎点赞这篇文章或 star 这个 repo。

在开始之前,可以通过 Machine Learning for Spatiotemporal Sequence Forecasting and Its Application to Nowcasting(https://www.hko.gov.hk/research_forum/RF2018_dyyeung.pdf) 和 中国香港科技大学施行健:深度学习用于短临降雨预报的一个基准和一个新模型 | 分享总结 (https://www.leiphone.com/news/201712/GnlC56qEtbrIqmI2.html)对雷达回波外推问题有一个比较清晰的认识。

数据集

HKO-7 Dataset 雷达回波数据主要是通过天气雷达往四周发射电磁波并通过云层的反射得到,国内用的大多是多普勒雷达,下面是雷达的扫描示意图,天气雷达的覆盖区域是一个圆形区域:

因为是通过反射得到的,所以雷达一般部署在空旷地区。如果四周出现了如建筑物、灰尘等物体,会在雷达回波中出现明显的噪声,使模型难以收敛。

现在能找到的开源数据集主要有三个,其中两个来自于天池比赛,分别是 Tianchi CIKM AnalytiCup 2017(https://tianchi.aliyun.com/dataset/dataDetail?dataId=1085&userId=1)和 Tianchi IEEE ICDM 2018 全球气象AI挑战赛(https://tianchi.aliyun.com/competition/entrance/231662/information)。这两个比赛最终目的不相同,但是数据集的含义是一样的,降水量等价于雷达反射的 dBZ。这两个比赛一些分享的经验,有一定参考意义,最主要的是 Tianchi IEEE ICDM 2018 全球气象AI挑战赛 这个比赛的主题才是雷达回波外推,但是没有找到开源的比较好的解决方案。此处提供最佳方案链接代码暂未公开:https://tianchi.aliyun.com/forum/postDetail?postId=38113(第一名:CUHKSZ_Group );少量开源代码:1.https://github.com/hyifan/Weather;2.https://github.com/chencodeX/Global-AI-Challenge-on-Meteorology

最后,则是 HKO-7 Dataset,这个数据集是施行健在 Deep Learning for Precipitation Nowcasting: A Benchmark and A New Model 针对雷达回波外推这个领域没有统一的 benchmark 而提出的一个数据集,来源于中国香港天文台。因为不开放所以需要申请,填张表就 OK,学生的话要找导师去申请,然后用工作邮箱发过去。

这个数据集覆盖了中国香港周边的雷达回波数据,图片大小是480*480 的灰度图,涵盖了 2009 到 2015 的 下雨天 的数据,812 天用于训练、50 天用于验证、131 天用于测试。更详细信息可以去阅读论文。

首先数据集的转换关系是这样的:dBZ 是雷达的基本反射率(雷达扫出来的结果),然后通过

并裁剪到[0,255]之间转换成普通的 png 图片。这种转换对于最后的训练和测试没有多大的影响,只是个线性转换,在深度学习中这个范围才是更常见也更容易解决问题的。

最后,还有一种转换关系则是通过 Z-R 关系在 dBZ 和降水值 R(单位是 mm/h)之间转换:

通过线性回归计算。

统计了全部数据集的降水值分布:

由于降水值分布不均匀,并且大雨对现实生活的影响更大,所以 使用了一个加权损失函数 进行训练(这篇文章采用的是 MSE 和 MAE 之和)。

在数据预处理上,除了以上介绍的,由于原始雷达回波数据还存在大量噪声,作者采用马氏距离去除噪声点,得到一个 mask 之后,只有正常数据才会参与训练和评估。因此整个数据集分成了原始 png 和对应的 mask 两个部分。

具体过程是:计算每一张图片的均值

和 协方差矩阵

,然后计算出马氏距离:

去除掉马氏距离大于

和像素值在 [0,71]之间的数据,最后得到一个掩膜就是正常的数据。第一步是为了去除一些离散点,因为存在噪声;第二步则是去除雷达监测范围以外的区域,因为雷达扫描区域是一个圆形的。最后的效果则是:

作者采用的是用 5 帧预测未来的 20 帧。在训练的时候计算量非常大,我在实现过程中一颗 1070 的 batch_size 只能为 2,迭代 100000 次需要三天。由于这个数据量是完全足够的,所以不需要什么数据扩充,只做了一个归一化到 1 以内。

我采用的是作者实现的数据加载的代码,训练时从数据集随机抽取连续的 25 帧(已知 5 帧,预测 20 帧),而评估时则是按 5 的窗口进行滑动,直到结束。这种方式在实际用的时候最好还是上多显卡进行训练,并且加载数据时采用 prefetcher 提前加载数据集,否则在训练的时候大部分时间都会用在数据加载上,浪费很多时间。关于如何加速训练可以参考 如何给你PyTorch里的Dataloader打鸡血(https://zhuanlan.zhihu.com/p/66145913)。

雷达回波外推的评价标准主要使用 HSS、CSI、POD 等指标,参考 评价标准,这几个指标和机器学习中的 precision 和 recall 类似,越高越好。其他的还有 MSE、MAE,施行健采用的 B-MSE 和 B-MAE 其实就是加权的 MSE、MAE,这两个指标越低越好。

ConvLSTM

ConvLSTM 来源于 Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting。

传统的 FC-LSTM 将数据展开成一维进行预测,雷达回波数据存在大量冗余信息,FC-LSTM 无法处理,而且 FC-LSTM 只能提取时间序列信息,无法提取空间信息。

ConvLSTM 使用卷积替换 FC-LSTM,利用卷积操作提取空间信息,FC-LSTM 和 ConvLSTM 的区别主要在输入, 候选态,隐藏态和三个门都是三维张量,其中最后两个维度是 spatial 空间维度。如下图:

对比两个结构的公式,LSTM 的公式:

ConvLSTM 的公式:

*是卷积操作,º是哈达玛乘积。因此 FC-LSTM 与 ConvLSTM 的主要差别在于将矩阵乘法替换成了卷积操作,即 input-to-state 和 state-to-state 的转换中使用的是卷积而不是全连接。

If we view the states as the hidden representations of moving objects, a ConvLSTM with a larger transitional kernel should be able to capture faster motions while one with a smaller kernel can capture slower motions. Also, if we adopt a similar view as [16], the inputs, cell outputs and hidden states of the traditional FC-LSTM represented by (2) may also be seen as 3D tensors with the last two dimensions being 1. In this sense, FC-LSTM is actually a special case of ConvLSTM with all features standing on a single cell.

通过使用一个大的状态转换卷积核捕捉快速的运动,而小的卷积核捕捉慢的运动;当最后两个维度为 1 时,FC-LSTM 也可以视为一个特殊的 ConvLSTM,每一个单元格代表一个特征。Pytorch 实现可以参考 ConvLSTM,我合并了八次卷积操作,所以整个计算量和普通的卷积差不多,偏置项影响不大。

TrajGRU

TrajGRU(Trajectory GRU) 来自于施行健的第二篇文章 Deep Learning for Precipitation Nowcasting: A Benchmark and A New Model ,在这篇文章中,作者提出了一个新的 Benchmark 也就是上面介绍的数据集,对比了 ConvGRU、不使用/使用加权损失函数训练、Conv2d、Conv3d 等几种方法,构建了一个 Encoder-Forecaster 模型。ConvGRU 类似于上面介绍的 ConvLSTM,只是将 LSTM 替换成了 GRU。

而 TrajGRU 使用 GRU 结构,区别是首先使用了一个 的卷积层对隐藏态进行卷积提取光流,然后使用 的卷积层对光流进行卷积,建立一个动态的对应关系。

按照作者的说法,普通卷积网络的对应关系不变,对于 local-invariant 的操作比较合适,而 local-variant 的操作比如旋转普通卷积是不够的。相比普通卷积固定的领域集,TrajGRU 可以有 个变化的领域集,并且参数要少于原来的普通卷积。我的想法是云层的运动与消散是动态的,一团云在某一帧的位置对应到下一帧的位置不一样,所以需要建立一个动态的链接。

TrajGRU 的公式如下,首先使用一个子网络提取光流

,然后使用 wrap 函数变换,有 个链接。

wrap 函数的 mxnet 可以参考 traj_rnn.py#L14,pytorch 没有该函数,可以参考我的实现 trajGRU.py#L9。

Encoder-Forecaster

这两篇文章都采用了一个 Encoder-Forecaster 模型,和普通的 Encoder-Decoder 模型还是不一样的。Encoder-Forecaster 分成两部分,分别是 Encoder(编码器),Forecaster(预测器),分别对应了 Encoder 和 Decoder。

模型展开之后示意图如下:

这是一个输入 2 帧,预测未来 2 帧的 RNN 展开后的结构图。Encoder-Forecaster 模型对应层次的 RNN 的 隐藏态 输入到下一层次之中,提取不同层次的时空信息。Downsample 和 Unsample 分别通过 Convolution 和 Deconvolution 实现。这里的 RNN 可以采用 ConvGRU、ConvLSTM 和 TrajGRU 等能提取时空信息的结构。

Encoder 的初始隐藏态和 Forecaster 的初始输入为 0,因为这两个没有输入。最后的输出则通过一个 的卷积层进行回归。

Deep Learning for Precipitation Nowcasting: A Benchmark and A New Model 的网络结构可以参考下图:

通过实验发现,TrajGRU 取得了比 ConvGRU、Conv3d、光流法等方法更好的结果;所有深度学习方法都取得了比其他方法更好地结构;文中的 Baseline 是直接使用最后一帧的作为未来所有帧的预测结果。

在训练时作者采用了一个 50 的梯度阶段,防止梯度爆炸。还有一些更具体的参数,比如网络结构,学习率等可以参考我的实现 experiments/net_params.py。

总结

我实现了 ConvLSTM 和 TrajGRU,取得了和作者接近的结果,有个疑问则是 ConvLSTM 取得了要比 TrajGRU 的更好地结果,而且因为合并了八个卷积所以运行速度也快得多。更具体的说明可以参考 关于 TrajGRU 的意义。

运行效果图如下

虽然结果可能不错,在实际预测时还是发现了越往后的输出越暗,即越往后误差越大,参考 回复。如果更进一步改进,可以考虑对这一方面、运行速度的比较等进行论述。

已授权参考《雷达回波外推和施行健的两篇降水预测文章介绍》文章链接:https://hzzone.io/

2.“基于雷达图像预测未来降水”模型

《基于雷达图像的短期降水预报》是由ACM顶级数据挖掘会议CIKM举办的数据科学竞赛。CIKM 2017以“智慧城市,智慧型国家”为主题,通过人工智能同各学科领域的交叉研究,通过技术手段有效管理城市。本次 CIKM AnalytiCup 2017 由深圳气象局与阿里巴巴联合承办,旨在提升基于雷达回波外推数据的短期降水预报的准确性。比赛共吸引了来自全球1395个团队,来自清华大学的Marmot团队(姚易辰,李中杰)在比赛中脱颖而出,在复赛中以绝对优势排名第一。本文摘录了他们团队解题方案的核心思路予以展示。

比赛官网:

阿里天池大数据平台 https://link.jianshu.com/?t=https://tianchi.aliyun.com/competition/introduction.htm?spm=5176.100066.0.0.773ef42f8FXDoN&raceId=231596

完整解题方案及代码:

https://github.com/yaoyichen/CIKM-Cup-2017

赛题目标

赛题提供10,000组的雷达图像样本。每组样本包含60幅图像,为过去90分钟内(间隔6 min,共15帧),分布在4个高度(0.5km, 1.5km, 2.5km, 3.5km)上的雷达反射率图像。

每张雷达图像大小为[101,101],对应的空间覆盖范围为101×101km。每个网格点记录的是雷达反射率因子值Z。反射率因子,表征气象目标对雷达波后向散射能力的强弱,散射强度一定程度上反映了气象目标内部降水粒子的尺度和数密度,进而推测其与降水量之间的联系。

目标

利用各个雷达站点在不同高度上的雷达历史图像序列,预测图像中心位于[50,50]坐标位置的目标站点未来1-2小时之间的地面总降水量,损失函数为降水量预测值与真实值的均方误差。

算法架构

本次比赛的特点在于时空序列的预测,即给出了目标站点周围一定空间范围的历史信息,需要预测在站点坐标上未来的降水走势,因而搭建时空之间的关联特性为解决问题的重中之重。同时有别于一般的计算机视觉问题,此次比赛提供的气象图像,其沿着时空方向的演化规律会满足一定的守恒律及连续性限制,发现物理问题的特殊性并寻找对应的表征量也是解决问题的关键。解决方案的流程分为前处理,特征提取,模型训练三个部分。前处理步骤中,完成局部图像的拼接,并通过SIFT描述子寻找时间方向的对应关系,获得云团运动的轨迹。特征描述中,将问题的特征归纳为3部分,分别为时间空间方向的矢量描述,云团形状的统计描述,及由云团轨迹外推得到目标站点的雷达反射率的空间图像描述。模型训练主模型采用了卷积神经网络CNN,图像部分采用2层卷积池化,随后将向量拉平到一维,即在全连接层与其余非图像类特征合并,共同输入到2个隐藏层的神经网络中。

图像拼接

赛题给出的局部雷达图像,样本与样本之间并不完全独立,图像样本之间存在一定的重叠,可以通过模板匹配的方式寻找样本之间的坐标关联特性。通过样本之间的局部图像拼接,能够将一系列小范围的局部雷达图像恢复到空间更大范围的雷达图像,进而获得关于云团更加整体的特性。通过局部图像的拼接,能够获得如下两方面效果:

为目标站点的时空轨迹追踪提供更大的空间延伸量。目标站点附近更大的空间图像范围,能够对应更长的时间外推量

获得云团整体的结构,方便从更为宏观的视角提取特征描述云团形态

图像拼接后瞬时流场图中,能看到显著的对流特性。即在空间某个固定坐标点上,由湍流脉动引起的反射率改变量要远小于大气对流运动产生的反射率变化量。我们也会着重利用这一特性,利用SIFT算子在时间方向的匹配,寻找每个空间点上对流速度矢量。

轨迹追踪

根据流体力学中的泰勒冻结假设(Taylor Frozen Hypothesis),认为流场中存在显著的时空关联特性。其认为雷达反射图,云团在短时间内趋向于在空间以当地平均对流速度平移,短时间内并不会发生外形或者反射强度的剧烈改变。即监测点x 处在未来τ 时刻后的雷达信号f,能够通过平均对流速度U,从当前时刻t 位于坐标的x-Uτ 的信号中体现:

为了寻找每个空间坐标对应的对流速度U, 可以通过SIFT描述子在一定时间间隔内,在空间坐标上的匹配,寻找相同关键点在较短时间间隔δt 内像素的平移量δx,即得到空间每个位置处的对流速度。

下图给出了相邻两帧图像上,SIFT描述子及相应的空间匹配关系。其中圆圈大小对应了关键点的特征尺度,圆圈中的刻度方向表征其主方向。两帧图像的匹配连线基本平行,即全场以一个近似相同的速度作对流运动。

特征提取

特征包含时间外插反射率图像,时间空间的矢量,云团形状的统计描述三部分。

时间外插反射率图像:由上述的图像拼接及轨迹追踪后,已经能够定位出全场的速度矢量见下图。以泰勒冻结假设和关键点匹配追踪到未来1.5个小时流场速度矢量后,能够外插未来每个坐标点的运动轨迹,即能够推测出未来位于目标站点上方的云团,在当前时刻雷达图像上的空间坐标。图中白色圆圈坐标点的云团,会在1.5小时由图中对流矢量的作用下,运动到红色目标站点上方。因此截取空间轨迹上白点周围41×41大小,3个空间高度(1.5km,2.5km,3.5km)的局部图像作为卷积神经网络的图像输入。

时间和空间特征提取

在时间和空间方向(高度方向)提取图像像素的统计值(平均值、最大值、极值点个数、方差等等),作为时空特征的描述输入CNN的全连接层。

全局云团形状特征提取

某些特定的云层形态会对应典型降水事件。从拼接后的全局图像中提取云团形状的整体形态特征,有雷达反射率的直方图和统计类信息、云团运动速度和方向、加速度、流线曲率、SIFT描述子的直方图、监测点位置、检测点反射率与最大值比值等。

训练模型

卷积层的图像的输入为时间外推得到目标站点附近41×41的空间范围,采用较大的空间图像输入,希望能够包含轨迹预测的误差以及测评目标在1小时内的总降水量。图像部分采用2层卷积池化,随后将向量拉平到一维,即在全连接层与其余非图像类特征合并,共同输入到2个隐藏层的神经网络中。模型通过dropout防止过拟合,取值为0.65,梯度下降采用的Adam优化算法。1200个迭代步后即达到稳定。

总结

虽然之前参加过多次大数据竞赛,但初次接触图像类比赛能够获奖也是非常意外。本次解题方案并未使用Imagenet上较为流行的InceptionNet或者ResNet,用深度的图像卷积网络来做训练。而是针对气象问题的特殊性,针对时间空间间关联这一重要线索,采用传统的关键点提取SIFT方法与卷积神经网络CNN结合的形式预测目标站点的降水量。

由于思路的特殊性,团队在未做调参的情况下已经能够大幅领先其他队伍。未来会对气象业务有更多探讨,用大数据力量推动气象预报的发展。感谢天池大数据平台组织比赛,感谢深圳气象局提供比赛数据,感谢CIKM2017组委会。完整解题方案及代码:https://github.com/yaoyichen/CIKM-Cup-2017 深圳市气象局和阿里巴巴集团保留本次比赛数据的版权。数据仅用于比赛和研究目的。所有数据由深圳气象局提供,并已全部做过脱敏处理。

参考链接:https://www.jianshu.com/p/8d2da83a22bc

3.MOS-X·Machine learning forecast model for WxChallenge

在气象预报领域,MOS预报,也就是模式输出统计预报,是一种动力统计预报天气的方法。而MOS-X,就是用机器学习来做模式输出统计。

每当WXchallenge宣布一个新预报地点,韦恩就用该城市过去6-7年的天气预报和实况数据来训练MOS-X,将历史预报与实际天气进行比较,来了解不同情况下的模式偏差,并对其订正。针对今年美国“最难预报城市”——科罗拉多州普韦布洛市的天气,MOS-X提供了最好的预报。

而且,据竞赛官网上公布的历届个人冠军和成绩列表显示,韦恩-3.817的得分不仅是本届最高分,而且还打破了赛会纪录——三年前的最高分-4.058。目前,冠军的Python代码已经在开源平台GITHUB上全部公开。

这也是该竞赛历史上计算机工具首次击败所有人类预测者。不过,由于WXchallenge规定,只有人类选手能参赛,MOS-X只好“借壳上市”。作为开发者的韦恩,替MOS-X领了一个特殊类别的奖杯。

JONATHAN WEYN个人主页:https://atmos.washington.edu/~jweyn/

MOS-X的代码托管在GitHub上:https://github.com/jweyn/MOS-X

参考论文

Weyn, J. A., Durran, D. R., & Caruana, R. (2019). Using deep learning to predict gridded 500-hPa geopotential height from historical weather data. JAMES, accepted.

Weyn, J. A., & Durran, D. R. (2018). The scale dependence of initial-condition sensitivities in simulations of convective systems over the Southeastern US. Quarterly Journal of the Royal Meteorological Society.

Weyn, J. A., & Durran, D. R. (2018). Ensemble spread grows more rapidly in higher-resolution simulations of deep convection. Journal of the Atmospheric Sciences, 75(10), 3331-3345.

参考链接:http://www.cma.gov.cn/kppd/kppdqxwq/kppdqwys/201905/t20190509_524094.html

推荐学习资料

《神经网络与深度学习》,附代码、书籍PDF https://nndl.github.io/ GitHub深度学习最全资料集锦:Awesome Deep Learning, https://github.com/ChristosChristofidis/awesome-deep-learning 《Deep Learning》 by Yoshua Bengio, Ian Goodfellow and Aaron Courville (05/07/2015) 最为大家所熟知的是Bengio等人所著,又称深度学习圣经或花书。 《动手学深度学习》这是一本面向在校学生、工程师和研究人员的交互式深度学习书籍。

  • 在线书地址:https://zh.diveintodeeplearning.org/index.html
  • GitHub 项目:https://github.com/diveintodeeplearning/d2l-zh

参考

1.https://hzzone.io/

2.https://nndl.github.io/

3.https://github.com/jweyn/MOS-X

4.https://github.com/sxjscience/HKO-7

5.https://yq.aliyun.com/articles/224039

6.https://zhuanlan.zhihu.com/p/69316384

7.https://www.jianshu.com/p/8d2da83a22bc

8.https://www.leiphone.com/news/201712/GnlC56qEtbrIqmI2.html

9.https://tianchi.aliyun.com/dataset/dataDetail?dataId=1085

10.https://tianchi.aliyun.com/competition/entrance/231662/information 11.https://tianchi.aliyun.com/competition/entrance/231729/introduction

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MeteoAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言介绍
  • 典型案例
  • 1.雷达回波外推和施行健的两篇降水预测文章介绍
  • 2.“基于雷达图像预测未来降水”模型
  • 3.MOS-X·Machine learning forecast model for WxChallenge
  • 推荐学习资料
  • 参考
相关产品与服务
代码托管
CODING 代码托管(CODING Code Repositories,CODING-CR)是为开发者打造的云端便捷代码管理工具,旨在为更多的开发者带去便捷、高效的开发体验,全面支持 Git/SVN 代码托管,包括代码评审、分支管理、超大仓库等功能。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档