目录

  • 1. 指数衰减
  • 2. 分段常数衰减
  • 3. 自然指数衰减
  • 4. 多项式衰减
  • 5. 倒数衰减
  • 6. 余弦衰减
    • 6.1 标准余弦衰减
    • 6.2 重启余弦衰减
    • 6.3 线性余弦噪声
    • 6.4 噪声余弦衰减
  • Reference

  上文深度神经网络中各种优化算法原理及比较中介绍了深度学习中常见的梯度下降优化算法;其中,有一个重要的超参数——学习率\(\alpha\)需要在训练之前指定,学习率设定的重要性不言而喻:过小的学习率会降低网络优化的速度,增加训练时间;而过大的学习率则可能导致最后的结果不会收敛,或者在一个较大的范围内摆动;因此,在训练的过程中,根据训练的迭代次数调整学习率的大小,是非常有必要的;

  因此,本文主要介绍TensorFlow中如何使用学习率、TensorFlow中的几种学习率设置方式;文章中参考引用文献将不再具体文中说明,在文章末尾处会给出所有的引用文献链接;

  本主要主要介绍的学习率设置方式有:

  • 指数衰减: tf.train.exponential_decay()
  • 分段常数衰减: tf.train.piecewise_constant()
  • 自然指数衰减: tf.train.natural_exp_decay()
  • 多项式衰减tf.train.polynomial_decay()
  • 倒数衰减tf.train.inverse_time_decay()
  • 余弦衰减tf.train.cosine_decay()

1. 指数衰减

tf.train.exponential_decay(learning_rate,global_step, decay_steps, decay_rate,staircase=False, name=None):
参数 用法
learning_rate 初始学习率;
global_step 迭代次数;
decay_steps 衰减周期,当staircase=True时,学习率在\(decay\_steps\)内保持不变,即得到离散型学习率;
decay_rate 衰减率系数;
staircase 是否定义为离散型学习率,默认False
name 名称,默认ExponentialDecay

计算方式:

decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
# 如果staircase=True,则学习率会在得到离散值,每decay_steps迭代次数,更新一次;

示例:

# coding:utf-8
import matplotlib.pyplot as plt
import tensorflow as tfglobal_step = tf.Variable(0, name='global_step', trainable=False) # 迭代次数y = []
z = []
EPOCH = 200with tf.Session() as sess:sess.run(tf.global_variables_initializer())for global_step in range(EPOCH):# 阶梯型衰减learing_rate1 = tf.train.exponential_decay(learning_rate=0.5, global_step=global_step, decay_steps=10, decay_rate=0.9, staircase=True)# 标准指数型衰减learing_rate2 = tf.train.exponential_decay(learning_rate=0.5, global_step=global_step, decay_steps=10, decay_rate=0.9, staircase=False)lr1 = sess.run([learing_rate1])lr2 = sess.run([learing_rate2])y.append(lr1)z.append(lr2)x = range(EPOCH)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_ylim([0, 0.55])plt.plot(x, y, 'r-', linewidth=2)
plt.plot(x, z, 'g-', linewidth=2)
plt.title('exponential_decay')
ax.set_xlabel('step')
ax.set_ylabel('learing rate')
plt.legend(labels = ['staircase', 'continus'], loc = 'upper right')
plt.show()

2. 分段常数衰减

tf.train.piecewise_constant(x, boundaries, values, name=None):
参数 用法
x 相当于global_step,迭代次数;
boundaries 列表,表示分割的边界;
values 列表,分段学习率的取值;
name 名称,默认PiecewiseConstant

计算方式:

# parameter
global_step = tf.Variable(0, trainable=False)
boundaries = [100, 200]
values = [1.0, 0.5, 0.1]
# learning_rate
learning_rate = tf.train.piecewise_constant(global_step, boundaries, values)
# 解释
# 当global_step=[1, 100]时,learning_rate=1.0;
# 当global_step=[101, 200]时,learning_rate=0.5;
# 当global_step=[201, ~]时,learning_rate=0.1;

示例:

# coding:utf-8import matplotlib.pyplot as plt
import tensorflow as tfglobal_step = tf.Variable(0, name='global_step', trainable=False)
boundaries = [10, 20, 30]
learing_rates = [0.1, 0.07, 0.025, 0.0125]y = []
N = 40with tf.Session() as sess:sess.run(tf.global_variables_initializer())for global_step in range(N):learing_rate = tf.train.piecewise_constant(global_step, boundaries=boundaries, values=learing_rates)lr = sess.run([learing_rate])y.append(lr)x = range(N)
plt.plot(x, y, 'r-', linewidth=2)
plt.title('piecewise_constant')
plt.show()

3. 自然指数衰减

类似与指数衰减,同样与当前迭代次数相关,只不过以e为底;

tf.train.natural_exp_decay(learning_rate,global_step,decay_steps,decay_rate,staircase=False,name=None
)
参数 用法
learning_rate 初始学习率;
global_step 迭代次数;
decay_steps 衰减周期,当staircase=True时,学习率在\(decay\_steps\)内保持不变,即得到离散型学习率;
decay_rate 衰减率系数;
staircase 是否定义为离散型学习率,默认False
name 名称,默认ExponentialTimeDecay

计算方式:

decayed_learning_rate = learning_rate * exp(-decay_rate * global_step)
# 如果staircase=True,则学习率会在得到离散值,每decay_steps迭代次数,更新一次;

示例:

# coding:utf-8import matplotlib.pyplot as plt
import tensorflow as tfglobal_step = tf.Variable(0, name='global_step', trainable=False)y = []
z = []
w = []
m = []
EPOCH = 200with tf.Session() as sess:sess.run(tf.global_variables_initializer())for global_step in range(EPOCH):# 阶梯型衰减learing_rate1 = tf.train.natural_exp_decay(learning_rate=0.5, global_step=global_step, decay_steps=10, decay_rate=0.9, staircase=True)# 标准指数型衰减learing_rate2 = tf.train.natural_exp_decay(learning_rate=0.5, global_step=global_step, decay_steps=10, decay_rate=0.9, staircase=False)# 阶梯型指数衰减learing_rate3 = tf.train.exponential_decay(learning_rate=0.5, global_step=global_step, decay_steps=10, decay_rate=0.9, staircase=True)# 标准指数衰减learing_rate4 = tf.train.exponential_decay(learning_rate=0.5, global_step=global_step, decay_steps=10, decay_rate=0.9, staircase=False)lr1 = sess.run([learing_rate1])lr2 = sess.run([learing_rate2])lr3 = sess.run([learing_rate3])lr4 = sess.run([learing_rate4])y.append(lr1)z.append(lr2)w.append(lr3)m.append(lr4)x = range(EPOCH)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_ylim([0, 0.55])plt.plot(x, y, 'r-', linewidth=2)
plt.plot(x, z, 'g-', linewidth=2)
plt.plot(x, w, 'r--', linewidth=2)
plt.plot(x, m, 'g--', linewidth=2)plt.title('natural_exp_decay')
ax.set_xlabel('step')
ax.set_ylabel('learing rate')
plt.legend(labels = ['natural_staircase', 'natural_continus', 'staircase', 'continus'], loc = 'upper right')
plt.show()

可以看到自然指数衰减对学习率的衰减程度远大于一般的指数衰减;

4. 多项式衰减

tf.train.polynomial_decay(learning_rate, global_step, decay_steps,end_learning_rate=0.0001, power=1.0,cycle=False, name=None):
参数 用法
learning_rate 初始学习率;
global_step 迭代次数;
decay_steps 衰减周期;
end_learning_rate 最小学习率,默认0.0001;
power 多项式的幂,默认1;
cycle bool,表示达到最低学习率时,是否升高再降低,默认False
name 名称,默认PolynomialDecay

计算方式:

# 如果cycle=False
global_step = min(global_step, decay_steps)
decayed_learning_rate = (learning_rate - end_learning_rate) *(1 - global_step / decay_steps) ^ (power) +end_learning_rate
# 如果cycle=True
decay_steps = decay_steps * ceil(global_step / decay_steps)
decayed_learning_rate = (learning_rate - end_learning_rate) *(1 - global_step / decay_steps) ^ (power) +end_learning_rate

示例:

# coding:utf-8
import matplotlib.pyplot as plt
import tensorflow as tfy = []
z = []
EPOCH = 200global_step = tf.Variable(0, name='global_step', trainable=False)with tf.Session() as sess:sess.run(tf.global_variables_initializer())for global_step in range(EPOCH):# cycle=Falselearing_rate1 = tf.train.polynomial_decay(learning_rate=0.1, global_step=global_step, decay_steps=50,end_learning_rate=0.01, power=0.5, cycle=False)# cycle=Truelearing_rate2 = tf.train.polynomial_decay(learning_rate=0.1, global_step=global_step, decay_steps=50,end_learning_rate=0.01, power=0.5, cycle=True)lr1 = sess.run([learing_rate1])lr2 = sess.run([learing_rate2])y.append(lr1)z.append(lr2)x = range(EPOCH)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.plot(x, z, 'g-', linewidth=2)
plt.plot(x, y, 'r--', linewidth=2)
plt.title('polynomial_decay')
ax.set_xlabel('step')
ax.set_ylabel('learing rate')
plt.legend(labels=['cycle=True', 'cycle=False'], loc='uppper right')
plt.show()

可以看到学习率在decay_steps=50迭代次数后到达最小值;同时,当cycle=False时,学习率达到预设的最小值后,就保持最小值不再变化;当cycle=True时,学习率将会瞬间增大,再降低;

多项式衰减中设置学习率可以往复升降的目的:时为了防止在神经网络训练后期由于学习率过小,导致网络参数陷入局部最优,将学习率升高,有可能使其跳出局部最优;

5. 倒数衰减

inverse_time_decay(learning_rate,global_step,decay_steps,decay_rate,staircase=False,name=None):
参数 用法
learning_rate 初始学习率;
global_step 迭代次数;
decay_steps 衰减周期;
decay_rate 学习率衰减参数;
staircase 是否得到离散型学习率,默认False
name 名称;默认InverseTimeDecay

计算方式:

# 如果staircase=False,即得到连续型衰减学习率;
decayed_learning_rate = learning_rate / (1 + decay_rate * global_step / decay_step)# 如果staircase=True,即得到离散型衰减学习率;
decayed_learning_rate = learning_rate / (1 + decay_rate * floor(global_step / decay_step))

示例:

# coding:utf-8import matplotlib.pyplot as plt
import tensorflow as tfy = []
z = []
EPOCH = 200
global_step = tf.Variable(0, name='global_step', trainable=False)with tf.Session() as sess:sess.run(tf.global_variables_initializer())for global_step in range(EPOCH):# 阶梯型衰减learing_rate1 = tf.train.inverse_time_decay(learning_rate=0.1, global_step=global_step, decay_steps=20,decay_rate=0.2, staircase=True)# 连续型衰减learing_rate2 = tf.train.inverse_time_decay(learning_rate=0.1, global_step=global_step, decay_steps=20,decay_rate=0.2, staircase=False)lr1 = sess.run([learing_rate1])lr2 = sess.run([learing_rate2])y.append(lr1)z.append(lr2)x = range(EPOCH)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.plot(x, z, 'r-', linewidth=2)
plt.plot(x, y, 'g-', linewidth=2)
plt.title('inverse_time_decay')
ax.set_xlabel('step')
ax.set_ylabel('learing rate')
plt.legend(labels=['continus', 'staircase'])
plt.show()

同样可以看到,随着迭代次数的增加,学习率在逐渐减小,同时减小的幅度也在降低;

6. 余弦衰减

之前使用TensorFlow的版本是1.4,没有学习率的余弦衰减;之后升级到了1.9版本,发现多了四个有关学习率余弦衰减的方法;下面将进行介绍:

6.1 标准余弦衰减

来源于:[Loshchilov & Hutter, ICLR2016], SGDR: Stochastic Gradient Descent with Warm Restarts. https://arxiv.org/abs/1608.03983

tf.train.cosine_decay(learning_rate, global_step, decay_steps, alpha=0.0, name=None):
参数 用法
learning_rate 初始学习率;
global_step 迭代次数;
decay_steps 衰减周期;
alpha 最小学习率,默认为0;
name 名称,默认CosineDecay

计算方式:

global_step = min(global_step, decay_steps)
cosine_decay = 0.5 * (1 + cos(pi * global_step / decay_steps))
decayed = (1 - alpha) * cosine_decay + alpha
decayed_learning_rate = learning_rate * decayed

示例:

# coding:utf-8
import matplotlib.pyplot as plt
import tensorflow as tfy = []
z = []
EPOCH = 200
global_step = tf.Variable(0, name='global_step', trainable=False)with tf.Session() as sess:sess.run(tf.global_variables_initializer())for global_step in range(EPOCH):# 余弦衰减learing_rate1 = tf.train.cosine_decay(learning_rate=0.1, global_step=global_step, decay_steps=50)learing_rate2 = tf.train.cosine_decay(learning_rate=0.1, global_step=global_step, decay_steps=100)lr1 = sess.run([learing_rate1])lr2 = sess.run([learing_rate2])y.append(lr1)z.append(lr2)x = range(EPOCH)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.plot(x, y, 'r-', linewidth=2)
plt.plot(x, z, 'b-', linewidth=2)
plt.title('cosine_decay')
ax.set_xlabel('step')
ax.set_ylabel('learing rate')
plt.legend(labels=['decay_steps=50', 'decay_steps=100'],z loc='upper right')
plt.show()

6.2 重启余弦衰减

来源于:[Loshchilov & Hutter, ICLR2016], SGDR: Stochastic Gradient Descent with Warm Restarts. https://arxiv.org/abs/1608.03983

tf.train.cosine_decay_restarts(learning_rate,global_step,first_decay_steps,t_mul=2.0,m_mul=1.0,alpha=0.0,name=None):
参数 用法
learning_rate 初始学习率;
global_step 迭代次数;
first_decay_steps 衰减周期;
t_mul Used to derive the number of iterations in the i-th period
m_mul Used to derive the initial learning rate of the i-th period:
alpha 最小学习率,默认为0;
name 名称,默认SGDRDecay

示例:

# coding:utf-8
import matplotlib.pyplot as plt
import tensorflow as tfy = []
z = []
EPOCH = 100
global_step = tf.Variable(0, name='global_step', trainable=False)with tf.Session() as sess:sess.run(tf.global_variables_initializer())for global_step in range(EPOCH):# 重启余弦衰减learing_rate1 = tf.train.cosine_decay_restarts(learning_rate=0.1, global_step=global_step,first_decay_steps=40)learing_rate2 = tf.train.cosine_decay_restarts(learning_rate=0.1, global_step=global_step,first_decay_steps=60)lr1 = sess.run([learing_rate1])lr2 = sess.run([learing_rate2])y.append(lr1)z.append(lr2)x = range(EPOCH)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.plot(x, y, 'r-', linewidth=2)
plt.plot(x, z, 'b-', linewidth=2)
plt.title('cosine_decay')
ax.set_xlabel('step')
ax.set_ylabel('learing rate')
plt.legend(labels=['decay_steps=40', 'decay_steps=60'], loc='upper right')
plt.show()

6.3 线性余弦噪声

来源于:[Bello et al., ICML2017] Neural Optimizer Search with RL. https://arxiv.org/abs/1709.07417

tf.train.linear_cosine_decay(learning_rate,global_step,decay_steps,num_periods=0.5,alpha=0.0,beta=0.001,name=None):
参数 用法
learning_rate 初始学习率;
global_step 迭代次数;
decay_steps 衰减周期;
num_periods Number of periods in the cosine part of the decay.
alpha 最小学习率;
beta 同上;
name 名称,

计算方式:

global_step = min(global_step, decay_steps)
linear_decay = (decay_steps - global_step) / decay_steps)
cosine_decay = 0.5 * (1 + cos(pi * 2 * num_periods * global_step / decay_steps))
decayed = (alpha + linear_decay) * cosine_decay + beta
decayed_learning_rate = learning_rate * decayed

示例:

# coding:utf-8
import matplotlib.pyplot as plt
import tensorflow as tfy = []
z = []
EPOCH = 100
global_step = tf.Variable(0, name='global_step', trainable=False)with tf.Session() as sess:sess.run(tf.global_variables_initializer())for global_step in range(EPOCH):# 线性余弦衰减learing_rate1 = tf.train.linear_cosine_decay(learning_rate=0.1, global_step=global_step, decay_steps=40,num_periods=0.2, alpha=0.5, beta=0.2)learing_rate2 = tf.train.linear_cosine_decay(learning_rate=0.1, global_step=global_step, decay_steps=60,num_periods=0.2, alpha=0.5, beta=0.2)lr1 = sess.run([learing_rate1])lr2 = sess.run([learing_rate2])y.append(lr1)z.append(lr2)x = range(EPOCH)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.plot(x, y, 'r-', linewidth=2)
plt.plot(x, z, 'b-', linewidth=2)
plt.title('linear_cosine_decay')
ax.set_xlabel('step')
ax.set_ylabel('learing rate')
plt.legend(labels=['decay_steps=40', 'decay_steps=60'], loc='upper right')
plt.show()

6.4 噪声余弦衰减

来源于:[Bello et al., ICML2017] Neural Optimizer Search with RL. https://arxiv.org/abs/1709.07417

tf.train.noisy_linear_cosine_decay(learning_rate,global_step,decay_steps,initial_variance=1.0,variance_decay=0.55,num_periods=0.5,alpha=0.0,beta=0.001,name=None):
参数 用法
learning_rate 初始学习率;
global_step 迭代次数;
decay_steps 衰减周期;
initial_variance initial variance for the noise.
variance_decay decay for the noise's variance.
num_periods Number of periods in the cosine part of the decay.
alpha 最小学习率;
beta 查看计算公式;
name 名称,默认NoisyLinearCosineDecay

计算方式:

global_step = min(global_step, decay_steps)
linear_decay = (decay_steps - global_step) / decay_steps)
cosine_decay = 0.5 * (1 + cos(pi * 2 * num_periods * global_step / decay_steps))
decayed = (alpha + linear_decay + eps_t) * cosine_decay + beta
decayed_learning_rate = learning_rate * decayed

示例:

# coding:utf-8
import matplotlib.pyplot as plt
import tensorflow as tfy = []
z = []
EPOCH = 100
global_step = tf.Variable(0, name='global_step', trainable=False)with tf.Session() as sess:sess.run(tf.global_variables_initializer())for global_step in range(EPOCH):# # 噪声线性余弦衰减learing_rate1 = tf.train.noisy_linear_cosine_decay(learning_rate=0.1, global_step=global_step, decay_steps=40,initial_variance=0.01, variance_decay=0.1, num_periods=2, alpha=0.5, beta=0.2)learing_rate2 = tf.train.noisy_linear_cosine_decay(learning_rate=0.1, global_step=global_step, decay_steps=60,initial_variance=0.01, variance_decay=0.1, num_periods=2, alpha=0.5, beta=0.2)lr1 = sess.run([learing_rate1])lr2 = sess.run([learing_rate2])y.append(lr1)z.append(lr2)x = range(EPOCH)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.plot(x, y, 'r-', linewidth=2)
plt.plot(x, z, 'b-', linewidth=2)
plt.title('noisy_linear_cosine_decay')
ax.set_xlabel('step')
ax.set_ylabel('learing rate')
plt.legend(labels=['decay_steps=40', 'decay_steps=60'], loc='upper right')
plt.show()

 写在最后,将TensorFlow中提供的所有学习率衰减的方式大致地使用了一遍,突然发现,掌握的也仅仅是TensorFlow中提供了哪些衰减方式、大致如何使用;然而,当涉及到某种具体的衰减方式、参数如何设置与背后的数学意义,以及不同的方法适用于什么情况....等等一些问题,仍不能掌握。如有可能,在之后使用的过程中,当发现有新的理解,再回来补充。

  如有错误,请不吝指正,谢谢。

  这里感谢未雨愁眸-tensorflow中学习率更新策略的博文,本文主要参考该篇文章;当然在其他地方也有看到类似文章,至于说首发何人何处,却未从考证;

博主个人网站:https://chenzhen.onliine

Reference

  • 未雨愁眸-tensorflow中学习率更新策略

转载于:https://www.cnblogs.com/chenzhen0530/p/10632937.html

TensorFlow中设置学习率的方式相关推荐

  1. html中设置浏览器解码方式

    通过添加一行标签: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"& ...

  2. 一文简单弄懂tensorflow_在tensorflow中设置梯度衰减

    我是从keras入门深度学习的,第一个用的demo是keras实现的yolov3,代码很好懂(其实也不是很好懂,第一次也搞了很久才弄懂) 然后是做的车牌识别,用了tiny-yolo来检测车牌位置,当时 ...

  3. tensorflow中model.compile()

    model.compile()用来配置模型的优化器.损失函数,评估指标等 里面的具体参数有: compile(optimizer='rmsprop',loss=None,metrics=None,lo ...

  4. 如何使用TensorFlow中的Dataset API

    翻译 | AI科技大本营 参与 | zzq 审校 | reason_W 本文已更新至TensorFlow1.5版本 我们知道,在TensorFlow中可以使用feed-dict的方式输入数据信息,但是 ...

  5. TensorFlow之二—学习率 (learning rate)

    文章目录 一.分段常数衰减 tf.train.piecewise_constan() 二.指数衰减 tf.train.exponential_decay() 三.自然指数衰减 tf.train.nat ...

  6. html查看器更改默认打开方式,初学者如何设置默认打开方式

    现在的电脑里,图片查看器.音乐播放器和视频播放器有时都不止装了一个,因此在打开这些媒体文件时总是会默认用某个软件打开,但有些时候默认打开方式并不是自己想要的,这就需要自己动手修改了.这些默认打开方式一 ...

  7. tensorflow中学习率、过拟合、滑动平均的学习

    1. 学习率的设置 我们知道在参数的学习主要是通过反向传播和梯度下降,而其中梯度下降的学习率设置方法是指数衰减. 通过指数衰减的学习率既可以让模型在训练的前期快速接近较优解,又可以保证模型在训练后期不 ...

  8. 【TensorFlow】TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法)

    本文是<TensorFlow从浅入深>系列之第1篇 [TensorFlow]TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) 在训练神经网络时,需要设置学习率( ...

  9. TensorFlow中RNN实现的正确打开方式

    上周写的文章<完全图解RNN.RNN变体.Seq2Seq.Attention机制>介绍了一下RNN的几种结构,今天就来聊一聊如何在TensorFlow中实现这些结构,这篇文章的主要内容为: ...

最新文章

  1. Adobe pixel Bender toolkit
  2. 百货中心供应链管理系统
  3. 【RxSwift】flatMapLatest、 Error事件中断序列
  4. 去掉VS2012中的红色波浪下划线
  5. 创建的二叉树后续非递归遍历结果为_一入递归深似海,从此offer是路人
  6. Android 第三方之MPAndroidChart
  7. jvm性能调优实战 - 47超大数据量处理系统是如何OOM的
  8. U启动安装原版Win7系统教程
  9. 微信公众平台网站开发JS_SDK遇到的bug——wx.config注册提示成功,但部分接口注册失败问题
  10. #ifdef __cplusplus是什么意思
  11. 在Ant Design Pro(React)中使用ECharts
  12. springcloud springboot 集成cxf webservice框架,配置cxf拦截器
  13. Excel 2010 VBA 入门 002 录制和运行宏
  14. SCI收录中国期刊国家一级期刊名录一览表
  15. 实验3:搜索算法求解8数码问题
  16. 黄金面试技巧|应届生求职必备
  17. 计算机中最小值的公式,用数组公式在数值列中查找大于指定值的最小值
  18. 怎么关闭windows中不在控制面板上的smartscreen筛选器
  19. 1610C - Keshi Is Throwing a Party 题解
  20. 微信小程序 - (广告、优惠券)弹出与关闭

热门文章

  1. 【转载】谈谈我对Java中CallBack的理解
  2. WindowsAzurePack Updata1VMM12R2SPF
  3. RHCE课程-RH253Linux服务器架设笔记五-APACHE服务器配置(4)
  4. [原创]PipelineTools 文件传输工具
  5. SQL SERVER全面优化-------索引有多重要?
  6. Linux网络设置2——虚拟机中的Linux和Windows网络互通设置
  7. iOS - iOS 适配
  8. SQL Server 之AdventureWorks 2008 安
  9. 复杂的数据类型5 - C++快速入门11
  10. Rancher-创建自己的应用商店教程