动手学深度学习学习笔记(14)

丢弃法
深度学习模型常常使用丢弃法来应对过拟合问题。
丢弃法有一些变体,本节中提到的丢弃法特指倒置丢弃法。

方法
设丢弃概率为p,那么有p的概率hi会被清零,有1-p的概率hi会除以1-p做拉伸。
丢弃概率是丢弃法的超参数。具体来说,设随机变量εi为0和1的概率分别为p和1-p。计算新的隐藏单元hi
hi = εi*hi/1-p
由于εi的期望为1-p,所以
hi 的期望仍是hi
所以丢弃法不会改变输入的期望值。
由于在训练中隐藏层神经元的丢弃是随机的,所以每一个神经元都有可能被清零,输出层的计算无法过度依赖其中的任意一个,从而在训练模型时起到正则化的作用,可以用来应对过拟合。
在测试模型时,为了拿到更加确定性的结果,一般不使用丢弃法。

从零开始实现
使用dropout函数将以drop_prob的概率丢弃x中的元素。

%matplotlib inline
import torch
import torch.nn as nn
import numpy as np
sys.path.append("...")
import d2lzh_pytorch as d2l

def dropout(X, drop_prob):
	X = X.float()
	assert 0 <= drop_prob <= 1
	keep_prob = 1-drop_prob
	if keep_prob == 0:
		#相当于丢弃所有隐藏单元
		return torch.zeros_like(X):
	mask = (torch.rand(X.shape) < keep_prob).float()
	#均匀分布,每个样本特征保留的概率都是keep_prob
	
	return mask * X/keep_prob

测试dropout函数

X = torch.arange(16).view(2,8)
dropout(X, 0.5)

输出

tensor([[ 0.,  0.,  0.,  6.,  8.,  0.,  0., 14.],
        [16., 18., 20.,  0.,  0., 26.,  0., 30.]])

定义模型函数
定义一个包含两个隐藏层的多层感知机,其中两个隐藏层的输出个数都是256

num_inputs, num_outpus, num_hiddens1, num_hiddens2 = 784,10,256,256
W1  =torch.tensor(np.random.normal(0, 0.01, size= (num_inputs, num_hiddens1), dtype = torch.float, requires_grad = True)
b1  =torch.zeros(num_hiddens1, requires_grad = True)
W2  =torch.tensor(np.random.normal(0, 0.01, size= (num_hiddens1, num_hiddens2), dtype = torch.float, requires_grad = True)
b2  =torch.zeros(num_hiddens2, requires_grad = True)
W3  =torch.tensor(np.random.normal(0, 0.01, size= (num_hiddens2, num_outputs), dtype = torch.float, requires_grad = True)
b3  =torch.zeros(num_outputs, requires_grad = True)

params = [W1, b1, W2, b2, W3, b3]

定义模型
将全连接层与激活函数ReLU串起来,并对每个激活函数的输出使用丢弃法。
可以分别设置每个层的丢弃概率,通常的建议是吧靠近输入层的丢弃概率设的小一点。
第一个隐藏层的丢弃概率设为0.2, 第二个隐藏层的丢弃概率设为0.5.
可以通过参数is_training来判断运行模式为训练还是测试,并只需在训练模式下使用丢弃法。

drop_prob1, drop_prob2 = 0.2, 0.5

def net(X, is_training = True):
	X = X.view(-1, num_inputs)
	H1 = (torch.matmul(X, W1) + b1).relu()
	if is_trainingL
	#只在训练模型使用丢弃法
		H1 = dropout(H1, drop_prob1)
	H2 = (torch.matmul(H1, W2) + b2).relu()
	if is_training:
		H2 = dropout(H2, drop_prob2)
	return torch.matmul(H2, W2) + b3

在对模型评估的时候不应该使用丢弃法,所以修改一下evaluate-accuracy函数

def evaluate_accuracy(data_iter, net):
	acc_sum, n = 0.0, 0
	for X,y in data_iter:
		if isinstance(net, torch.nn.Module):
		#判断模型是否是自定义的,net是否是nn.Module的类型
			net.eval()
			#评估模式 这会关闭dropout
			acc_sum += (net(X).argmax(dim = 1) == y).float().sum().item()
			net.train()
			#将net改回训练模式
		else:
			if('is_training' in net.__code__.co_varnames):
			#如果有is_training这个参数
				acc_sum += (net(X, is_training = False).argmax(dim =1) == y).float().sum().item()
			#将其改为False
			else:	
				acc_sum += (net(X).argmax(dim = 1) == y).float().sum().item()
		n += y.shape[0]
	return acc_sum/n

训练模型

num_epochs, lr, batch_size = 5, 100.0, 256
loss = torch.nn.CrossEntropyLoss()
train_iter, teat_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, parmas, lr)

这里的lr很大,因为optimizer使用的是自定义的SGD,迭代时除以了batch_size

简洁实现
只需要在全连接层后添加Dropout层并指定丢弃概率,在训练模型时,Dropout以指定的丢弃概率随机丢弃上一层的输出元素,在测试模型时(model.eval()), Dropout层并不发挥作用

net = nn.Sequential(
	d2l.FlattenLayer(),
	nn.Linear(num_inputs, num_hiddens1),
	nn.ReLU(),
	nn.Dropout(drop_prob1),
	nn.Linear(num_hiddens1, num_hiddens2),
	nn.ReLU(),
	nn.Dropout(drop_prob2),
	nn.Linear(num_hiddens2, 10)
	)

for params in net.parameters():
	nn.init.normal_(param, mean = 0, std = 0.01)

训练并测试模型

optimizer = torch.optim.SGD(net.parameters, lr= 0.5)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 动手深度学习v2是一本非常好的深度学习教材,是从谷歌机器学习研究员李沐所主持的Gluon团队创作的。它提供了丰富的案例和实际应用,深入浅出地介绍了深度学习的基础理论和实践技能。 下载动手深度学习v2非常简单,可以通过访问官方网站来获取。首先,打开谷歌或百度搜索引擎,搜索"动手深度学习v2下载",就可以找到相关的下载链接。建议选择官网下载,因为官网下载最为安全可靠。 进入官网后,点击首页上的"下载"按钮,然后在目录下找到本书的下载链接,下载适合你的版本即可。此外,动手深度学习v2还有在线阅读的版本,方便学习者随时随地学习。 总的来说,动手深度学习v2是一本非常优秀的深度学习教材,相关下载链接也十分便捷,能够帮助广大学习者更好地掌握深度学习相关的知识和技能。 ### 回答2: 动手深度学习v2是一本非常优秀的深度学习入门书籍,笔者十分推荐。如果您想要下载该书籍,可以使用以下方法: 1.进入动手深度学习v2的官网(https://zh.d2l.ai/),点击右上角的“Github”按钮,进入书籍的Github仓库。 2.在仓库中找到“releases”目录,选择最新的版本号,点击进入。 3.在该版本的页面中,找到“Source code (zip)”或“Source code (tar.gz)”选项,点击下载压缩包。 4.下载完成后,解压缩文件即可得到电子书的文件夹,其中包括PDF和HTML格式的书籍。 除此之外,您也可以在该官网中找到由中文社区翻译的在线电子书版本。在该电子书中,您可以直接在线阅读和学习。值得注意的是,该书籍的在线翻译版本可能会比英文原版稍有滞后。如果您想要阅读最新的内容,请下载英文原版或者在该官网上查看最新的更新。 ### 回答3: 学习深度学习是现在的热门话题之一。而动手深度学习v2是一本非常好的深度学习教材,旨在为做实际项目的学习者提供知识技能和实战经验。为了下载此书,您需要按照以下步骤进行。 首先,您需要访问动手深度学习官方网站,网址为d2l.ai。然后,您需要找到下载页面,这个页面可以通过页面上的“全书下载”按钮或主页面上的一个标签来访问。 在下载页面,您需要选择您所需要的版本,v2版本是最新版本。接着,您需要选择您所需的格式。您可以选择PDF格式或HTML格式,下方还提供了在线阅读链接。 若您选择了PDF格式,则需要点击下载链接,页面会跳到GitHub仓库中。在GitHub页面,您需要选择ZIP文件并下载。下载完成后,您就可以在本地解压并阅读这本书了。 若您选择了HTML格式,则不需下载,只需点击在线阅读链接即可。页面会跳转到包含书籍所有章节、实例代码、作者笔记等信息的HTML页面,您可以任意阅读或者下载章节(在左侧点击对应章节)。 总之,动手深度学习v2是一本亲身实践的深度学习教材,其深入浅出的讲解以及丰富的实战案例,能够帮助初者快速掌握深度学习这一技术,同时也是深度学习领域专业人士的必备读物。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值