用卷积神经网络检测脸部关键点的教程(一)
regression=True, # flag to indicate we're dealing with regression problem
max_epochs=400, # we want to train this many epochs
verbose=1,
)
X, y = load()
net1.fit(X, y)
我们使用相当多的参数来初始化NeuralNet。让我们看看他们。首先是三层及其参数:
layers=[ # 三层神经网络:一个隐层
('input', layers.InputLayer),
('hidden', layers.DenseLayer),
('output', layers.DenseLayer),
],
# 层的参数:
input_shape=(None, 9216), # 每个批次96x96个输入样例
hidden_num_units=100, # 隐层中的单元数
output_nonlinearity=None, # 输出用的激活函数
output_num_units=30, # 30个目标值
这里我们定义输入层,隐藏层和输出层。在层参数中,我们命名并指定每个层的类型及其顺序。参数input_shape,hidden_??num_units,output_nonlinearity和output_num_units是特定层的参数。它们通过它们的前缀引用层,使得input_shape定义输入层的shape参数,hidden_??num_units定义隐藏层的num_units等等。(看起来有点奇怪,我们必须指定像这样的参数,但结果是它让我们对于受使用scikit-learn的管道和参数搜索功能拥有更好的兼容性。)
我们将input_shape的第一个维度设置为None。这转换为可变批量大小。如果你知道批量大小的话,也可以设置成固定值,如果为None,则是可变值。
我们将output_nonlinearity设置为None。因此,输出单元的激活仅仅是隐藏层中的激活的线性组合。
DenseLayer使用的默认非线性是rectifier,它其实就是返回max(0, x)。它是当今最受欢迎的激活功能选择。通过不明确设置hidden_??nonlinearity,我们选择rectifier作为我们隐藏层的激活函数。
神经网络的权重用具有巧妙选择的间隔的均匀分布来初始化。也就是说,Lasagne使用"Glorot-style"初始化来计算出这个间隔。
还有几个参数。 所有以update开头的参数用来表示更新方程(或最优化方法)的参数。 更新方程将在每个批次后更新我们网络的权重。 我们将使用涅斯捷罗夫动量梯度下降优化方法(nesterov_momentum gradient descent optimization method)来完成这项工作。Lasagne实现的其他方法有很多,如adagrad和rmsprop。我们选择nesterov_momentum,因为它已经证明对于大量的问题很好地工作。
"’ optimization method: ""
update=nesterov_momentum,
update_learning_rate=0.01,
update_momentum=0.9,
update_learning_rate定义了梯度下降更新权重的步长。我们稍后讨论学习率和momentum参数,现在的话,这种健全的默认值已经足够了。
上图是不同的最优化方法的对比(animation by?Alec Radford)。星标位置为全局最优值。注意到不添加动量的随机梯度下降是收敛最慢的,我们在教程中从头到尾都是用Nesterov加速过的梯度下降。
在我们的NeuralNet的定义中,我们没有指定一个目标函数来实现最小化。这里使用的还有一个默认值:对于回归问题,它是均方误差(MSE)。
最后一组参数声明我们正在处理一个回归问题(而不是分类),400是我们愿意训练的时期数,并且我们想在训练期间通过设置verbose = 1:
regression=True, # flag to indicate we're dealing with regression problem
max_epochs=400, # we want to train this many epochs
verbose=1,
最后两行加载了数据,然后用数据训练了我们的第一个神经网络。
X, y = load()
net1.fit(X, y)
运行这两行会输出一个表格,每次完成一代就输出一行。每一行里,我们可以看到当前的训练损失和验证损失(最小二乘损失),以及两者的比率。NeuroNet将会自动把输入数据X分成训练集和测试集,用20%的数据作验证。(比率可以通过参数eval_size=0.2调整)
$ python kfkd.py
...
InputLayer (None, 9216) produces 9216 outputs
DenseLayer (None, 100) produces 100 outputs
DenseLayer (None, 30) produces 30 outputs
Epoch | Train loss | Valid loss | Train / Val
--------|--------------|--------------|----------------
1 | 0.105418 | 0.031085 | 3.391261
2 | 0.020353 | 0.019294 | 1.054894
3 | 0.016118 | 0.016918 | 0.952734
4 | 0.014187 | 0.015550 | 0.912363
5 | 0.013329 | 0.014791 | 0.901199
...
200 | 0.003250 | 0.004150 | 0.783282
201 | 0.003242 | 0.004141 | 0.782850
202 | 0.003234 | 0.004133 | 0.782305
203 | 0.003225 | 0.004126 | 0.781746
204 | 0.003217 | 0.004118 | 0.781239
205 | 0.003209 | 0.004110 | 0.780738
...
395 | 0.002259 | 0.003269 | 0.690925
396 | 0.002256 | 0.003264 | 0.691164
397 | 0.002254 | 0.003264 | 0.690485
398 | 0.002249 | 0.003259 | 0.690303
399 | 0.002247 | 0.003260 | 0.689252
400 | 0.002244 | 0.003255 | 0.689606
- GPU性能不够跑VR?这项技术或许能解决难题(03-29)
- VR设计:如何实现GPU和显示器高度集成(05-11)
- 基于CUDA技术的视频显示系统的设计方案(06-08)
- 笔记本电脑中温度传感器的应用(06-14)
- 双GPU设计 打造最简单与最快速的加速方案(05-25)
- Intel第六代处理器 Skylake CPU、GPU、主板完全解析(09-06)