airfoil4755 下载

链接:https://pan.baidu.com/s/1YEtNjJ0_G9eeH6A6vHXhnA

提取码:dwjq

梯度下降

Boyd & Vandenberghe, 2004

  1. %matplotlib inline
  2. import numpy as np
  3. import torch
  4. import time
  5. from torch import nn, optim
  6. import math
  7. import sys
  8. sys.path.append('/home/kesci/input')
  9. import d2lzh1981 as d2l

一维梯度下降

证明:沿梯度反方向移动自变量可以减小函数值

泰勒展开:

f(x+ϵ)=f(x)+ϵf′(x)+O(ϵ2)
f(x+\epsilon)=f(x)+\epsilon f^{\prime}(x)+\mathcal{O}\left(\epsilon^{2}\right)
f(x+ϵ)=f(x)+ϵf′(x)+O(ϵ2)

代入沿梯度方向的移动量 ηf′(x)\eta f^{\prime}(x)ηf′(x):

f(x−ηf′(x))=f(x)−ηf′2(x)+O(η2f′2(x))
f\left(x-\eta f^{\prime}(x)\right)=f(x)-\eta f^{\prime 2}(x)+\mathcal{O}\left(\eta^{2} f^{\prime 2}(x)\right)
f(x−ηf′(x))=f(x)−ηf′2(x)+O(η2f′2(x))

f(x−ηf′(x))≲f(x)
f\left(x-\eta f^{\prime}(x)\right) \lesssim f(x)
f(x−ηf′(x))≲f(x)

x←x−ηf′(x)
x \leftarrow x-\eta f^{\prime}(x)
x←x−ηf′(x)

e.g.

f(x)=x2
f(x) = x^2
f(x)=x2

  1. def f(x):
  2. return x**2 # Objective function
  3. def gradf(x):
  4. return 2 * x # Its derivative
  5. def gd(eta):
  6. x = 10
  7. results = [x]
  8. for i in range(10):
  9. x -= eta * gradf(x)
  10. results.append(x)
  11. print('epoch 10, x:', x)
  12. return results
  13. res = gd(0.2)
  1. epoch 10, x: 0.06046617599999997
  1. def show_trace(res):
  2. n = max(abs(min(res)), abs(max(res)))
  3. f_line = np.arange(-n, n, 0.01)
  4. d2l.set_figsize((3.5, 2.5))
  5. d2l.plt.plot(f_line, [f(x) for x in f_line],'-')
  6. d2l.plt.plot(res, [f(x) for x in res],'-o')
  7. d2l.plt.xlabel('x')
  8. d2l.plt.ylabel('f(x)')
  9. show_trace(res)

学习率

  1. show_trace(gd(0.05))
  1. epoch 10, x: 3.4867844009999995

  1. show_trace(gd(1.1))
  1. epoch 10, x: 61.917364224000096

局部极小值

e.g.

f(x)=xcos⁡cx
f(x) = x\cos cx
f(x)=xcoscx

  1. c = 0.15 * np.pi
  2. def f(x):
  3. return x * np.cos(c * x)
  4. def gradf(x):
  5. return np.cos(c * x) - c * x * np.sin(c * x)
  6. show_trace(gd(2))
  1. epoch 10, x: -1.528165927635083

多维梯度下降

∇f(x)=[∂f(x)∂x1,∂f(x)∂x2,…,∂f(x)∂xd]⊤
\nabla f(\mathbf{x})=\left[\frac{\partial f(\mathbf{x})}{\partial x_{1}}, \frac{\partial f(\mathbf{x})}{\partial x_{2}}, \dots, \frac{\partial f(\mathbf{x})}{\partial x_{d}}\right]^{\top}
∇f(x)=[∂x1​∂f(x)​,∂x2​∂f(x)​,…,∂xd​∂f(x)​]⊤

f(x+ϵ)=f(x)+ϵ⊤∇f(x)+O(∥ϵ∥2)
f(\mathbf{x}+\epsilon)=f(\mathbf{x})+\epsilon^{\top} \nabla f(\mathbf{x})+\mathcal{O}\left(\|\epsilon\|^{2}\right)
f(x+ϵ)=f(x)+ϵ⊤∇f(x)+O(∥ϵ∥2)

x←x−η∇f(x)
\mathbf{x} \leftarrow \mathbf{x}-\eta \nabla f(\mathbf{x})
x←x−η∇f(x)

  1. def train_2d(trainer, steps=20):
  2. x1, x2 = -5, -2
  3. results = [(x1, x2)]
  4. for i in range(steps):
  5. x1, x2 = trainer(x1, x2)
  6. results.append((x1, x2))
  7. print('epoch %d, x1 %f, x2 %f' % (i + 1, x1, x2))
  8. return results
  9. def show_trace_2d(f, results):
  10. d2l.plt.plot(*zip(*results), '-o', color='#ff7f0e')
  11. x1, x2 = np.meshgrid(np.arange(-5.5, 1.0, 0.1), np.arange(-3.0, 1.0, 0.1))
  12. d2l.plt.contour(x1, x2, f(x1, x2), colors='#1f77b4')
  13. d2l.plt.xlabel('x1')
  14. d2l.plt.ylabel('x2')

f(x)=x12+2x22
f(x) = x_1^2 + 2x_2^2
f(x)=x12​+2x22​

  1. eta = 0.1
  2. def f_2d(x1, x2): # 目标函数
  3. return x1 ** 2 + 2 * x2 ** 2
  4. def gd_2d(x1, x2):
  5. return (x1 - eta * 2 * x1, x2 - eta * 4 * x2)
  6. show_trace_2d(f_2d, train_2d(gd_2d))
  1. epoch 20, x1 -0.057646, x2 -0.000073

自适应方法

牛顿法

在 x+ϵx + \epsilonx+ϵ 处泰勒展开:

f(x+ϵ)=f(x)+ϵ⊤∇f(x)+12ϵ⊤∇∇⊤f(x)ϵ+O(∥ϵ∥3)
f(\mathbf{x}+\epsilon)=f(\mathbf{x})+\epsilon^{\top} \nabla f(\mathbf{x})+\frac{1}{2} \epsilon^{\top} \nabla \nabla^{\top} f(\mathbf{x}) \epsilon+\mathcal{O}\left(\|\epsilon\|^{3}\right)
f(x+ϵ)=f(x)+ϵ⊤∇f(x)+21​ϵ⊤∇∇⊤f(x)ϵ+O(∥ϵ∥3)

最小值点处满足: ∇f(x)=0\nabla f(\mathbf{x})=0∇f(x)=0, 即我们希望 ∇f(x+ϵ)=0\nabla f(\mathbf{x} + \epsilon)=0∇f(x+ϵ)=0, 对上式关于 ϵ\epsilonϵ 求导,忽略高阶无穷小,有:

∇f(x)+Hfϵ=0 and hence ϵ=−Hf−1∇f(x)
\nabla f(\mathbf{x})+\boldsymbol{H}_{f} \boldsymbol{\epsilon}=0 \text { and hence } \epsilon=-\boldsymbol{H}_{f}^{-1} \nabla f(\mathbf{x})
∇f(x)+Hf​ϵ=0 and hence ϵ=−Hf−1​∇f(x)

  1. c = 0.5
  2. def f(x):
  3. return np.cosh(c * x) # Objective
  4. def gradf(x):
  5. return c * np.sinh(c * x) # Derivative
  6. def hessf(x):
  7. return c**2 * np.cosh(c * x) # Hessian
  8. # Hide learning rate for now
  9. def newton(eta=1):
  10. x = 10
  11. results = [x]
  12. for i in range(10):
  13. x -= eta * gradf(x) / hessf(x)
  14. results.append(x)
  15. print('epoch 10, x:', x)
  16. return results
  17. show_trace(newton())
  1. epoch 10, x: 0.0

  1. c = 0.15 * np.pi
  2. def f(x):
  3. return x * np.cos(c * x)
  4. def gradf(x):
  5. return np.cos(c * x) - c * x * np.sin(c * x)
  6. def hessf(x):
  7. return - 2 * c * np.sin(c * x) - x * c**2 * np.cos(c * x)
  8. show_trace(newton())
  1. epoch 10, x: 26.83413291324767

  1. show_trace(newton(0.5))
  1. epoch 10, x: 7.269860168684531

收敛性分析

只考虑在函数为凸函数, 且最小值点上 f′′(x∗)>0f''(x^*) > 0f′′(x∗)>0 时的收敛速度:

令 xkx_kxk​ 为第 kkk 次迭代后 xxx 的值, ek:=xk−x∗e_{k}:=x_{k}-x^{*}ek​:=xk​−x∗ 表示 xkx_kxk​ 到最小值点 x∗x^{*}x∗ 的距离,由 f′(x∗)=0f'(x^{*}) = 0f′(x∗)=0:

0=f′(xk−ek)=f′(xk)−ekf′′(xk)+12ek2f′′′(ξk)for some ξk∈[xk−ek,xk]
0=f^{\prime}\left(x_{k}-e_{k}\right)=f^{\prime}\left(x_{k}\right)-e_{k} f^{\prime \prime}\left(x_{k}\right)+\frac{1}{2} e_{k}^{2} f^{\prime \prime \prime}\left(\xi_{k}\right) \text{for some } \xi_{k} \in\left[x_{k}-e_{k}, x_{k}\right]
0=f′(xk​−ek​)=f′(xk​)−ek​f′′(xk​)+21​ek2​f′′′(ξk​)for some ξk​∈[xk​−ek​,xk​]

两边除以 f′′(xk)f''(x_k)f′′(xk​), 有:

ek−f′(xk)/f′′(xk)=12ek2f′′′(ξk)/f′′(xk)
e_{k}-f^{\prime}\left(x_{k}\right) / f^{\prime \prime}\left(x_{k}\right)=\frac{1}{2} e_{k}^{2} f^{\prime \prime \prime}\left(\xi_{k}\right) / f^{\prime \prime}\left(x_{k}\right)
ek​−f′(xk​)/f′′(xk​)=21​ek2​f′′′(ξk​)/f′′(xk​)

代入更新方程 xk+1=xk−f′(xk)/f′′(xk)x_{k+1} = x_{k} - f^{\prime}\left(x_{k}\right) / f^{\prime \prime}\left(x_{k}\right)xk+1​=xk​−f′(xk​)/f′′(xk​), 得到:

xk−x∗−f′(xk)/f′′(xk)=12ek2f′′′(ξk)/f′′(xk)
x_k - x^{*} - f^{\prime}\left(x_{k}\right) / f^{\prime \prime}\left(x_{k}\right) =\frac{1}{2} e_{k}^{2} f^{\prime \prime \prime}\left(\xi_{k}\right) / f^{\prime \prime}\left(x_{k}\right)
xk​−x∗−f′(xk​)/f′′(xk​)=21​ek2​f′′′(ξk​)/f′′(xk​)

xk+1−x∗=ek+1=12ek2f′′′(ξk)/f′′(xk)
x_{k+1} - x^{*} = e_{k+1} = \frac{1}{2} e_{k}^{2} f^{\prime \prime \prime}\left(\xi_{k}\right) / f^{\prime \prime}\left(x_{k}\right)
xk+1​−x∗=ek+1​=21​ek2​f′′′(ξk​)/f′′(xk​)

当 12f′′′(ξk)/f′′(xk)≤c\frac{1}{2} f^{\prime \prime \prime}\left(\xi_{k}\right) / f^{\prime \prime}\left(x_{k}\right) \leq c21​f′′′(ξk​)/f′′(xk​)≤c 时,有:

ek+1≤cek2
e_{k+1} \leq c e_{k}^{2}
ek+1​≤cek2​

预处理 (Heissan阵辅助梯度下降)

x←x−ηdiag⁡(Hf)−1∇x
\mathbf{x} \leftarrow \mathbf{x}-\eta \operatorname{diag}\left(H_{f}\right)^{-1} \nabla \mathbf{x}
x←x−ηdiag(Hf​)−1∇x

梯度下降与线性搜索(共轭梯度法)

随机梯度下降

随机梯度下降参数更新

对于有 nnn 个样本对训练数据集,设 fi(x)f_i(x)fi​(x) 是第 iii 个样本的损失函数, 则目标函数为:

f(x)=1n∑i=1nfi(x)
f(\mathbf{x})=\frac{1}{n} \sum_{i=1}^{n} f_{i}(\mathbf{x})
f(x)=n1​i=1∑n​fi​(x)

其梯度为:

∇f(x)=1n∑i=1n∇fi(x)
\nabla f(\mathbf{x})=\frac{1}{n} \sum_{i=1}^{n} \nabla f_{i}(\mathbf{x})
∇f(x)=n1​i=1∑n​∇fi​(x)

使用该梯度的一次更新的时间复杂度为 O(n)\mathcal{O}(n)O(n)

随机梯度下降更新公式 O(1)\mathcal{O}(1)O(1):

x←x−η∇fi(x)
\mathbf{x} \leftarrow \mathbf{x}-\eta \nabla f_{i}(\mathbf{x})
x←x−η∇fi​(x)

且有:

Ei∇fi(x)=1n∑i=1n∇fi(x)=∇f(x)
\mathbb{E}_{i} \nabla f_{i}(\mathbf{x})=\frac{1}{n} \sum_{i=1}^{n} \nabla f_{i}(\mathbf{x})=\nabla f(\mathbf{x})
Ei​∇fi​(x)=n1​i=1∑n​∇fi​(x)=∇f(x)

e.g.

f(x1,x2)=x12+2x22
f(x_1, x_2) = x_1^2 + 2 x_2^2
f(x1​,x2​)=x12​+2x22​

  1. def f(x1, x2):
  2. return x1 ** 2 + 2 * x2 ** 2 # Objective
  3. def gradf(x1, x2):
  4. return (2 * x1, 4 * x2) # Gradient
  5. def sgd(x1, x2): # Simulate noisy gradient
  6. global lr # Learning rate scheduler
  7. (g1, g2) = gradf(x1, x2) # Compute gradient
  8. (g1, g2) = (g1 + np.random.normal(0.1), g2 + np.random.normal(0.1))
  9. eta_t = eta * lr() # Learning rate at time t
  10. return (x1 - eta_t * g1, x2 - eta_t * g2) # Update variables
  11. eta = 0.1
  12. lr = (lambda: 1) # Constant learning rate
  13. show_trace_2d(f, train_2d(sgd, steps=50))
  1. epoch 50, x1 -0.027566, x2 0.137605

动态学习率

η(t)=ηi if ti≤t≤ti+1 piecewise constant η(t)=η0⋅e−λt exponential η(t)=η0⋅(βt+1)−α polynomial 
\begin{array}{ll}{\eta(t)=\eta_{i} \text { if } t_{i} \leq t \leq t_{i+1}} & {\text { piecewise constant }} \\ {\eta(t)=\eta_{0} \cdot e^{-\lambda t}} & {\text { exponential }} \\ {\eta(t)=\eta_{0} \cdot(\beta t+1)^{-\alpha}} & {\text { polynomial }}\end{array}
η(t)=ηi​ if ti​≤t≤ti+1​η(t)=η0​⋅e−λtη(t)=η0​⋅(βt+1)−α​ piecewise constant  exponential  polynomial ​

  1. def exponential():
  2. global ctr
  3. ctr += 1
  4. return math.exp(-0.1 * ctr)
  5. ctr = 1
  6. lr = exponential # Set up learning rate
  7. show_trace_2d(f, train_2d(sgd, steps=1000))
  1. epoch 1000, x1 -0.677947, x2 -0.089379

  1. def polynomial():
  2. global ctr
  3. ctr += 1
  4. return (1 + 0.1 * ctr)**(-0.5)
  5. ctr = 1
  6. lr = polynomial # Set up learning rate
  7. show_trace_2d(f, train_2d(sgd, steps=50))
  1. epoch 50, x1 -0.095244, x2 -0.041674

小批量随机梯度下降

读取数据

读取数据

  1. def get_data_ch7(): # 本函数已保存在d2lzh_pytorch包中方便以后使用
  2. data = np.genfromtxt('/home/kesci/input/airfoil4755/airfoil_self_noise.dat', delimiter='\t')
  3. data = (data - data.mean(axis=0)) / data.std(axis=0) # 标准化
  4. return torch.tensor(data[:1500, :-1], dtype=torch.float32), \
  5. torch.tensor(data[:1500, -1], dtype=torch.float32) # 前1500个样本(每个样本5个特征)
  6. features, labels = get_data_ch7()
  7. features.shape
  1. torch.Size([1500, 5])
  1. import pandas as pd
  2. df = pd.read_csv('/home/kesci/input/airfoil4755/airfoil_self_noise.dat', delimiter='\t', header=None)
  3. df.head(10)
0 1 2 3 4 5
0 800 0.0 0.3048 71.3 0.002663 126.201
1 1000 0.0 0.3048 71.3 0.002663 125.201
2 1250 0.0 0.3048 71.3 0.002663 125.951
3 1600 0.0 0.3048 71.3 0.002663 127.591
4 2000 0.0 0.3048 71.3 0.002663 127.461
5 2500 0.0 0.3048 71.3 0.002663 125.571
6 3150 0.0 0.3048 71.3 0.002663 125.201
7 4000 0.0 0.3048 71.3 0.002663 123.061
8 5000 0.0 0.3048 71.3 0.002663 121.301
9 6300 0.0 0.3048 71.3 0.002663 119.541

从零开始实现

  1. def sgd(params, states, hyperparams):
  2. for p in params:
  3. p.data -= hyperparams['lr'] * p.grad.data
  1. # 本函数已保存在d2lzh_pytorch包中方便以后使用
  2. def train_ch7(optimizer_fn, states, hyperparams, features, labels,
  3. batch_size=10, num_epochs=2):
  4. # 初始化模型
  5. net, loss = d2l.linreg, d2l.squared_loss
  6. w = torch.nn.Parameter(torch.tensor(np.random.normal(0, 0.01, size=(features.shape[1], 1)), dtype=torch.float32),
  7. requires_grad=True)
  8. b = torch.nn.Parameter(torch.zeros(1, dtype=torch.float32), requires_grad=True)
  9. def eval_loss():
  10. return loss(net(features, w, b), labels).mean().item()
  11. ls = [eval_loss()]
  12. data_iter = torch.utils.data.DataLoader(
  13. torch.utils.data.TensorDataset(features, labels), batch_size, shuffle=True)
  14. for _ in range(num_epochs):
  15. start = time.time()
  16. for batch_i, (X, y) in enumerate(data_iter):
  17. l = loss(net(X, w, b), y).mean() # 使用平均损失
  18. # 梯度清零
  19. if w.grad is not None:
  20. w.grad.data.zero_()
  21. b.grad.data.zero_()
  22. l.backward()
  23. optimizer_fn([w, b], states, hyperparams) # 迭代模型参数
  24. if (batch_i + 1) * batch_size % 100 == 0:
  25. ls.append(eval_loss()) # 每100个样本记录下当前训练误差
  26. # 打印结果和作图
  27. print('loss: %f, %f sec per epoch' % (ls[-1], time.time() - start))
  28. d2l.set_figsize()
  29. d2l.plt.plot(np.linspace(0, num_epochs, len(ls)), ls)
  30. d2l.plt.xlabel('epoch')
  31. d2l.plt.ylabel('loss')
  1. def train_sgd(lr, batch_size, num_epochs=2):
  2. train_ch7(sgd, None, {'lr': lr}, features, labels, batch_size, num_epochs)

对比

  1. train_sgd(1, 1500, 6)
  1. loss: 0.244373, 0.009881 sec per epoch

  1. train_sgd(0.005, 1)
  1. loss: 0.245968, 0.463836 sec per epoch

  1. train_sgd(0.05, 10)
  1. loss: 0.243900, 0.065017 sec per epoch

简洁实现

  1. # 本函数与原书不同的是这里第一个参数优化器函数而不是优化器的名字
  2. # 例如: optimizer_fn=torch.optim.SGD, optimizer_hyperparams={"lr": 0.05}
  3. def train_pytorch_ch7(optimizer_fn, optimizer_hyperparams, features, labels,
  4. batch_size=10, num_epochs=2):
  5. # 初始化模型
  6. net = nn.Sequential(
  7. nn.Linear(features.shape[-1], 1)
  8. )
  9. loss = nn.MSELoss()
  10. optimizer = optimizer_fn(net.parameters(), **optimizer_hyperparams)
  11. def eval_loss():
  12. return loss(net(features).view(-1), labels).item() / 2
  13. ls = [eval_loss()]
  14. data_iter = torch.utils.data.DataLoader(
  15. torch.utils.data.TensorDataset(features, labels), batch_size, shuffle=True)
  16. for _ in range(num_epochs):
  17. start = time.time()
  18. for batch_i, (X, y) in enumerate(data_iter):
  19. # 除以2是为了和train_ch7保持一致, 因为squared_loss中除了2
  20. l = loss(net(X).view(-1), y) / 2
  21. optimizer.zero_grad()
  22. l.backward()
  23. optimizer.step()
  24. if (batch_i + 1) * batch_size % 100 == 0:
  25. ls.append(eval_loss())
  26. # 打印结果和作图
  27. print('loss: %f, %f sec per epoch' % (ls[-1], time.time() - start))
  28. d2l.set_figsize()
  29. d2l.plt.plot(np.linspace(0, num_epochs, len(ls)), ls)
  30. d2l.plt.xlabel('epoch')
  31. d2l.plt.ylabel('loss')
  1. train_pytorch_ch7(optim.SGD, {"lr": 0.05}, features, labels, 10)
  1. loss: 0.243770, 0.047664 sec per epoch

L20 梯度下降、随机梯度下降和小批量梯度下降的更多相关文章

  1. 批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

      梯度下降法作为机器学习中较常使用的优化算法,其有着三种不同的形式:批量梯度下降(Batch Gradient Descent).随机梯度下降(Stochastic Gradient Descent ...

  2. 1. 批量梯度下降法BGD 2. 随机梯度下降法SGD 3. 小批量梯度下降法MBGD

    排版也是醉了见原文:http://www.cnblogs.com/maybe2030/p/5089753.html 在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度 ...

  3. 梯度下降GD,随机梯度下降SGD,小批量梯度下降MBGD

    阅读过程中的其他解释: Batch和miniBatch:(广义)离线和在线的不同

  4. NN优化方法对照:梯度下降、随机梯度下降和批量梯度下降

    1.前言 这几种方法呢都是在求最优解中常常出现的方法,主要是应用迭代的思想来逼近.在梯度下降算法中.都是环绕下面这个式子展开: 当中在上面的式子中hθ(x)代表.输入为x的时候的其当时θ參数下的输出值 ...

  5. Tensorflow细节-P84-梯度下降与批量梯度下降

    1.批量梯度下降 批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新.从数学上理解如下: 对应的目标函数(代价函数)即为: (1)对目标函数求偏导: (2)每次迭代对参数进 ...

  6. 【深度学习】线性回归(Linear Regression)——原理、均方损失、小批量随机梯度下降

    1. 线性回归 回归(regression)问题指一类为一个或多个自变量与因变量之间关系建模的方法,通常用来表示输入和输出之间的关系. 机器学习领域中多数问题都与预测相关,当我们想预测一个数值时,就会 ...

  7. 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比[转]

    梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正. 下面的h(x)是要拟 ...

  8. 【转】 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比

    梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正. 下面的h(x)是要拟 ...

  9. batch gradient descent(批量梯度下降) 和 stochastic gradient descent(随机梯度下降)

    批量梯度下降是一种对参数的update进行累积,然后批量更新的一种方式.用于在已知整个训练集时的一种训练方式,但对于大规模数据并不合适. 随机梯度下降是一种对参数随着样本训练,一个一个的及时updat ...

随机推荐

  1. 报错:Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'gender' at row 1

    我遇到这个错误是解决办法:我修改了对应的数据库字段的长度:原本我设置的是char型,但是存进去的是一个string型,结果就报了这个报了这个错误 下面就是数据库修改之后的结果. 以上都是我学习过程中遇 ...

  2. leetcode 签到 836. 矩形重叠

    836. 矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的 ...

  3. 基本的访问控制列表ACL配置

    摘要: 访问控制列表ACL (Access Control L ist)是由permit或 deny语句组成的一系列有顺序的规则集合,这些规则根据数据包的源地址.目的地址.源端口.目的端口等信息  来 ...

  4. 一些js 概念 整理

    1.原型链 prototype       这个属性 是一个指针,指向一个对象 这个对象 包含 所有实例共享的属性和方法,即这个原型对象是用来给实例共享属性和方法的.          而每个实例内部 ...

  5. Android初级控件

    Android初级控件 从今天开始就对Android进行正式的学习,首先先来学习一下初级的控件 1.TextView  文本框,用于显示文字,不可编辑. 常用属性 android:autoLink   ...

  6. python之道14

    看代码写结果: def wrapper(f): def inner(*args,**kwargs): print(111) ret = f(*args,**kwargs) print(222) ret ...

  7. 在Fedora中安装OpenCV-Python | 二

    目标 在本教程中 我们将学习在你的Fedora系统中设置OpenCV-Python.针对Fedora 18(64位)和Fedora 19(32位)进行以下步骤. 介绍 可以通过两种方式在Fedora中 ...

  8. TensorFlow v2.0的基本张量操作

    使用TensorFlow v2.0的基本张量操作 from __future__ import print_function import tensorflow as tf # 定义张量常量 a = ...

  9. 谷歌2019 学术指标发榜:CVPR首次进入Top 10,何恺明论文引用最高!

    [导读]今天,谷歌发布了2019最新版学术指标,对收录的会议和期刊的影响力进行排名.AI类的多个顶会进入榜单Top 100,CVPR更是进入前10,而何恺明的"深度残差网络"单篇引 ...

  10. SVN: Cleanup failed update报错 文件被锁定lock办法,cleanup 失效报错。

    按照如下办法即可解决: 下载文件链接: https://pan.baidu.com/s/1Ump1BFihbX8izyAA4by5dA 提取码: ftsd 复制这段内容后打开百度网盘手机App,操作更 ...