提交 92959cca 编写于 作者: M Mu Li

update dropout

上级 9947abcb
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
underfit-overfit underfit-overfit
reg-scratch reg-scratch
reg-gluon reg-gluon
dropout-scratch
dropout-gluon
kaggle-gluon-kfold kaggle-gluon-kfold
``` ```
...@@ -9,23 +9,23 @@ ...@@ -9,23 +9,23 @@
更靠近输入层的元素丢弃概率设的更小一点。这个试验中,我们把第一层全连接后的元素丢弃概率设为0.2,把第二层全连接后的元素丢弃概率设为0.5。 更靠近输入层的元素丢弃概率设的更小一点。这个试验中,我们把第一层全连接后的元素丢弃概率设为0.2,把第二层全连接后的元素丢弃概率设为0.5。
```{.python .input n=5} ```{.python .input n=5}
from mxnet import gluon from mxnet.gluon import nn
net = gluon.nn.Sequential() net = nn.Sequential()
drop_prob1 = 0.2 drop_prob1 = 0.2
drop_prob2 = 0.5 drop_prob2 = 0.5
with net.name_scope(): with net.name_scope():
net.add(gluon.nn.Flatten()) net.add(nn.Flatten())
# 第一层全连接。 # 第一层全连接。
net.add(gluon.nn.Dense(256, activation="relu")) net.add(nn.Dense(256, activation="relu"))
# 在第一层全连接后添加丢弃层。 # 在第一层全连接后添加丢弃层。
net.add(gluon.nn.Dropout(drop_prob1)) net.add(nn.Dropout(drop_prob1))
# 第二层全连接。 # 第二层全连接。
net.add(gluon.nn.Dense(256, activation="relu")) net.add(nn.Dense(256, activation="relu"))
# 在第二层全连接后添加丢弃层。 # 在第二层全连接后添加丢弃层。
net.add(gluon.nn.Dropout(drop_prob2)) net.add(nn.Dropout(drop_prob2))
net.add(gluon.nn.Dense(10)) net.add(nn.Dense(10))
net.initialize() net.initialize()
``` ```
...@@ -36,16 +36,17 @@ net.initialize() ...@@ -36,16 +36,17 @@ net.initialize()
```{.python .input n=6} ```{.python .input n=6}
import sys import sys
sys.path.append('..') sys.path.append('..')
from mxnet import ndarray as nd
from mxnet import autograd
import utils import utils
from mxnet import nd
from mxnet import autograd
from mxnet import gluon
batch_size = 256 batch_size = 256
train_data, test_data = utils.load_data_fashion_mnist(batch_size) train_data, test_data = utils.load_data_fashion_mnist(batch_size)
softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss() softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.5}) trainer = gluon.Trainer(net.collect_params(),
'sgd', {'learning_rate': 0.5})
for epoch in range(5): for epoch in range(5):
train_loss = 0. train_loss = 0.
...@@ -62,7 +63,8 @@ for epoch in range(5): ...@@ -62,7 +63,8 @@ for epoch in range(5):
test_acc = utils.evaluate_accuracy(test_data, net) test_acc = utils.evaluate_accuracy(test_data, net)
print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % ( print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % (
epoch, train_loss/len(train_data), train_acc/len(train_data), test_acc)) epoch, train_loss/len(train_data),
train_acc/len(train_data), test_acc))
``` ```
## 结论 ## 结论
......
# 丢弃法 --- 从0开始 # 丢弃法 --- 从0开始
前面我们介绍了多层神经网络,就是包含至少一个隐含层的网络。我们也介绍了正则法来应对过拟合问题。在深度学习中,一个常用的应对过拟合问题的方法叫做丢弃法。本节以多层 前面我们介绍了多层神经网络,就是包含至少一个隐含层的网络。我们也介绍了正则法来应对过拟合问题。在深度学习中,一个常用的应对过拟合问题的方法叫做丢弃法(Dropout)。本节以多层神经网络为例,从0开始介绍丢弃法。
神经网络为例,从0开始介绍丢弃法。
由于丢弃法的概念和实现非常容易,在本节中,我们先介绍丢弃法的概念以及它在现代神经网络中是如何实现的。然后我们一起探讨丢弃法的本质。 由于丢弃法的概念和实现非常容易,在本节中,我们先介绍丢弃法的概念以及它在现代神经网络中是如何实现的。然后我们一起探讨丢弃法的本质。
...@@ -20,6 +19,8 @@ ...@@ -20,6 +19,8 @@
丢弃法的实现很容易,例如像下面这样。这里的标量`drop_probability`定义了一个`X``NDArray`类)中任何一个元素被丢弃的概率。 丢弃法的实现很容易,例如像下面这样。这里的标量`drop_probability`定义了一个`X``NDArray`类)中任何一个元素被丢弃的概率。
```{.python .input} ```{.python .input}
from mxnet import nd
def dropout(X, drop_probability): def dropout(X, drop_probability):
keep_probability = 1 - drop_probability keep_probability = 1 - drop_probability
assert 0 <= keep_probability <= 1 assert 0 <= keep_probability <= 1
...@@ -28,8 +29,9 @@ def dropout(X, drop_probability): ...@@ -28,8 +29,9 @@ def dropout(X, drop_probability):
return X.zeros_like() return X.zeros_like()
# 随机选择一部分该层的输出作为丢弃元素。 # 随机选择一部分该层的输出作为丢弃元素。
mask = nd.random_uniform(0, 1.0, X.shape, ctx=X.context) < keep_probability mask = nd.random.uniform(
# 这里keep_probability必不为0。 0, 1.0, X.shape, ctx=X.context) < keep_probability
# 保证 E[dropout(X)] == X
scale = 1 / keep_probability scale = 1 / keep_probability
return mask * X * scale return mask * X * scale
``` ```
...@@ -37,8 +39,6 @@ def dropout(X, drop_probability): ...@@ -37,8 +39,6 @@ def dropout(X, drop_probability):
我们运行几个实例来验证一下。 我们运行几个实例来验证一下。
```{.python .input} ```{.python .input}
from mxnet import ndarray as nd
A = nd.arange(20).reshape((5,4)) A = nd.arange(20).reshape((5,4))
dropout(A, 0.0) dropout(A, 0.0)
``` ```
...@@ -109,12 +109,6 @@ params = [W1, b1, W2, b2, W3, b3] ...@@ -109,12 +109,6 @@ params = [W1, b1, W2, b2, W3, b3]
for param in params: for param in params:
param.attach_grad() param.attach_grad()
def relu(X):
return nd.maximum(X, 0)
from mxnet import gluon
softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss()
``` ```
## 定义包含丢弃层的模型 ## 定义包含丢弃层的模型
...@@ -129,15 +123,14 @@ drop_prob2 = 0.5 ...@@ -129,15 +123,14 @@ drop_prob2 = 0.5
def net(X): def net(X):
X = X.reshape((-1, num_inputs)) X = X.reshape((-1, num_inputs))
# 第一层全连接。 # 第一层全连接。
h1 = relu(nd.dot(X, W1) + b1) h1 = nd.relu(nd.dot(X, W1) + b1)
# 在第一层全连接后添加丢弃层。 # 在第一层全连接后添加丢弃层。
h1 = dropout(h1, drop_prob1) h1 = dropout(h1, drop_prob1)
# 第二层全连接。 # 第二层全连接。
h2 = relu(nd.dot(h1, W2) + b2) h2 = nd.relu(nd.dot(h1, W2) + b2)
# 在第二层全连接后添加丢弃层。 # 在第二层全连接后添加丢弃层。
h2 = dropout(h2, drop_prob2) h2 = dropout(h2, drop_prob2)
output = nd.dot(h2, W3) + b3 return nd.dot(h2, W3) + b3
return output
``` ```
## 训练 ## 训练
...@@ -145,7 +138,10 @@ def net(X): ...@@ -145,7 +138,10 @@ def net(X):
训练跟之前一样。 训练跟之前一样。
```{.python .input n=8} ```{.python .input n=8}
from mxnet import autograd as autograd from mxnet import autograd
from mxnet import gluon
softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss()
learning_rate = .5 learning_rate = .5
...@@ -164,7 +160,8 @@ for epoch in range(5): ...@@ -164,7 +160,8 @@ for epoch in range(5):
test_acc = utils.evaluate_accuracy(test_data, net) test_acc = utils.evaluate_accuracy(test_data, net)
print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % ( print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % (
epoch, train_loss/len(train_data), train_acc/len(train_data), test_acc)) epoch, train_loss/len(train_data),
train_acc/len(train_data), test_acc))
``` ```
## 总结 ## 总结
......
...@@ -103,7 +103,8 @@ for epoch in range(5): ...@@ -103,7 +103,8 @@ for epoch in range(5):
test_acc = utils.evaluate_accuracy(test_data, net) test_acc = utils.evaluate_accuracy(test_data, net)
print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % ( print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % (
epoch, train_loss/len(train_data), train_acc/len(train_data), test_acc)) epoch, train_loss/len(train_data),
train_acc/len(train_data), test_acc))
``` ```
## 总结 ## 总结
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册