pytorch实现梯度下降、随机梯度下降-图像直观展示

深度学习与优化算法原理

优化函数与深度学习

  • 在一个深度学习问题中,通常需要预先定义一个损失函数。
  • 有了损失函数以后,使用优化算法试图将其最小化。

在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function)。

  • 依据惯例,优化算法通常只考虑最小化目标函数。
  • 其实,任何最大化问题都可以很容易地转化为最小化问题,只需令目标函数的相反数为新的目标函数即可

虽然优化为深度学习提供了最小化损失函数的方法,但本质上,优化与深度学习的目标是有区别的。

训练误差和泛化误差是不同的:

  • 优化算法的目标函数通常是一个基于训练数据集的损失函数,优化的目标在于降低训练误差。
  • 而深度学习的目标在于降低泛化误差。为了降低泛化误差,除了使用优化算法降低训练误差以外,还需要注意应对过拟合

深度学习优化的问题

深度学习中绝大多数目标函数都很复杂。因此,很多优化问题并不存在解析解,而需要使用基于数值方法的优化算法找到近似解,即数值解。为了求得最小化目标函数的数值解,我们将通过优化算法有限次迭代模型参数来尽可能降低损失函数的值

常见的优化在深度学习中的挑战,有局部最小值和鞍点等。

局部最小值

对于目标函数f(x)f(x)f(x),如果f(x)f(x)f(x)xxx上的值比在xxx邻近的其他点的值更小,那么f(x)f(x)f(x)可能是一个局部最小值(local minimum)。如果f(x)f(x)f(x)xxx上的值是目标函数在整个定义域上的最小值,那么f(x)f(x)f(x)是全局最小值(global minimum)。

举个例子,给定函数

f(x)=x⋅cos(πx),−1.0≤x≤2.0,f(x) = x \cdot \text{cos}(\pi x), \qquad -1.0 \leq x \leq 2.0, f(x)=xcos(πx),1.0x2.0,

我们可以大致找出该函数的局部最小值和全局最小值的位置。需要注意的是,图中箭头所指示的只是大致位置。

%matplotlib inline
import sys
sys.path.append("..") 
from mpl_toolkits import mplot3d # 三维画图
from matplotlib import pyplot as plt
import numpy as npdef f(x):return x * np.cos(np.pi * x)def set_figsize(figsize=(3.5, 2.5)):use_svg_display()# 设置图的尺寸plt.rcParams['figure.figsize'] = figsize
set_figsize((4.5, 2.5))
x = np.arange(-1.0, 2.0, 0.1)
fig,  = plt.plot(x, f(x))
fig.axes.annotate('local minimum', xy=(-0.3, -0.25), xytext=(-0.77, -1.0),arrowprops=dict(arrowstyle='->'))
fig.axes.annotate('global minimum', xy=(1.1, -0.95), xytext=(0.6, 0.8),arrowprops=dict(arrowstyle='->'))
plt.xlabel('x')
plt.ylabel('f(x)');

深度学习模型的目标函数可能有若干局部最优值。当一个优化问题的数值解在局部最优解附近时

  • 由于目标函数有关解的梯度接近或变成零
  • 最终迭代求得的数值解可能只令目标函数局部最小化而非全局最小化

鞍点

梯度接近或变成零可能是由于当前解在局部最优解附近造成的,另一种可能性是当前解在鞍点(saddle point)附近。

例如,给定函数

f(x)=x3,f(x) = x^3,f(x)=x3,

我们可以找出该函数的鞍点位置。

x = np.arange(-2.0, 2.0, 0.1)
fig, = plt.plot(x, x**3)
fig.axes.annotate('saddle point', xy=(0, -0.2), xytext=(-0.52, -5.0),arrowprops=dict(arrowstyle='->'))
plt.xlabel('x')
plt.ylabel('f(x)');

又例如下面这个定义在二维空间的函数的例子,

f(x,y)=x2−y2.f(x, y) = x^2 - y^2.f(x,y)=x2y2.

我们可以找出该函数的鞍点位置。

x, y = np.mgrid[-1: 1: 31j, -1: 1: 31j]
z = x**2 - y**2ax = plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z, **{'rstride': 2, 'cstride': 2})
ax.plot([0], [0], [0], 'rx')
ticks = [-1,  0, 1]
plt.xticks(ticks)
plt.yticks(ticks)
ax.set_zticks(ticks)
plt.xlabel('x')
plt.ylabel('y');
  • 该函数看起来像一个马鞍,而鞍点恰好是马鞍上可坐区域的中心
  • 在图的鞍点位置,目标函数在xxx轴方向上是局部最小值,但在yyy轴方向上是局部最大值。

假设一个函数的输入为kkk维向量,输出为标量,那么它的海森矩阵(Hessian matrix)有kkk个特征值。该函数在梯度为0的位置上可能是局部最小值、局部最大值或者鞍点。

  • 当函数的海森矩阵在梯度为零的位置上的特征值全为正时,该函数得到局部最小值。
  • 当函数的海森矩阵在梯度为零的位置上的特征值全为负时,该函数得到局部最大值。
  • 当函数的海森矩阵在梯度为零的位置上的特征值有正有负时,该函数得到鞍点。

随机矩阵理论告诉我们,对于一个大的高斯随机矩阵来说,任一特征值是正或者是负的概率都是0.5。那么,以上第一种情况的概率为 0.5k0.5^k0.5k。由于深度学习模型参数通常都是高维的(kkk很大),目标函数的鞍点通常比局部最小值更常见。

在深度学习中,虽然找到目标函数的全局最优解很难,但这并非是必要的。

梯度下降和随机梯度下降

虽然梯度下降在深度学习中很少被直接使用,但理解梯度的意义以及沿着梯度反方向更新自变量可能降低目标函数值的原因是学习后续优化算法的基础。

一维梯度下降

先以简单的一维梯度下降为例。

  • 假设连续可导的函数f:R→Rf: \mathbb{R} \rightarrow \mathbb{R}f:RR的输入和输出都是标量
  • 给定绝对值足够小的数ϵ\epsilonϵ

根据泰勒展开公式,我们得到以下的近似:

f(x+ϵ)≈f(x)+ϵf′(x).f(x + \epsilon) \approx f(x) + \epsilon f'(x) .f(x+ϵ)f(x)+ϵf(x).

这里f′(x)f'(x)f(x)是函数fffxxx处的梯度。一维函数的梯度是一个标量,也称导数。

接下来,找到一个常数η>0\eta > 0η>0,使得∣ηf′(x)∣\left|\eta f'(x)\right|ηf(x)足够小,那么可以将ϵ\epsilonϵ替换为−ηf′(x)-\eta f'(x)ηf(x)并得到

f(x−ηf′(x))≈f(x)−ηf′(x)2.f(x - \eta f'(x)) \approx f(x) - \eta f'(x)^2.f(xηf(x))f(x)ηf(x)2.

如果导数f′(x)≠0f'(x) \neq 0f(x)=0,那么ηf′(x)2>0\eta f'(x)^2>0ηf(x)2>0,所以

f(x−ηf′(x))≲f(x).f(x - \eta f'(x)) \lesssim f(x).f(xηf(x))f(x).

这意味着,如果通过

x←x−ηf′(x)x \leftarrow x - \eta f'(x)xxηf(x)

来迭代xxx,函数f(x)f(x)f(x)的值可能会降低。因此在梯度下降中,我们先选取一个初始值xxx和常数η>0\eta > 0η>0,然后不断通过上式来迭代xxx,直到达到停止条件,例如f′(x)2f'(x)^2f(x)2的值已足够小或迭代次数已达到某个值。

下面以目标函数f(x)=x2f(x)=x^2f(x)=x2为例来看一看梯度下降是如何工作的。虽然很明显最小化f(x)f(x)f(x)的解为x=0x=0x=0,这里依然使用这个简单函数来观察xxx是如何被迭代的。

%matplotlib inline
import numpy as np
import torch
import math
import sys
sys.path.append("..") def gd(eta):x = 10results = [x]for i in range(10):x -= eta * 2 * x  # f(x) = x * x的导数为f'(x) = 2 * xresults.append(x)print('epoch 10, x:', x)return resultsres = gd(0.2)

使用x=10x=10x=10作为初始值,并设η=0.2\eta=0.2η=0.2。使用梯度下降对xxx迭代10次,可见最终xxx的值较接近最优解。

绘制出自变量xxx的迭代轨迹:

def show_trace(res):n = max(abs(min(res)), abs(max(res)), 10)f_line = np.arange(-n, n, 0.1)set_figsize()plt.plot(f_line, [x * x for x in f_line])plt.plot(res, [x * x for x in res], '-o')plt.xlabel('x')plt.ylabel('f(x)')show_trace(res)

学习率

上述梯度下降算法中的正数η\etaη通常叫作学习率。这是一个超参数,需要人工设定。如果使用过小的学习率,会导致xxx更新缓慢从而需要更多的迭代才能得到较好的解。

下面展示使用学习率η=0.05\eta=0.05η=0.05时自变量xxx的迭代轨迹

show_trace(gd(0.05))

如果使用过大的学习率,∣ηf′(x)∣\left|\eta f'(x)\right|ηf(x)可能会过大从而使前面提到的一阶泰勒展开公式不再成立:这时我们无法保证迭代xxx会降低f(x)f(x)f(x)的值。

举个例子,当设学习率η=1.1\eta=1.1η=1.1时,可以看到xxx不断越过(overshoot)最优解x=0x=0x=0并逐渐发散。

show_trace(gd(1.1))

维度增加:多维梯度下降

在了解了一维梯度下降之后,我们再考虑一种更广义的情况:

  • 目标函数的输入为向量
  • 输出为标量。

假设目标函数f:Rd→Rf: \mathbb{R}^d \rightarrow \mathbb{R}f:RdR的输入是一个ddd维向量x=[x1,x2,…,xd]⊤\boldsymbol{x} = [x_1, x_2, \ldots, x_d]^\topx=[x1,x2,,xd]。目标函数f(x)f(\boldsymbol{x})f(x)有关x\boldsymbol{x}x的梯度是一个由ddd个偏导数组成的向量:

∇xf(x)=[∂f(x)∂x1,∂f(x)∂x2,…,∂f(x)∂xd]⊤.\nabla_{\boldsymbol{x}} f(\boldsymbol{x}) = \bigg[\frac{\partial f(\boldsymbol{x})}{\partial x_1}, \frac{\partial f(\boldsymbol{x})}{\partial x_2}, \ldots, \frac{\partial f(\boldsymbol{x})}{\partial x_d}\bigg]^\top.xf(x)=[x1f(x),x2f(x),,xdf(x)].

为表示简洁,我们用∇f(x)\nabla f(\boldsymbol{x})f(x)代替∇xf(x)\nabla_{\boldsymbol{x}} f(\boldsymbol{x})xf(x)。梯度中每个偏导数元素∂f(x)/∂xi\partial f(\boldsymbol{x})/\partial x_if(x)/xi代表着fffx\boldsymbol{x}x有关输入xix_ixi的变化率。为了测量fff沿着单位向量u\boldsymbol{u}u(即∣u∣=1|\boldsymbol{u}|=1u=1)方向上的变化率,在多元微积分中,我们定义fffx\boldsymbol{x}x上沿着u\boldsymbol{u}u方向的方向导数为

Duf(x)=lim⁡h→0f(x+hu)−f(x)h.\text{D}_{\boldsymbol{u}} f(\boldsymbol{x}) = \lim_{h \rightarrow 0} \frac{f(\boldsymbol{x} + h_ \boldsymbol{u}) - f(\boldsymbol{x})}{h}.Duf(x)=h0limhf(x+hu)f(x).

依据方向导数性质,以上方向导数可以改写为

Duf(x)=∇f(x)⋅u(向量相乘)\text{D}_{\boldsymbol{u}} f(\boldsymbol{x}) = \nabla f(\boldsymbol{x}) \cdot \boldsymbol{u}(向量相乘)Duf(x)=f(x)u()

方向导数Duf(x)\text{D}_{\boldsymbol{u}} f(\boldsymbol{x})Duf(x)给出了fffx\boldsymbol{x}x上沿着所有可能方向的变化率。为了最小化fff,我们希望找到fff能被降低最快的方向。因此,我们可以通过单位向量u\boldsymbol{u}u来最小化方向导数Duf(x)\text{D}_{\boldsymbol{u}} f(\boldsymbol{x})Duf(x)

由于Duf(x)=∣∇f(x)∣⋅∣u∣⋅cos(θ)=∣∇f(x)∣⋅cos(θ)\text{D}_{\boldsymbol{u}} f(\boldsymbol{x}) = |\nabla f(\boldsymbol{x})| \cdot |\boldsymbol{u}| \cdot \text{cos} (\theta) = |\nabla f(\boldsymbol{x})| \cdot \text{cos} (\theta)Duf(x)=f(x)ucos(θ)=f(x)cos(θ), 其中θ\thetaθ为梯度∇f(x)\nabla f(\boldsymbol{x})f(x)和单位向量u\boldsymbol{u}u之间的夹角,当θ=π\theta = \piθ=π时,cos(θ)\text{cos}(\theta)cos(θ)取得最小值−1-11。因此,当u\boldsymbol{u}u在梯度方向∇f(x)\nabla f(\boldsymbol{x})f(x)的相反方向时,方向导数Duf(x)\text{D}_{\boldsymbol{u}} f(\boldsymbol{x})Duf(x)被最小化。因此,我们可能通过梯度下降算法来不断降低目标函数fff的值:

x←x−η∇f(x).\boldsymbol{x} \leftarrow \boldsymbol{x} - \eta \nabla f(\boldsymbol{x}).xxηf(x).

同样,其中η\etaη(取正数)称作学习率。

下面我们构造一个目标函数

  • 输入为二维向量x=[x1,x2]⊤\boldsymbol{x} = [x_1, x_2]^\topx=[x1,x2]
  • 输出为标量
  • f(x)=x12+2x22f(\boldsymbol{x})=x_1^2+2x_2^2f(x)=x12+2x22

那么,梯度∇f(x)=[2x1,4x2]⊤\nabla f(\boldsymbol{x}) = [2x_1, 4x_2]^\topf(x)=[2x1,4x2]。我们将观察梯度下降从初始位置[−5,−2][-5,-2][5,2]开始对自变量x\boldsymbol{x}x的迭代轨迹。

先定义两个辅助函数,第一个函数使用给定的自变量更新函数,从初始位置[−5,−2][-5,-2][5,2]开始迭代自变量x\boldsymbol{x}x共20次,第二个函数对自变量x\boldsymbol{x}x的迭代轨迹进行可视化。

def train_2d(trainer):  x1, x2, s1, s2 = -5, -2, 0, 0  # s1和s2是自变量状态,本章后续几节会使用results = [(x1, x2)]for i in range(20):x1, x2, s1, s2 = trainer(x1, x2, s1, s2)results.append((x1, x2))print('epoch %d, x1 %f, x2 %f' % (i + 1, x1, x2))return resultsdef show_trace_2d(f, results):  plt.plot(*zip(*results), '-o', color='#ff7f0e')x1, x2 = np.meshgrid(np.arange(-5.5, 1.0, 0.1), np.arange(-3.0, 1.0, 0.1))plt.contour(x1, x2, f(x1, x2), colors='#1f77b4')plt.xlabel('x1')plt.ylabel('x2')

然后,观察学习率为0.10.1时自变量的迭代轨迹。使用梯度下降对自变量xx迭代20次后,可见最终xx的值较接近最优解[0,0][0,0]。

eta = 0.1def f_2d(x1, x2):  # 目标函数return x1 ** 2 + 2 * x2 ** 2def gd_2d(x1, x2, s1, s2):return (x1 - eta * 2 * x1, x2 - eta * 4 * x2, 0, 0)show_trace_2d(f_2d, train_2d(gd_2d))

随机梯度下降

在深度学习里,目标函数通常是训练数据集中有关各个样本的损失函数的平均。设fi(x)f_i(\boldsymbol{x})fi(x)是有关索引为iii的训练数据样本的损失函数,nnn是训练数据样本数,x\boldsymbol{x}x是模型的参数向量,那么目标函数定义为

f(x)=1n∑i=1nfi(x).f(\boldsymbol{x}) = \frac{1}{n} \sum_{i = 1}^n f_i(\boldsymbol{x}).f(x)=n1i=1nfi(x).

目标函数在x\boldsymbol{x}x处的梯度计算为

∇f(x)=1n∑i=1n∇fi(x).\nabla f(\boldsymbol{x}) = \frac{1}{n} \sum_{i = 1}^n \nabla f_i(\boldsymbol{x}).f(x)=n1i=1nfi(x).

如果使用梯度下降,每次自变量迭代的计算开销为O(n)\mathcal{O}(n)O(n),它随着nnn线性增长。因此,当训练数据样本数很大时,梯度下降每次迭代的计算开销很高。

随机梯度下降(stochastic gradient descent,SGD)减少了每次迭代的计算开销。在随机梯度下降的每次迭代中,我们随机均匀采样的一个样本索引i∈1,…,ni\in{1,\ldots,n}i1,,n,并计算梯度∇fi(x)\nabla f_i(\boldsymbol{x})fi(x)来迭代x\boldsymbol{x}x

x←x−η∇fi(x).\boldsymbol{x} \leftarrow \boldsymbol{x} - \eta \nabla f_i(\boldsymbol{x}).xxηfi(x).

这里η\etaη同样是学习率。可以看到每次迭代的计算开销从梯度下降的O(n)\mathcal{O}(n)O(n)降到了常数O(1)\mathcal{O}(1)O(1)。值得强调的是,随机梯度∇fi(x)\nabla f_i(\boldsymbol{x})fi(x)是对梯度∇f(x)\nabla f(\boldsymbol{x})f(x)的无偏估计:

Ei∇fi(x)=1n∑i=1n∇fi(x)=∇f(x).E_i \nabla f_i(\boldsymbol{x}) = \frac{1}{n} \sum_{i = 1}^n \nabla f_i(\boldsymbol{x}) = \nabla f(\boldsymbol{x}).Eifi(x)=n1i=1nfi(x)=f(x).

这意味着,平均来说,随机梯度是对梯度的一个良好的估计。

下面我们通过在梯度中添加均值为0的随机噪声来模拟随机梯度下降,以此来比较它与梯度下降的区别。

def sgd_2d(x1, x2, s1, s2):return (x1 - eta * (2 * x1 + np.random.normal(0.1)),x2 - eta * (4 * x2 + np.random.normal(0.1)), 0, 0)show_trace_2d(f_2d, train_2d(sgd_2d))

随机梯度下降中自变量的迭代轨迹相对于梯度下降中的来说更为曲折。这是由于实验所添加的噪声使模拟的随机梯度的准确度下降。在实际中,这些噪声通常指训练数据集中的无意义的干扰

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小批量随机梯度下降

小批量随机梯度下降 在每一次迭代中,梯度下降使用整个训练数据集来计算梯度,因此它有时也被称为批量梯度下降(batch gradient descent)。 随机梯度下降在每次迭代中只随机采样一个样本来计算梯度。可以在每轮迭代中随机均匀采样…

动量法解决梯度下降的一些问题

动量法 目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向,因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变…

深度学习AdaGrad算法

AdaGrad算法 在一般的优化算法中,目标函数自变量的每一个元素在相同时间步都使用同一个学习率来自我迭代。 例如,假设目标函数为fff,自变量为一个二维向量[x1,x2]⊤[x_1, x_2]^\top[x1​,x2​]⊤,该向量中每一个元素在迭代时都使…

深度学习优化算法:RMSProp算法

RMSProp算法 在AdaGrad算法中,因为调整学习率时分母上的变量st\boldsymbol{s}_tst​一直在累加按元素平方的小批量随机梯度,所以目标函数自变量每个元素的学习率在迭代过程中一直在降低(或不变)。因此,当学习率在迭代…

深度学习优化算法-AdaDelta算法

AdaDelta算法 除了RMSProp算法以外,另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进 [1]。 不一样的是,AdaDelta算法没有学习率这个超参数。 它通过使用有关自变量更新量平方的指数加权移动平均的项来替代…

深度学习优化算法-Adam算法

Adam算法 Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。Adam算法可以看做是RMSProp算法与动量法的结合。 算法内容 Adam算法使用了动量变量vt\boldsymbol{v}_tvt​和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量st\boldsymbol{s}_…

深度学习-计算机视觉--图像增广

图像增广 大规模数据集是成功应用深度神经网络的前提。图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。 图像增广的另一种解释是,随机改…

pytorch深度学习-微调(fine tuning)

微调(fine tuning) 首先举一个例子,假设我们想从图像中识别出不同种类的椅子,然后将购买链接推荐给用户。一种可能的方法是先找出100种常见的椅子,为每种椅子拍摄1,000张不同角度的图像,然后在收集到的图像…

c语言封闭曲线分割平面_高手的平面课堂:8种常用的设计排版方式,告别通宵加班...

重复、对比、对齐以及亲密性是传统平面排版的四大原则,即将元素重复运用(包括颜色、形状、材质、字体、空间关系等)以增加画面的条理性和整体性;避免页面上的元素形态与关系构建过于相似;画面上的每一元素都应该与另一个元素存在某种视觉联系…

我的世界java版和基岩版对比_基岩版Beta1.11.0.1发布

本帖来自好游快爆-我的世界精选推荐原帖作者:好游快爆用户3302482我的世界基岩版1.11.0.1测试版发布了,Minecraft基岩版1.11仍未发布,1.11.0.1为测试版本,Beta版本可能不稳定,并不代表最终版本质量,请在加入测试版之前…

机器人电焊电流电压怎么调_【华光】HG1000型电焊机现场校准仪

机器简介HG-1000型电焊机现场校准仪是依据检定规程JJG124-2005《电流表、电压表、功率表和电阻表检定规程》、JJG(航天)38-1987《直流标准电流源检定规程》、JJG(航天)51-1999《交流标准电流源检定规程》的要求而设计的校准设备。主要用来校验各种用电焊机(如交流手…

循环机换变速箱油教程_变速箱油用循环机换还是重力换更好?一次讲清楚,新手司机学学...

现在换变速箱油有些只要几百块钱,有些要一两千,之所以差价这么大是因为这里面涉及到换变速箱油时用什么方法去换油的问题。目前比较常见换油法是重力换油法和循环换油法。重力换油法就跟平时换机油是一样的,把变速箱底部的螺丝拧开之后让油滴…

pytorch深度学习-机器视觉-目标检测和边界框简介

机器视觉之目标检测和边界框简介 在图像分类任务里,我们假设图像里只有一个主体目标,并关注如何识别该目标的类别。然而,很多时候图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体…

消防荷载楼板按弹性还是塑性计算_第二节 消防登高面、消防救援场地和灭火救援窗...

一、定义1、消防登高面:登高消防车能够靠近高层主体建筑,便于消防车作业和消防人员进入高层建筑进行抢救人员和扑救火灾的建筑立面称为该建筑的消防登高面,也称建筑的消防扑救面。2、消防救援场地:在高层建筑的消防登高面一侧&…

深度学习-词嵌入(word2vec)

词嵌入(word2vec) 自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。顾名思义,词向量是用来表示词的向量,也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌入&#xff0…

ggplot2箱式图两两比较_作图技巧024篇ggplot2在循环中的坑

“ggplot2在循环中的输出”生活科学哥-R语言科学 2020-12-23 8:28ggplot2用过之后,你肯定会爱上它;结合一些不错的包,可以得到非常有展现力的图片,但是呢,有时也会碰到一些奇怪的情况。今天来们来看看,其中…

character-level OCR之Character Region Awareness for Text Detection(CRAFT) 论文阅读

Character Region Awareness for Text Detection 论文阅读 论文地址(arXiv) ,pytorch版本代码地址 最近在看一些OCR的问题,CRAFT是在场景OCR中效果比较好的模型,记录一下论文的阅读 已有的文本检测工作大致如下: 基于回归的文…

c# wpf 面试_【远程面试】九强通信 | 九洲电器集团全资子公司

成都IT内推圈成立于2016年,专注成都IT互联网领域的招聘与求职;覆盖精准IT人群10W,通过内推圈推荐且已入职人数超过5000,合作公司均系成都知名或靠谱公司.此公众号每天7:30AM准时推送当天职位详情,敬请关注并置顶!岗位投递一、登陆内推圈官网: www.itneituiquan.com,…

ViT(Vision Transformer)学习

ViT(Vison Transformer)学习 Paper:An image is worth 1616 words: transformers for image recognition at scale. In ICLR, 2021. Transformer 在 NLP领域大放异彩,并且随着模型和数据集的不断增长,仍然没有表现出饱和的迹象。这使得使用更大规模的数…

cpri带宽不足的解决方法_u盘容量不足怎么办 u盘容量不足解决方法【介绍】

我们在使用u盘的时候总能碰到各种各样的问题,其中u盘容量不足问题也是神烦,很多时候打开并没有发现有文件存在,但是在你存文件的时候又被提示u盘容量不足无法操作,关于这个问题u启动通过整理和大家一起分享下解决办法。1、u盘里的…