1 对于丢弃法的一点小思考
(1) 对于模型设计我们可以把隐藏层设计的稍微大一点然后用drop out控制隐藏层大小这样的设计可能比隐藏层设计的小一点的效果更好,防止过拟合,drop out 其实就是一个正则项。
(2) drop out 就是随机丢弃隐藏层神经元的个数从而防止参数过分依赖训练数据,增加参数对数据集的泛化能力
(3) Drop out可以减少神经元之间复杂的共适应关系,因为Dropout使得某两个神经元不一定每次都在一个子网络结构中出现。基于此权值的更新不在依赖于固定关系的隐含节点的共同作用,使得了在丢失某些特定信息的情况下依然可以从其它信息中学到一些模式(鲁棒性),迫使网络去学习更加鲁棒的特征(更加具有通适性)。
(4) drop out作用在隐藏层的输出可以再激活函数之前也可以在激活函数之后。drop out作用在全连接层而不是卷积层,丢弃前一层的输出丢弃后一层的输出。drop out 比起权重衰退(L2正则化来说)更容易调参
(5) 随机性高稳定性就会增加这怎么理解呢? 我理解的是随机性高了会弱化一些偶然事件的影响考虑的方面会增多防止过拟合。
(6) 丢弃法是在训练的时候丢弃一些神经元,在预测的时候没有丢弃神经元。
2 代码实现(手动)
(1) 生成dropout函数
import torch
from torch import nn
from d2l import torch as d2l
def dropout_layer(X, dropout):
assert 0 <= dropout <= 1 #ssert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.也就是说dropout值必须在0-1之间
# 在本情况中,所有元素都被丢弃。
if dropout == 1:
return torch.zeros_like(X)
# 在本情况中,所有元素都被保留。
if dropout == 0:
return X
mask = (torch.rand(X.shape) > dropout).float() #rand()返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数
return mask * X / (1.0 - dropout)
(2) 定义模型参数
num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256,256
(3) 定义模型
dropout1, dropout2 = 0.2, 0.5
class Net(nn.Module):
def __init__(self, num_inputs, num_outputs, num_hiddens1, num_hiddens2,
is_training = True):
super(Net, self).__init__()
self.num_inputs = num_inputs
self.training = is_training
self.lin1 = nn.Linear(num_inputs, num_hiddens1)
self.lin2 = nn.Linear(num_hiddens1, num_hiddens2)
self.lin3 = nn.Linear(num_hiddens2, num_outputs)
self.relu = nn.ReLU()
def forward(self, X): #定义前向传播
H1 = self.relu(self.lin1(X.reshape((-1, self.num_inputs))))
# 只有在训练模型时才使用dropout
if self.training == True:
# 在第一个全连接层之后添加一个dropout层
H1 = dropout_layer(H1, dropout1)
H2 = self.relu(self.lin2(H1))
if self.training == True:
# 在第二个全连接层之后添加一个dropout层
H2 = dropout_layer(H2, dropout2)
out = self.lin3(H2)
return out
(4) 训练测试
num_epochs, lr, batch_size = 10, 0.5, 256
loss = nn.CrossEntropyLoss()
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
trainer = torch.optim.SGD(net.parameters(), lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
d2l.plt.show()
1 除了控制权重向量的维数和大小之外,dropout也是避免过拟合的另一种工具。它们通常是联合使用的。
2 dropout将激活值 h 替换为具有期望值 h 的随机变量。
3 dropout仅在训练期间使用。