深度学习500问——Chapter03:深度学习基础(4)

文章目录

3.7 预训练与微调(fine tuning)

3.7.1 为什么无监督预训练可以帮助深度学习

3.7.2 什么是模型微调 fine tuning

3.7.3 微调时候网络参数是否更新

3.7.4 fine-tuning模型的三种状态

3.8 权重偏差和初始化

3.8.1 全都初始化为0

3.8.2 全都初始化为同样的值

3.8.3 初始化为小的随机数

3.8.4 用校准方差

3.8.5 稀疏初始化(Sparse Initialization)

3.8.6 初始化偏差

3.9 学习率

3.9.1 学习率的作用

3.9.2 学习率衰减常用参数有哪些

3.9.3 分段常数衰减

3.9.4 指数衰减

3.9.5 自然指数衰减

3.9.6 多项式衰减

3.9.7 余弦衰减

3.12 Dropout 系列问题

3.12.1 为什么要使用正则化

3.12.2 为什么正则化有利于预防过拟合

3.12.3 理解dropout正则化

3.12.4 dropout率的选择

3.12.5 dropout有什么缺点

3.13 深度学习中常用的数据增强方法

3.14 如何理解Internal Covariate Shift

参考文献


3.7 预训练与微调(fine tuning)

3.7.1 为什么无监督预训练可以帮助深度学习

深度网络存在的问题:

  1. 网络越深,需要的训练样本数越多。若用监督则需大量标注样本,不然小规模样本容易造成过拟合。深层网络特征比较多,会出现的多特征问题主要有多样本问题、规则化问题、特征选择问题。
  2. 多层神经网络参数优化是个高阶非凸优化问题,经常得到收敛较差的局部解。
  3. 梯度扩散问题,BP算法计算出的梯度随着深度向前而显著下降,导致前面网络参数贡献很小,更新速度慢。

解决方法:

逐层贪婪训练,无监督训练(unsupervised pre-training)即训练网络的第一个隐藏层,再训练第二个...最后用这些训练好的网络参数值作为整体网络参数的初始值。

经过预训练最终能得到比较好的局部最优解。

3.7.2 什么是模型微调 fine tuning

用别人的参数、修改后的网络和自己的数据进行训练,使得参数适应自己的数据,这样一个过程,通常称之为微调(fine tuning)。

模型的微调举例说明:

我们知道,CNN在图像识别这一领域取得了巨大的进步。如果想将CNN应用到我们自己的数据集上,这时通常就会面临一个问题:通常我们的dataset都不会特别大,一般不会超过1万张,甚至更少,每一类图片只有几十或者十几张。这时候,直接应用这些数据训练一个网络的想法就不可行了,因为深度学习成功的一个关键性因素就是大量带标签数据组成的训练集。如果只利用手头上这点数据,即使我们利用非常好的网络结构,也达不到很高的 performance。这时候,fine-tuning的思想就可以很好解决我们的问题:我们通过对ImageNet上训练出来的模型(如CaffeNet,VGGNet,ResNet)进行微调,然后应用到我们自己的数据集上。

3.7.3 微调时候网络参数是否更新

答:会更新。

  1. fine-tuning的过程相当于继续训练,跟直接训练的区别是初始化的时候。
  2. 直接训练是按照网络定义指定的方式初始化。
  3. finetune是用你已有的参数文件来初始化。

3.7.4 fine-tuning模型的三种状态

  1. 状态一:只预测,不训练。特点:相对快、简单,针对那些已经训练好,现在要实际对未知数据进行标注的项目,非常高效;
  2. 状态二:训练,但只训练最后分类层。特点:fine-tuning的模型最终的分类以及符合要求,现在只是在他们的基础上进行类别降维。
  3. 状态三:完全训练,分类层+之前卷积层都训练。特点:跟状态二的差异很小,当然状态二比较耗时和需要训练GPU资源,不过非常适合fine-tuning到自己想要的模型里面,预测精度相比状态二也提高不少。

3.8 权重偏差和初始化

3.8.1 全都初始化为0

偏差初始化陷阱:都初始化为0。

产生陷阱原因:因为并不知道在训练神经网络中每一个权重最后的值,但是如果进行了恰当的数据归一化后,我们可以有理由认为有一半的权重是正的,另一半是负的。令所有权重都初始化为0,如果神经网络计算出来的输出值是一样的,神经网络在进行反向传播算法计算出来的梯度值也一样,并且参数更新值也一样。更一般地说,如果权重初始化为同一个值,网络就是对称的。

形象化理解:在神经网络中考虑梯度下降的时候,设想你在爬山,但身处直线形的山谷中,两边是对称的山峰。由于对称性,你所在之处的梯度只能沿着山谷的方向,不会指向山峰;你走了一步之后,情况依然不变。结果就是你只能收敛到山谷中的一个极大值,而走不到山峰上去。

3.8.2 全都初始化为同样的值

偏差初始化陷阱:都初始化为一样的值。

以一个三层网络为例:首先看以下结构。

它的表达式为:

如果每个权重都一样,那么在多层网络中,从第二层开始,每一层的输入值都是相同的了,也就是a1=a2=a3=....,既然都一样,就相当于一个输入了,为啥呢?

如果是反向传递算法(如果不明白请看上面的连接),其中的偏置项和权重项的迭代偏导数计算公式如下:

\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b;x,y) = a_j^{(l)} \delta_i^{(l+1)}\\ \frac{\partial}{\partial b_{i}^{(l)}} J(W,b;x,y) = \delta_i^{(l+1)}

\delta的计算公式:

\delta^{(l)}_i = \left( \sum_{j=1}^{s_{t+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)

如果用的是 sigmoid 函数:

f'(z_i^{(l)}) = a_i^{(l)}(1 - a_i^{(l)})

把后两个公式代入,可以看出所得到的梯度下降法的偏导相同,不停的迭代,不停的相同,不停的迭代,不停的相同......,最后就得到了相同的值(权重和截距)。

3.8.3 初始化为小的随机数

将权重初始化为很小的数字是一个普遍的打破网络对称性的解决办法。这个想法是,神经元在一开始都是随机的、独一无二的,所以它们会计算出不同的更新,并将自己整合到整个网络的各个部分。一个权重矩阵的实现可能看起来像W=0.01*np.random.randn(D,H),其中randn是从均值为0的单位标准高斯分布进行取样。通过这个公式(函数),每个神经元的权重向量初始化为一个从多维高斯分布取样的随机向量,所以神经元在输入空间中指向随机的方向(so the neurons point in random direction in the input space)。(应该是指输入空间中对于随机方向有影响)。其实也可以从均匀分布中来随机选取小数,但是在实际操作中看起来似乎对最后的表现并没有太大的影响。

注:并不是数字越小就会表现的越好。比如,如果一个神经网络层的权重非常小,那么在反向传播算法就会计算出很小的梯度(因为梯度 gradient 是与权重成正比的)。在网络不断的反向传播过程中将极大地减少“梯度信号”,并可能成为深层网络的一个需要注意的问题。

3.8.4 用1/\sqrt n校准方差

 上述建议的一个问题是,随机初始化神经元的输出的分布有一个随输入量增加而变化的方差。结果证明,我们可以通过将其权重向量按其输入的平方根(即输入的数量)进行缩放,从而将每个神经元的输出的方差标准化到 1。也就是说推荐的启发式方法 (heuristic) 是将每个神经元的权重向量按下面的方法进行初始化:w=np.random.randn(n)/\sqrt n,其中 n 表示输入的数量。这保证了网络中所有的神经元最初的输出分布大致相同,并在经验上提高了收敛速度。

3.8.5 稀疏初始化(Sparse Initialization)

​ 另一种解决未校准方差问题的方法是把所有的权重矩阵都设为零,但是为了打破对称性,每个神经元都是随机连接地(从如上面所介绍的一个小的高斯分布中抽取权重)到它下面的一个固定数量的神经元。一个典型的神经元连接的数目可能是小到 10 个。

3.8.6 初始化偏差

将偏差初始化为零是可能的,也是很常见的,因为非对称性破坏是由权重的小随机数导致的。因为 ReLU 具有非线性特点,所以有些人喜欢使用将所有的偏差设定为小的常数值如 0.01,因为这样可以确保所有的 ReLU 单元在最开始就激活触发(fire)并因此能够获得和传播一些梯度值。然而,这是否能够提供持续的改善还不太清楚(实际上一些结果表明这样做反而使得性能更加糟糕),所以更通常的做法是简单地将偏差初始化为 0。

3.9 学习率

3.9.1 学习率的作用

在机器学习中,监督式学习通过定义一个模型,并根据训练集上的数据估计最优参数。梯度下降法是一个广泛被用来最小化模型误差的参数优化算法。梯度下降法通过多次迭代,并在每一步中最小化成本函数cost来估计模型的参数。学习率(learning rate),在迭代过程中会控制模型的学习进度。

在梯度下降法中,都是给定的统一的学习率,整个优化过程中都以确定的步长进行更新,在迭代优化的前期,学习率较大,则前进的步长就会较长,这时便能以较快的速度进行梯度下降,而在迭代优化的后期,逐步减小学习率的值,减小步长,这样将有助于算法的收敛,更容易接近最优解。故而如何对学习率的更新成为了研究者的关注点。在模型优化中,常用到的几种学习率衰减的方法有:分段常数衰减、多项式衰减、指数衰减、自然指数衰减、余弦衰减、线性余弦衰减、噪声线性余弦衰减。

3.9.2 学习率衰减常用参数有哪些

参数名称参数说明
learning_rate初始学习率
global_step用于衰减计算的全局步数,非负,用于逐步计算衰减指数
decay_steps衰减步数,必须是正值,决定衰减周期
decay_rate衰减率
end_learning_rate最低的最终学习率
cycle学习率下降后是否重新上升
alpha最小学习率
num_periods衰减余弦部分的周期数
initial_variance噪声的初始方差
variance_decay衰减噪声的方差

3.9.3 分段常数衰减

分段常数衰减需要事先定义好的训练次数区间,在对应区间置不同的学习率的常数值,一般情况刚开始的学习库率要大一些,之后要越来越小,要根据样本量的大小设置区间的间隔大小,样本量越大,区间间隔要小一点。下图即为分段常数衰减的学习率变化图,横坐标代表训练次数,纵坐标代表学习率。

3.9.4 指数衰减

以指数衰减方式进行学习率的更新,学习率的大小和训练次数指数相关,其更新规则为:

\text{decayed\_learning\_rate} = \text{learning\_rate} \times \text{decay\_rate}^{\frac{\text{global\_step}}{\text{decay\_steps}}}

这种衰减方式简单直接,收敛速度快。是最常用的学习率衰减方式,如下图所示,绿色的学习率随训练次数的指数衰减方式,红色的即为分段常数衰减,它在一定的训练区间内保持学习率不变。

3.9.5 自然指数衰减

它与指数的衰减方式相似,不同的在于它的衰减底数是e,故而其收敛的速度更快,一般用于相对比较容易训练的网络,便于较快的收敛,其更新规则如下:

\text{decayed\_learning\_rate} = \text{learning\_rate} \times e^{\frac{-\text{decay\_rate}}{\text{global\_step}}}

下图为分段常数衰减、指数衰减、自然指数衰减三种方式的对比图,红色的即为分段常数衰减图,阶梯型曲线。蓝色线为指数衰减图,绿色的即为自然指数衰减图,很明显可以看到自然指数衰减方式下的学习率衰减程度要大于一般指数衰减方式,有助于更快的收敛。

3.9.6 多项式衰减

应用多项式衰减的方式进行更新学习率,这里会给定初始学习率和最低学习率取值,然后将会按照给定的衰减方式将学习率从初始值衰减到最低值,其更新规则如下式所示:

\text{global\_step} = \min(\text{global\_step}, \text{decay\_steps})

\text{decayed\_learning\_rate} \\= (\text{learning\_rate} - \text{end\_learning\_rate}) \\\times \left(1 - \frac{\text{global\_step}}{\text{decay\_steps}}\right)^{\text{power}} + \text{end\_learning\_rate}

需要注意的是,有两个机制,降到最低学习率后,到训练结束可以一直使用最低学习率进行更新,另一个是再次将学习率调高,使用decay_steps的倍数,取第一个大于 global_steps的结果,如下式所示,它是用来防止神经网络在训练的后期由于学习率过小而导致的网络一直在某个局部最小值附近震荡,这样可以通过在后期增大学习率跳出局部最小值。

\text{decay\_steps} = \text{decay\_steps} \times \lceil \frac{\text{global\_step}}{\text{decay\_steps}}\rceil

如下图所示,红色线代表学习率降低至最低后,一直保持学习率不变进行更新,绿色线代表学习率衰减到最低后,又会再次循环往复的升高降低。

3.9.7 余弦衰减

余弦衰减就是采用余弦的相关方式进行学习率的衰减,衰减图和余弦函数相似,其更新机制如下式所示:

\text{global\_step} = \min(\text{global\_step}, \text{decay\_steps})

\text{cosine\_decay} = 0.5 \times \left( 1 + \cos\left( \pi \times \frac{\text{global\_step}}{\text{decay\_steps}}\right)\right)

\text{decayed} = (1 - \alpha) \times \text{cosine\_decay} + \alpha

\text{decayed\_learning\_rate} = \text{learning\_rate} \times \text{decayed}

如下图所示,红色即为标准的余弦衰减曲线,学习率从初始值下降到最低学习率后保持不变。蓝色的线是线性余弦衰减方式曲线,它是学习率从初始学习率以线性的方式下降到最低学习率值。绿色是噪声线性余弦衰减方式。

3.12 Dropout 系列问题

3.12.1 为什么要使用正则化

  1. 深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少你的网络误差。
  2. 如果你怀疑神经网络过度拟合了数据,即存在高方差问题,那么最先想到的方法可能是正则化,另一个解决高方差的方法就是准备更多数据,这也是非常可靠的办法,但你可能无法时时准备足够多的训练数据,或者,获取更多数据的成本很高,但正则化有助于避免过度拟合,或者减少网络误差。

3.12.2 为什么正则化有利于预防过拟合

左图是高偏差,右图是高方差,中间是Just Right,这几张图我们在前面课程中看到过。

3.12.3 理解dropout正则化

Dropout可以随机删除网络中的神经单元,它为什么可以通过正则化发挥如此大的作用呢?

直观上理解:不要依赖于任何一个特征,因为该单元的输入可能随时被清除,因此该单元通过这种方式传播下去,并为单元的四个输入增加一点权重,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,和之前讲的L2正则化类似;实施dropout的结果它会压缩权重,并完成一些预防过拟合的外层正则化;L2对不同权重的衰减是不同的,它取决于激活函数倍增的大小。

3.12.4 dropout率的选择

  1. 经过交叉验证,隐含节点dropout率等于0.5的时候效果最好,原因是0.5是时候 dropout 随机生成的网络结构最多。
  2. dropout 也可以被用作一种添加噪声的方法,直接对input进行操作。输入层设为更接近 1 的数。使得输入变化不会太大(0.8).
  3. 对参数w的训练进行球形限制(max-normalization),对dropout的训练非常有用。
  4. 球形半径c是一个需要调整的参数,可以使用验证集进行参数调优。
  5. dropout自己虽然也很牛,但是dropout、max-normalization、large decaying learning rates and high momentum组合起来效果更好,比如 max-norm regularization就可以防止大的learning rate导致的参数 blow up。
  6. 使用pretaining方法也可以帮助dropout训练参数,在使用 dropout 时,要将所有参数都乘以1/p

3.12.5 dropout有什么缺点

dropout一大缺点就是代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。定义明确的代价函数J每次迭代后都会下降,因为我们所优化的代价函数J实际上并没有明确定义,或者说在某种程度上很难计算,所以我们失去了调试工具来绘制这样的图片。我通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数,希望在dropout过程中,代码并未引入bug。我觉得你也可以尝试其他方法,虽然我们并没有关于这些方法性能的数据统计,但你可以把它们与dropout方法一起使用。

3.13 深度学习中常用的数据增强方法

  • Color Jittering:对颜色的数据增强:图像亮度、饱和度、对比度变化(此处对色彩抖动的理解不知是否得当);
  • PCA Jittering:首先按照RGB三个颜色通道计算均值和标准差,再在整个训练集上计算协方差矩阵,进行特征分解,得到特征向量和特征值,用来做PCA Jittering;
  • Random Scale:尺度变换;
  • Random Crop:采用随机图像差值方式,对图像进行裁剪、缩放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和长宽比增强变换;
  • Horizontal / Vertical Flip:水平 / 垂直翻转;
  • Shift:平移变换;
  • Rotation / Reflection:旋转 / 仿射变换;
  • Noise:高斯噪声、模糊处理;
  • Label Shuffle:类别不平衡数据的增广。

3.14 如何理解Internal Covariate Shift

深度神经网络模型的训练为什么会很困难?其中一个重要的原因是,深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。

Google讲这一现象总结为 Internal Covariate Shift,简称ICS。什么是ICS呢?

大家都知道在统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如 transfer learning / domain adaptation 等。而 covariate shift 就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同。

大家细想便会发现,的确,对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。由于是对层间信号的分析,也即是“internal”的来由。

那么ICS会导致什么问题?

简而言之,每个神经元的输入数据不再是“独立同分布”。

其一,上层参数需要不断适应新的输入数据分布,降低学习速度。

其二,下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。

其三,每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。

参考文献

[1] Rosenblatt, F. The perceptron: A probabilistic model for information storage and organization in the brain.[J]. Psychological Review, 1958, 65(6):386-408.

[2] Duvenaud D , Rippel O , Adams R P , et al. Avoiding pathologies in very deep networks[J]. Eprint Arxiv, 2014:202-210.

[3] Rumelhart D E, Hinton G E, Williams R J. Learning representations by back-propagating errors[J]. Cognitive modeling, 1988, 5(3): 1.

[4] Hecht-Nielsen R. Theory of the backpropagation neural network[M]//Neural networks for perception. Academic Press, 1992: 65-93.

[5] Felice M. Which deep learning network is best for you?| CIO[J]. 2017.

[6] Conneau A, Schwenk H, Barrault L, et al. Very deep convolutional networks for natural language processing[J]. arXiv preprint arXiv:1606.01781, 2016, 2.

[7] Ba J, Caruana R. Do deep nets really need to be deep?[C]//Advances in neural information processing systems. 2014: 2654-2662.

[8] Nielsen M A. Neural networks and deep learning[M]. USA: Determination press, 2015.

[9] Goodfellow I, Bengio Y, Courville A. Deep learning[M]. MIT press, 2016.

[10] 周志华. 机器学习[M].清华大学出版社, 2016.

[11] Kim J, Kwon Lee J, Mu Lee K. Accurate image super-resolution using very deep convolutional networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 1646-1654.

[12] Chen Y, Lin Z, Zhao X, et al. Deep learning-based classification of hyperspectral data[J]. IEEE Journal of Selected topics in applied earth observations and remote sensing, 2014, 7(6): 2094-2107.

[13] Domhan T, Springenberg J T, Hutter F. Speeding up automatic hyperparameter optimization of deep neural networks by extrapolation of learning curves[C]//Twenty-Fourth International Joint Conference on Artificial Intelligence. 2015.

[14] Maclaurin D, Duvenaud D, Adams R. Gradient-based hyperparameter optimization through reversible learning[C]//International Conference on Machine Learning. 2015: 2113-2122.

[15] Srivastava R K, Greff K, Schmidhuber J. Training very deep networks[C]//Advances in neural information processing systems. 2015: 2377-2385.

[16] Bergstra J, Bengio Y. Random search for hyper-parameter optimization[J]. Journal of Machine Learning Research, 2012, 13(Feb): 281-305.

[17] Ngiam J, Khosla A, Kim M, et al. Multimodal deep learning[C]//Proceedings of the 28th international conference on machine learning (ICML-11). 2011: 689-696.

[18] Deng L, Yu D. Deep learning: methods and applications[J]. Foundations and Trends® in Signal Processing, 2014, 7(3–4): 197-387.

[19] Erhan D, Bengio Y, Courville A, et al. Why does unsupervised pre-training help deep learning?[J]. Journal of Machine Learning Research, 2010, 11(Feb): 625-660.

[20] Dong C, Loy C C, He K, et al. Learning a deep convolutional network for image super resolution[C]//European conference on computer vision. Springer, Cham, 2014: 184-199.

[21] 郑泽宇,梁博文,顾思宇.TensorFlow:实战Google深度学习框架(第2版)[M].电子工业出版社,2018.

[22] 焦李成. 深度学习优化与识别[M].清华大学出版社,2017.

[23] 吴岸城. 神经网络与深度学习[M].电子工业出版社,2016.

[24] Wei, W.G.H., Liu, T., Song, A., et al. (2018) An Adaptive Natural Gradient Method with Adaptive Step Size in Multi-layer Perceptrons. Chinese Automation Congress, 1593-1597.

[25] Y Feng, Y Li.An Overview of Deep Learning Optimization Methods and Learning Rate Attenuation Methods[J].Hans Journal of Data Mining,2018,8(4),186-200.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/472255.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无需PS技能!2024年在线UI设计工具推荐,让你快速上手!

随着UI设计行业的蓬勃发展,越来越多的设计师进入UI设计,选择一个方便的UI设计工具尤为重要!除了传统的UI设计工具外,在线UI设计工具也受到越来越多设计师的青睐。这种不受时间、地点和计算机配置限制的工作模式真的很令人兴奋。在…

回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测(完整源码和数据) …

Figure 公司推出首款集成 OpenAI 大模型的自主人形机器人,开启与人类全面对话的新纪元

2024年3月13日,Figure,一家在人工智能机器人领域引领创新的公司,宣布推出了一款革命性的自主人形机器人。这款全新的 demo 机器人不仅标志着商业上可行的自主人形机器人技术的突破,更是通过整合 OpenAI 的先进大模型技术&#xff…

操作符详解(C语言)—算数操作符,移位操作符,位操作符

操作符的分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 算术操作符 - * / %除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。对于 / 操作符如果两个…

Unity Mesh简化为Cube mesh

Mesh简化为Cube mesh 🍳食用🥙子物体独立生成CubeMesh🥪合并成一个CubeMesh🌭Demo 🍳食用 下载并导入插件👈即可在代码中调用。 🥙子物体独立生成CubeMesh gameObject.ToCubeMesh_Invidual()…

关于 HTTP 协议,你了解多少?

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

数据分析的具体流程

1.导入 表格导入数据时要注意数据的格式问题非表格导入 可以先将文档放入word中 将换行符(^p)替换为|||,选择特殊格式中的段落标记 进行全部替换 以每一列最后的数据/平,作为换行的标志 将所整理的信息导入excel,对数据进行分列 选…

数据库系统概论-第5章 数据库完整性

5.1 实体完整性 5.2 参照完整性 5.3 用户定义完整性 5.4 完整性约束命名子句 5.5 域中的完整性限制 5.6 断言 5.7 触发器 5.8 小结

OpenGL+QT实现矢量和影像的叠加绘制

一、QT下OpenGL框架的初始化 OpenGL的介绍我在这里就没有必要介绍了,那OpenGL和QT的结合在这里就有必要先介绍一下,也就是怎么使用QT下的OpenGL框架。要想使用QT下的OpenGL框架,就必须要子类化QGLWidget,然后实现。 void initia…

冶炼金属 (第十四届蓝桥杯省赛C++ B组)详解(二分+推公式)

题目描述: 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。 这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时&#…

Spring MVC文件下载配置

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 文件下载 在Spring MVC中通常利用commons-io实现文件下载,示例代码如下: Controller RequestMapping("......") public class DownloadC…

AI大模型-Grok搭建

Grok搭建 硬件要求项目下载Checkpoint下载运行代码 马斯克又搞事情了,正式开源AI大模型Grok-1,免费还可商用,国内AI技术即将迎来重大突破。笔者简单整合了一下,如何搭建Grok-1的思路,供后期自己搭建以及读者学习使用。…

房屋租赁系统|基于JSP技术+ Mysql+Java+ B/S结构的房屋租赁系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…

理解数据库习题

1.选择 (1)现实世界中客观存在并能相互区别的事物称为( )。 A.实体 B.实体集 C字段 D 记录 (2)下列实体类型的联系中,属于一对一联系的是( )A.教研室对教师的所属联系 …

centos 环境部署

一、安装redis 1. 升级 GCC 最直接的解决方式是升级你的 GCC 编译器到支持 C11 标准的版本。CentOS 7 默认的 GCC 版本较旧,可能不支持 _Atomic。你可以通过以下步骤升级 GCC: 启用 CentOS 的 Software Collections (SCL) 仓库,该仓库提供了…

力扣---完全平方数

思路: 还是比较好想的,g[i]定义为和为 i 的完全平方数的最少数量。那么递推关系式是g[i]min(g[i-1],g[i-4],g[i-9],...)1,数组初始化是g[0]0,g[1]1。注意这里要对g[0]初始化,(举个例子)因为在遍历到g[4]时&…

docker安装Milvus

docker安装Milvus 拉去CPU版本的milvus镜像 $ sudo docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 mkdir -p milvus/conf cd milvus/conf ls wget https://raw.githubusercontent.com/milvus-io/milvus/v0.1…

未来教育趋势:AI个性化培训如何推动企业与员工共赢

AI定制学习:重新定义个性化员工培训的未来 随着人工智能(AI)技术的迅猛发展,我们正目睹并亲历了AI在培训领域所引发的根本性变革。AI技术的整合不仅革新了知识传递的模式,而且重新塑造了个性化学习的内涵。依托于尖端算…

平替电容笔哪个品牌好?推荐五款 2024 高人气电容笔,入手不亏!

作为一名有着多年测评数码经验的评测师,用过的原装笔和平替电容笔加起来也有不下十款了,看过也有很多朋友因为选错电容笔,导致书写效率低,体验感差的例子也数不胜数。这并非夸大其词,因为不专业产品的最大弊端就是毫无…

segformer多分类语义分割

前言 本期将分享「Segformer」,论文地址https://arxiv.org/abs/2105.15203。 Segformer简介 全局上下文信息: 由于Transformer的自注意力机制,Segformer可以在整个图像范围内捕获上下文信息,而不受局部感受野的限制,这有助于提高分…