PointNet学习笔记(一)—— 论文

2023-10-29

PointNet学习笔记(一)—— 论文

本文记录了博主在学习《PointNet: Deep Learning on Point Sets for 3D Clasification and Segmentation》过程中的总结笔记。更新于2019.4.9。

Introduction

网络输入:点云输据(point clouds);
网络输出:将输入视作一个整体的标签,或输入内每个分割部分(segment/part)的标签。

每个点的基本描述是其坐标 ( x , y , z ) (x,y,z) (x,y,z),当然也可以加上均值及其他局部或全局特征。

网络的前一部分学习的是提取兴趣点或信息点,并将选择它们的原因形成编码;后面的全连接层则用于整合这些信息,实现分类或分割。

另外,由于网络的输入是点云数据(每个点之间是独立的),因此可以尝试用一个空间转换器(spatial transformer network)规范化数据。

论文中证明了所提网络可以模拟任何连续函数。通过实验发现,网络会用一组稀疏的关键点总结描述输入点云,可视化后发现,这些点恰巧也是目标图形的骨架(skeleton)。

此外,论文中也从插点(outliers)和删点(missing data)的角度证明了为何网络对于输入的小扰动鲁棒。

网络对于形状分类、部分分割、场景分割等任务(数据库下)都有较好的表现。

问题描述

{ P i ∣ i = 1 , ⋅ ⋅ ⋅ , n } \{P_i\vert i=1,\cdot\cdot\cdot,n\} {Pii=1,,n}描述一个3D点云,其中每一个点 P i P_i Pi都是一个向量。在本文中,除非特殊描述,其通道只包括位置信息 ( x , y , z ) (x,y,z) (x,y,z)

对于分类问题,网络输出对应 k k k个类别的 k k k个概率;对于分割问题,网络则输出所有 n n n个点对于所有 m m m个语义类别的的概率,即输出尺寸为 n × m n\times m n×m

Deep Learning on Point Sets

网络结构的提出是受到了 R n \mathbb R^n Rn内点云的性质的启发,因此第一部分介绍性质,第二部分介绍网络结构。

点云数据的性质

网络的输入是欧氏空间下的一个点的子集,因此具有下面三个主要性质:

  • 无序性(Unordered):与像素点阵或三维点阵下排布的网格状数据不同,此时的点云是无序的。因此要求一个以 N N N个3D点为输入的网络需要对数据的 N ! N! N!排布具有不变性(invariant to N ! N! N! permutations of the input set in data feeding order)。
  • 点之间有关系(interaction among points):由于这些点是空间中一个有意义的子集里面按照某种距离矩阵生成的,这就要求网络要有能力识别这些相邻点之间的局部结构和这些结构的组合。
  • 平移不变性(invariance under transformations):习得的点云描述应当对于某些变换鲁棒,比如在点云整体平移和旋转等变换下,网络对于点云的分割和分类结果不应当改变。

PointNet网络结构

下图是网络的整体结构(分割和分类网络共享大部分网络),包括用于整合所有点信息的对称函数max pooling、一个局部和全局信息整合结构,和两个连结结构用于连结输入点和点特征。

2

Symmetry Function for Unordered Input

目前存在三种方法保证模型对于输入不同排序具有不变性:

  1. 将输入归类为一个规范化的顺序(canonical order);
  2. 在训练RNN时将数据视为一个序列,但对训练数据以所有可能的排序进行扩张;
  3. 应用一个简单的对称函数整合每个点的信息:此时,对称函数以 n n n个向量为输入,输出一个对于输入顺序具有不变性的新向量(例如+和*操作都属于二值对称函数symmetric binary function)。

尽管第一种方法看起来很简单,但实际上不难证明是无法找到一种高维下的排序使得其对于扰动鲁棒的。这种方法比直接用无序输入会稍微好一点,但表现还是很差。此外,对于第二种方法,尽管其对于小长度(几十)的序列具有鲁棒性,但对于上千个点(点云的通常大小)就无法得到相同的表现了。文中的实验证明了PointNet所使用的方法更好。

文中希望通过对变换后的元素应用对称函数,从而估计得到一个定义在点集上的一般函数(general function):
f ( { x 1 , ⋅ ⋅ ⋅ , x n } ) ≈ g ( h ( x 1 ) , ⋅ ⋅ ⋅ , h ( x n ) ) (1) f(\{x_1,\cdot\cdot\cdot,x_n\}) \approx g(h(x_1),\cdot\cdot\cdot,h(x_n)) \tag{1} f({x1,,xn})g(h(x1),,h(xn))(1)
其中, f : x R N → R f:x^{\mathbb R^N} \to \mathbb R f:xRNR h : R N → R K h: \mathbb R^N \to \mathbb R^K h:RNRK,对称函数 g : R K × ⋅ ⋅ ⋅ × R K ⏟ n → R g:\underbrace {\mathbb R^K \times \cdot \cdot\cdot\times \mathbb R^K}_n\to \mathbb R g:n RK××RKR

文章通过实验确定的基本模型用多层感知机(multi-layer perceptron)习得 h h h,用一个单变量函数(single variable function)和max pooling函数习得 g g g。通过不同的 h h h,可以习得表征不同属性的多个 f f f

博主注

  1. 所谓多个 f f f:这里的理解就像当一组点具有某种不同属性时,其组成的整体也可以根据这些属性得到可能的属性。如大部分的点都是黑的,那么整体的颜色属性就是黑色;再如点与点之间存在某种位置关系,那么整体就是球形;以此类推……。而这里的 f f f就代表了不同考量下得到的属性结论,而 g g g要近似的也是这种结论,只不过 g g g并非直接考量输入的各个点,而是这些点经过 h h h处理后的体现。这就使得不同的 h h h处理出来经过相同的考量,也会对应不同的属性结论,即不同的 f f f
  2. 为什么可以有这个近似:因为如果直接以原始点为输入,那么对于点的排序就有要求。而通过之前的分析,是很难找到一种方法使得结果不受顺序的影响。而这里用于近似的函数 g g g是一个对称函数,也就是其不考虑输入的顺序,只要保证需要的输入都进来了,就可以了。然而,在原始特征空间下,这种不考虑顺序的行为是无法实现的,因此需要一种映射,将原始数据映射到一个新的空间,使得在该空间下,数据的顺序(相互之间的关系)已经以某种形式表征出来,从而使得接下来的操作不需要考虑顺序。

局部和全局信息整合(Local and Global Information Aggregation)

上面一步的输出是一个表征了全局特征的向量 [ f 1 , ⋅ ⋅ ⋅ , f K ] [f_1,\cdot\cdot\cdot,f_K] [f1,,fK]。对于分类问题,可以直接训练一个SVM或多层感知机分类器,用于在给定全局特征向量的基础上判断类别(比如黑色、球体等等得到“眼睛”);但是对于点的分割问题,就需要统筹考虑全局和局部特征了。文章的做法是将获得的全局特征级联在每个点的局部特征后面(如上图中分割部分所示),在此基础上再学习得到新的点局部特征,此时的每个点的特征就既包含局部特征(局部几何信息)又包含全局特征(全局语义)了。

Joint Alignment network

一个点云的语义标签应当对于部分变换(如刚体变换rigid transformation)具有不变性。因此,应当要求习得的点云描述也对于这些变换具有不变性。

一个比较典型的做法是在提取特征之前将所有输入集合整合到一个标准化空间(canonical space)内。与之前存在的工作(原文参考文献9)不同,文章中的做法不需要发明任何新的层,也不需要引入任何别名(alias)。论文中应用了一个迷你网络T-Net学习一个仿射变换,并将其直接应用到原始点云坐标系。

T-Net是作为整个网络的一部分存在的,其中包括点独立特征提取(point independent feature extraction)、max pooling、和全连接层。关于T-Net的详细信息可以看支撑材料的学习。

同样的思想也可以用于特征空间,即用于整合不同点云得到的特征。然而,由于特征空间下的变换矩阵维度要远远高于原始空间,为了降低最优化的难度,文章作者在softmax训练损失的基础上加了一个正则项:
L r e g = ∥ I − A A T ∥ F 2 L_{reg}=\Vert I-AA^T\Vert _F^2 Lreg=IAATF2
其中 A A A是迷你网络习得的特征整合矩阵。该正则项要求学习得到的矩阵是正交矩阵,因为正交变换不会丢失输入的信息。

理论分析

1. 万能近似(Universal approximation)

博主注:虽然神经网络的主要运算层进行的都是线性运算,但我们无需为了期望的到的非线性函数单独设计需要的模型。万能近似定理(Universal approximation theorem)(Hornik et al., 1989;Cybenko, 1989) 表明,一个前馈神经网络如果具有线性输出层和至少一层具有任何一种‘‘挤压’’ 性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel 可测函数。
万能近似定理意味着无论我们试图学习什么函数,我们知道一个大的MLP 一定能够表示这个函数。然而,我们不能保证训练算法能够学得这个函数。即使MLP能够表示该函数,学习也可能因两个不同的原因而失败。

  • 用于训练的优化算法可能找不到用于期望函数的参数值。
  • 训练算法可能由于过拟合而选择了错误的函数。

根据‘‘没有免费的午餐’’ 定理,说明了没有普遍优越的机器学习算法。前馈网络提供了表示函数的万能系统,在这种意义上,给定一个函数,存在一个前馈网络能够近似该函数。但不存在万能的过程既能够验证训练集上的特殊样本,又能够选择一个函数来扩展到训练集上没有的点。
总之,具有单层的前馈网络足以表示任何函数,但是网络层可能大得不可实现,并且可能无法正确地学习和泛化。在很多情况下,使用更深的模型能够减少表示期望函数所需的单元的数量,并且可以减少泛化误差。

这里文章作者证明了网络拟合任意连续函数的万能近似能力。直观上,由于集合函数(set function)的连续性,一个输入点集中的小扰动不太可能极大地改变函数的数值(如分类或分割score)。正式分析: X = { S : S ⊆ [ 0 , 1 ] m and ∣ S ∣ = n } \mathcal X=\{S:S \subseteq [0,1]^m \text{and}\vert S\vert=n\} X={S:S[0,1]mandS=n} f : X → R f:\mathcal X \to \mathbb R f:XR是一个 X \mathcal X X上对Hausdroff距离 d H ( ⋅ , ⋅ ) d_H(\cdot,\cdot) dH(,)连续的集合函数,即 ∀ ϵ > 0 \forall\epsilon\gt 0 ϵ>0 ∃ δ > 0 \exists\delta\gt 0 δ>0使得对于任意 S , S ′ ∈ X S,S'\in \mathcal X SSX,若 d H ( S , S ′ ) < δ d_H(S,S')\lt\delta dH(S,S)<δ,都有 ∣ f ( S ) − f ( S ′ ) ∣ < ϵ \vert f(S) - f(S') \vert \lt \epsilon f(S)f(S)<ϵ。下面的理论证明,只要max pooling层输入的神经元个数足够多(也就是公式(1)中的 K K K足够大),PointNet神经网络就可以随机近似任意 f f f

Theorem 1. 假设 f : X → R f:\mathcal X \to \mathbb R f:XR是一个对于Hausdorff距离 d H ( ⋅ , ⋅ ) d_H(\cdot,\cdot) dH(,)连续的集合函数。 ∀ ϵ > 0 \forall\epsilon\gt 0 ϵ>0 ∃ \exists 一个连续函数 h h h和一个对称函数 g ( x 1 , ⋅ ⋅ ⋅ , x n ) = γ ∘ M A X g(x_1,\cdot\cdot\cdot,x_n)=\gamma \circ MAX g(x1,,xn)=γMAX,使得对于任意 S ∈ X S\in \mathcal X SX
∣ f ( S ) − γ ( M A X x i ∈ S { h ( x i ) } ) ∣ < ϵ \left\vert f(S)-\gamma\left( \mathop{MAX}\limits_{x_i\in S} \{h(x_i)\}\right)\right\vert\lt\epsilon f(S)γ(xiSMAX{h(xi)})<ϵ
其中 x 1 , ⋅ ⋅ ⋅ , x n x_1,\cdot\cdot\cdot,x_n x1,,xn S S S中所有元素的列表(随机排列), γ \gamma γ是一个连续函数, M A X MAX MAX是一个向量最大算子(输入 n n n个向量,其返回一个包含element-wise最大值的向量)。

博主注: 其中 ∘ \circ 是映射乘法,也就是应用了映射 M A X MAX MAX后的结果再应用映射 γ \gamma γ。关于Theorem的证明可以在支撑材料中找到。

这个理论显示,在最坏的情况下,网络也会将空间等分成voxel以描述输入。然而,实验显示,网络的学习结果要比这个好很多。

2. Bottleneck dimension and stability.

实验和理论标明,PointNet的表现严重受到max pooling层维度的影响(也就是公式(1)中的 K K K)。作者在这一部分给出了分析,同时也揭示了网络模型与稳定性相关的性质。

定义 u \bf{u} u = M A X x i ∈ S { h ( x i ) } =\mathop{MAX}\limits_{x_i\in S}\left\{h(x_i)\right\} =xiSMAX{h(xi)} f f f的子网络,用于将 [ 0 , 1 ] m [0,1]^m [0,1]m的点集映射成一个K维的向量。下面的定理证明了输入集合中的小扰动或多余的噪声点不太可能影响网络的结果:

Theorem 2. 假设 u \bf u u : X → R K :\mathcal X \to \mathbb R^K :XRK u \bf{u} u = M A X x i ∈ S { h ( x i ) } =\mathop{MAX}\limits_{x_i\in S}\left\{h(x_i)\right\} =xiSMAX{h(xi)} f = γ ∘ u f=\gamma\circ\bf{u} f=γu。那么:

( a ) ∀ S , ∃ C S , N S ⊆ X , f ( T ) = f ( S ) i f C S ⊆ T ⊆ N S ; ( b ) ∣ C S ∣ ≤ K (a)\quad \forall S, \exists \mathcal C_S, \mathcal N_S\subseteq \mathcal X, f(T)=f(S) if \mathcal C_S\subseteq T \subseteq N_S;\\ (b) \quad \vert\mathcal C_S\vert \leq K (a)S,CS,NSX,f(T)=f(S)ifCSTNS(b)CSK

上面的定理说明:(a)说明只要输入中存在的扰动没有影响到 C S \mathcal C_S CS中的点,或者加入噪声点后不超过 N S \mathcal N_S NS,那么 f ( S ) f(S) f(S)就不变;(b)说明 C S \mathcal C_S CS只包含有限个点,且点的个数由公式(1)中的 K K K决定。总的说来,也就是 f ( S ) f(S) f(S)实际上完全由一个有限的子集 C S ⊆ S \mathcal C_S\subseteq S CSS决定,且子集中元素的个数不超过 K K K个。

因此,称 C S \mathcal C_S CS S S S的关键点集, K K K f f f的瓶颈维度(bottleneck dimension)。

结合 h h h的连续性,就可以解释模型对于点的扰动、损坏、额外噪声点的鲁棒性(参考机器学习中的稀疏性原理)。直观上来看,网络学习了如何通过一组稀疏的关键点组成的集合总结一个形状。实验标明,这组关键点恰好组成了一个目标的骨架。

支撑材料C

支撑材料C为网络结构和训练细节。

PointNet分类网络

由于主体的网络结构已经在正文中说过了,这一部分主要介绍joint alignment/transformation网络以及网络训练细节。

注:这里的变换网络其实就是前面提到的T-Net

第一个变换网络(transformation network)是一个mini-PointNet,其直接以未处理的点云为输入,并回归成一个 3 × 3 3\times 3 3×3的矩阵。这个网络由一个每个点共享的MLP(层输出尺寸分别为64, 128, 1024)、一个点间max pooling、和两个全连接层(层输出尺寸分别为512, 256)组成。输出矩阵初始值为单位阵(identity matrix)。除了最后一层,其余所有层都应用了ReLU和Batch Normalization。
第二个变换网络与第一个结构相同,除了输出矩阵尺寸为 64 × 64 64\times 64 64×64。输出矩阵也被初始化为单位阵。
在softmax clssification的基础上增加了正则损失(regularization loss,权重0.001)以约束输出尽量为正交矩阵。

训练时,在估计类别概率前,对最后一层全连接层(维度256)应用了keep ratio 为0.7的dropout。Batch Normalization的衰减率(decay rate)从初始的0.5逐渐增加到0.99。用adam优化方法,初始学习率0.001,动量(momentum)0.9,batch size 32。学习率每迭代20次下降一半。

在TensorFlow下用GTX1080 GPU和ModelNet数据集训练,网络需要3-6个小时收敛。

PointNet分割网络

分割网络是分类网络的一个延伸。

局部点特征(应用第二个变换网络后的结果)和全局特征(max pooling的输出)按每个点级联。在分割网络中不应用dropout。训练参数与分类网络相同。

对于形状部分分割任务(shape part segmentation),作者对基础网络结构做了一定的调整以实现更好的结果。他们增加了一个one-hot向量(指示输入的类别)并将其与max pooling层的输出级联。他们还增加了某些层的神经元个数和skip links以获取不同层对应的特征,并将这些特征级联作为分割网络的输入。具体网络结构如下图所示。

9

对于语义学分割(semantic segmentation)任务,应用的是与论文主体中相同的基本网络结构(Figure 2)。

ShapeNet part 数据集训练需要大约6-12小时,Stanford semantic parsing数据集训练大概需要半天。

基准3D CNN分割网络

在ShapeNet part分割实验中,作者将所提网络与另外两个传统方法和一个3D volumetric CNN网络(如下图)做比较。给定一个点云,作者首先将其转化成分辨率为 32 × 32 × 32 32\times 32\times 32 32×32×32的占用率网格(occupancy grid)形式的体积描述,再根据图中所示一步步实现。

10

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PointNet学习笔记(一)—— 论文 的相关文章

  • jsp jdbc写登录注册网页

    第一步先通过jdbc驱动链接数据库 package JavaBean import java sql public class DriverManager public Connection getConn throws ClassNotF
  • 快速了解回顾python的列表的常见用法 (-^〇^-)

    面对python里面列表里这么多用法相信许多刚入门的小伙伴们会感觉脑子一片混乱 感觉很容易混淆 下面让我来帮助大伙整理 解析一下 可能不是非常全面 但对于我们刚入门的小伙伴来说完全够用 来咱们上干货 噔 噔 噔噔 首先上场的是列表 我们遵循
  • 有限体积法及其网格简介

    有限体积法及其网格简介 有限体积法使目前CFD领域广泛使用的离散化方法 其特点不仅表现在对控制方程的离散结果上 还表现在所使用的网格上 1 有限体积法的基本思想 有限体积法 Finite Volume Method 又称为控制体积法 Con
  • 03、链表:实现LRU(Least Recently Used)缓存淘汰算法

    03 链表 实现LRU Least Recently Used 缓存淘汰算法 3 1 链表结构及其操作 与数组的对比 不同的链表类型 和单链表相比 循环链表的优点是从链尾到链头比较方便 当要处理的数据具有环型结构特点时 就特别适合采用循环链
  • C# SqlSugar框架的学习使用(一)--SqlSugar简介及创建

    前言 最近有个开发项目准备启动 由于要求的开发周期较短 所以准备用个C 的框架 原本最初考虑用成熟的EF框架 但是觉得那个框架也太重了 就在网上找找了别的 无意间发现了SqlSugar的框架 简单试了下 发现真是的方便 入门也简单 SqlS
  • 法规数字分类

    档案保管年限 1 证券 期货投资咨询机构应当将其向投资人或社会公众提供的投资咨询资料 自提供之日起保存2年 2 客户回访应当留痕 相关资料应当保存不少于3年 3 承销商应当保留推介 定价 配售等承销过程中的相关资料至少3年备查 4 自查及演
  • 【Linux】——实现一个简单shell(命令行解释器)

    进程替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序 但有可能执行不同的代码分支 子进程往往要调用一种exec函数以执行另一个程序 当进程调用一种exec函数时 该进程的用户空间代码和数据完全被新程序替换 从新程序的启动例程
  • 数据库SQLite在Qt5+VS2012使用规则总结---中文乱码

    VS2012默认格式为 GB2312 80 而有时我们用到字符串需要显示中文时 就会出现乱码 下面仅就Qt5和VS2012中使用数据库SQLite时 做一个简单的备忘录 1 include
  • Android Studio格式化代码设置和代码风格设置、代码提示键

    自从google大力推出android studio开发android IDE工具之后 最近大家都切换到android studio 但是切换过来之后 各种不顺手 快捷键就是一个大问题 本来在eclipse中用的好好的快捷键 愣是不顺手了

随机推荐

  • Telink BLE MESH开发环境搭建(Windows版本)

    windows系统环境搭建 获取Telink IDE 下载Telink IDE 安装Telink IDE 解压软件包 用管理员权限运行TelinkSDKv1 3 1 exe 如上图安装到C盘 不可安装到其他盘 会报错 打开运行Eclipse
  • 【带你了解C++标准库为何在八大链表结构中选择了它】双向循环带头链表的实质性操作

    文章目录 八大链表结构为何选择了它 初始化和打印 尾插和尾删 头插和头删 查找和插入 删除和销毁 小结 链表功能动画演示 逻辑实现text c 头文件List h 函数实现List c 八大链表结构为何选择了它 C 的STL库选择的最终链表
  • AE已支持M1芯片mac安装(After Effects 20直装版M1安装方法)M1芯片处理器安装AE问题教程

    作为一名视频编辑创作者 一直都是用苹果的Mac电脑运行AE制作影片 就在今年11月份 苹果发布了基于Apple Silicon M1 SoC芯片打造新Mac产品 全新的M1处理器的诞生带来了很多革命性的变化 因为这标志着苹果正式开启了从In
  • Kaptcha实现验证码

    文章目录 依赖 配置类 使用 依赖
  • 华为OD机试 - MELON的难题 - 动态规划(Java 2023 B卷 100分)

    目录 一 题目描述 二 输入描述 三 输出描述 四 动态规划 五 解题思路 六 Java算法源码 七 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 一 题目描述 MELON有一堆精美的雨花石
  • van-field输入数字失焦后强制保留两位小数

    van field输入数字失焦后强制保留两位小数 一 html 二 JS部分 1 watch监听 2 强制控制有两位小数 一 html
  • 设计模式浅析-适配器模式

    前言 2017年悄悄的来了 无声无息的以至于我都还没好好缅怀一下荒诞的2016 不得不说 2016没能通过努力达到应该有的程度 看样子目标还是要有的 那就先设定一个小目标吧 设计模式 当你学会了设计模式 就要忘记设计模式 辉哥 适配器模式
  • 华为手机隐藏指令的5个代码

    第一个 拨号键输入 6130 这个指令主要用于查看手机当前的网络信号 手机基本信息以及手机的使用情况数据的统计 尤其是手机使用情况统计数据 可以查看当前手机上次使用了哪些应用 使用的具体时间以及使用的时长 第二个 拨号键输入 2846579
  • MySQL 数据库存储引擎

    目录 一 存储引擎简介 二 MyISAM存储引擎 1 MylSAM介绍 2 MyISAM表支持3种不同的存储格式 3 MylSAM的特点 4 MyISAM使用的生产场景 三 InnoDB存储引擎 1 InnoDB介绍 2 InnoDB的特点
  • ubuntu18.04下pass-through直通realteck PCI设备到qemu-kvm虚拟机实践

    设备直通是一种虚拟化资源分配方式 通过将物理设备直通给虚拟机环境 达到虚拟机可以直接访问物理设备的目的 直通功能对设备的要求不高 不需要设备支持PF VF 目前市面上的显卡 网卡一般都支持直通 典型场景比如有两块显卡 一块主机用 另一块虚拟
  • 前端如何实现浏览器适配?

    1 根据window screen width获取当前浏览器的宽度 然后根据宽度加载不同的样式文件 注意 这里的script一定要写在head标签里面 这样在加载页面的之前 会先把css文件加载出来 2 媒体查询 根据设备显示器的特性为其设
  • python 根据索引取值_Python 从列表中取值和取索引的方法

    如下所示 name list zhangsan lisi wangwu 1 取值 print name list 0 print name list 1 print name list 2 2 取索引 print name list ind
  • 北京市经济和信息化局:鼓励布局区块链算力中心

    近日 北京市经济和信息化局印发 北京市数据中心统筹发展实施方案 2021 2023年 的通知 方案提出 鼓励布局人工智能 区块链算力中心 推动形成 4000PFlops 即每秒 4 百亿亿次浮点运算 总算力规模的人工智能公共算力基础设施 重
  • GEN 自动生成 GORM 模型结构体文件及使用示例

    GEN 自动生成 GORM 模型结构体文件及使用示例 背景 GEN 是一个基于 GORM 的安全 ORM 框架 由字节跳动无恒实验室与 GORM 作者联合研发 主要功能说白了就是帮助生成数据表对应的模型文件和更安全方便地执行SQL 直接使用
  • 短链服务架构实践

    1 存储采用REDIS做数据存储 2 id keyword gt long url hset key long url id keyword long url 3 md5 long url gt id keyword hset key sh
  • 队列的实际应用和操作(顺序表)

    题目 利用队列求解报数问题 设有n个人站成一排 从左向右的编号分别为1 n 现在从左往右报数 1 2 1 2 数到 1 的人出列 数到 2 的立即站到队伍的最右端 报数过程反复进行 直到n个人都出列为止 要求给出他们的出列顺序 头文件SqQ
  • 内附源码!使用Python和requests库轻松爬取全国高校排名

    目录 前言 代码实现 总结 前言 中国的大学排名数据比较分散 一些权威机构会发布综合排名 如教育部的 双一流 985 211 计划 还有一些机构会发布专业排名等 因此 具体爬取哪些排名数据可能需要根据实际需要来进行筛选 代码实现 导入req
  • C++ final关键字

    1 禁用继承 C 11中允许将类标记为final 方法时直接在类名称后面使用关键字final 如此 意味着继承该类会导致编译错误 实例如下 class Super final 2 禁用重写 C 中还允许将方法标记为fianal 这意味着无法
  • (小白教学) 用Node.js+Mysql+Express从0搭建实现简单的登录注册

    Node js Express MySql实现用户登录注册 开发工具 vscode git postman 工程目录 数据库表 node搭建过程 首先创建一个为空文件夹server 打开git 初始化一个package json包 npm
  • PointNet学习笔记(一)—— 论文

    PointNet学习笔记 一 论文 本文记录了博主在学习 PointNet Deep Learning on Point Sets for 3D Clasification and Segmentation 过程中的总结笔记 更新于2019