多层感知机作业-mlp-scratch
-
目录
3. 改变学习速率会如何影响结果?保持模型架构和其他超参数(包括轮数)不变,学习率设置为多少会带来最好的结果?
4. 通过对所有超参数(学习率、轮数、隐藏层数、每层的隐藏单元数)进行联合优化,可以得到的最佳结果是什么?
6. 如果要构建多个超参数的搜索方法,你能想到的最聪明的策略是什么?
1.更改超参数‘num_hiddens’
在学习率不变和训练次数不变的情况下,增加隐藏单元的数量,train loss 会明显降低 test acc 曲线也会更加平滑
num_hiddens=64
num_hiddens=128
num_hiddens=256
num_hiddens=512
num_hiddens=1024
2. 添加隐藏层数
-
注意点:添加隐藏层后(代码中为2个隐藏层)需要注意配置W 和b的大小
W1=[num_input,num_hiddens] b1=[num_hiddens]
W2=[num_hiddens,num_hiddens2] b1=[num_hiddens2]
W3 = [num_hiddens2,num_input] b1=[num_input]
增加隐藏层数 模型变差 Loss变大
-
#初始化模型参数 num_inputs, num_outputs, num_hiddens, num_hiddens2 = 784, 10, 256 ,64 #输入784 输出10 一个隐藏层包含256个隐藏单元 W1 = nn.Parameter(torch.randn( #输入层权重 num_inputs, num_hiddens, requires_grad=True) * 0.01) #输入 隐藏层 梯度下降 考虑为什么要随机? 试试全为0或1 b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True)) #偏差 设成0 偏差和输出宽度保持一致 W2 = nn.Parameter( #第二层 torch.randn(num_hiddens, num_hiddens2, requires_grad=True) * 0.01) b2 = nn.Parameter(torch.zeros(num_hiddens2, requires_grad=True)) #偏差是输出 W3 = nn.Parameter( #输出层 torch.randn(num_hiddens2, num_outputs, requires_grad=True) * 0.01) b3 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True)) #偏差是输出 params = [W1, b1, W2, b2, W3, b3] #W1 b1 第一层 W2 b2第二层
#模型 def net(X): X = X.reshape((-1, num_inputs)) #先把X拉成二维矩阵 = 28*28 拉成784矩阵 H1 = relu(X@W1 + b1) # 这里“@”代表矩阵乘法 H2 = relu(H1@W2+ b2) #添加隐藏层 return (H2@W3 + b3)
两个隐藏层 256、 64
两个隐藏层 256、128
3.学习率
有限大小内 学习率越大 train loss越小 train acc越大
学习率0.1 隐藏层1层 256
学习率0.2 隐藏层1层 256
学习率0.3 隐藏层1层 256
学习率0.4 隐藏层1层 256
学习率1 隐藏层1层 256