import torch
from torch import nn
from d2l import torch as d2l
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
#28*28 隐藏层,
num_inputs, num_outputs, num_hiddens = 784, 10, 256
#这里有个小问题,我们是全部设成随机数 一会想一下全部设置0/1
W1 = nn.Parameter(torch.randn(
num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(
num_hiddens, num_outputs, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))
params = [W1, b1, W2, b2]
def relu(X):
a = torch.zeros_like(X)
return torch.max(X, a)
def net(X):
#转换为1列
X = X.reshape((-1, num_inputs))
H = relu(X @ W1 + b1)
return (H @ W2 + b2)
loss = nn.CrossEntropyLoss(reduction='none')
num_epochs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
1.在备注中的问题就是你可以将W1,W2,设置成1和0试一下哈。这个问题就是我们之前逻辑回归那里说到的,逻辑回归的权重更新跟你的权重没有关系,我们反向传播会因为我们的输入不同得到不同的dw1.
但是在神经网络中,W1,W2 为0 会让你的前向传播为0,进而影响到反向传播。全面讲解
-
在所有其他参数保持不变的情况下,更改超参数
num_hiddens
的值,并查看此超参数的变化对结果有何影响。确定此超参数的最佳值。
289个神经元324个神经元
emm,好像没啥区别啊
512个神经元800个神经元
在800后第5轮测试集出现了严重的波动,出现了严重的过拟合现象。 -
尝试添加更多的隐藏层,并查看它对结果有何影响。
当隐藏层增大的时候,其它超参数不变的情况下,train loss下降速度变慢。 -
改变学习速率会如何影响结果?保持模型架构和其他超参数(包括轮数)不变,学习率设置为多少会带来最好的结果?回归的时候说了
-
通过对所有超参数(学习率、轮数、隐藏层数、每层的隐藏单元数)进行联合优化,可以得到的最佳结果是什么?
-
描述为什么涉及多个超参数更具挑战性。
更改单一得得得超参数不一定会将模型变得好。(联合优化才好) -
如果要构建多个超参数的搜索方法,你能想到的最聪明的策略是什么?
Q&A:
神经网络要增加隐藏层的层数,而不是神经元的个数,不是有神经网络万有近似性质吗?
左边的和右边的理论上是相等的,但是左边的不好训练