2024 09 19, 2332 今日內容
2024-09-19, 23:32-今日內容
Detach 的autograd 就是光本儿数据了,可以让我们用这种方法来吧计算历史分离。 Torch 想要对一个新创建的函数打开autograd的功能让他帮你追踪来时候的路,就这样说,直接理解@ decorator: Torch里面每一个tensor都可以被我们控制要不要打开autograd。 Torch的autograd只能对一个标量进行backward。 计算咩哥neuron得partialderivative。 所以… 为了让输出的东西看起来整整齐齐, 我们可以用> 来告诉他我就要多少个空格。 你把东西给我填到格子里这种意思。 Gradient 是每次调整weight的nudge ,也就是每次需要调整多少。 然后这个batch 结束了,gradient就会… 数值求导gradient 一般用中心差分。 也就是这个公式: 更精确,比向前求导更精确。 在backpropogation的时候, 不是用的数值求导, 而直接用的chairn rule。 数值求导一般用来验证chain… torch强制转换cast 指定某个variable: pytorch自带的autograd 会让我们直接对loss 调用backwrd()。 也就是会进行自动求gradient。 超级参数包括layer的层数, NN的数量, learning rate 和batch size。 一般来说 模型的构建和loss function需要单独分开 为了方便模块。 torch的with torch.no_grad() 不会让我们反过来传播,也就是不回更新weight。 这样我们进行evaluation… L1 和l2 的loss 是通过增加一个对weight 的选项进去loss 来对太大的weight 进行惩罚。 也就是weight… L1 L2 就是在算loss的时候,在原本计算出来的loss,也就是neuron出来的A 和真实的value的差之上,增加的一个项目… Validation set 用来在训练的时候调整hyperparameter
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Detach 的autograd 就是光本儿数据了,可以让我们用这种方法来吧计算历史分离。 x = torch.rand(5, requires_grad=True) y = x.detach()
print(x) print(y)
#autograd
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Torch 想要对一个新创建的函数打开autograd的功能让他帮你追踪来时候的路,就这样说,直接理解@ decorator: def add_tensor1(a, b): return a + b
@torch.no_grad() def add_tensor2(a, b): return a + b a = torch.tensor([1.0, 2.0, 3.0], requires_grad=True) * 2 b = torch.tensor([1.0, 2.0, 3.0], requires_grad=True) * 3 c1 = add_tensor1(a, b) c2 = add_tensor2(a, b) c1 c2
In [60]: c1 = add_tensor1(a, b)
In [61]:
In [61]: c2 = add_tensor2(a, b)
In [62]:
In [62]: c1
Out[62]: tensor([ 5., 10., 15.], grad_fn=
In [63]:
In [63]: c2 Out[63]: tensor([ 5., 10., 15.])
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Torch里面每一个tensor都可以被我们控制要不要打开autograd。 如果开了。他就会帮我记住来时候的路。 如果关了,就跟array越来越像了。
a = torch.tensor([1.0, 2.0, 3.0], requires_grad=False) a b1 = 2 * a b1 a.requires_grad = True b2 = 2 * a b2
In [54]: b2 = 2 * a
In [55]:
In [55]: b2
Out[55]: tensor([2., 4., 6.], grad_fn=
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Torch的autograd只能对一个标量进行backward。 计算咩哥neuron得partialderivative。 所以… Torch的autograd只能对一个标量进行backward。 计算咩哥neuron得partialderivative。 所以我们才会利用cross entropy来把所有的loss 总结到一起, 要不就是最后sum了一下,要不就mean了一下。 这样的做法 才会让我们可以用torch 得autograd 进行推导。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
为了让输出的东西看起来整整齐齐, 我们可以用> 来告诉他我就要多少个空格。 你把东西给我填到格子里这种意思。 loss = 1.234 current = 45 size = 100 print(f”loss: {loss:>7f} [{current:>5d}/{size:>5d}]”) loss: 1.234000 [ 45/ 100]
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Gradient 是每次调整weight的nudge ,也就是每次需要调整多少。 然后这个batch 结束了,gradient就会… Gradient 是每次调整weight的nudge ,也就是每次需要调整多少。 然后这个batch 结束了,gradient就会被弄成 0. 每个natch 都需要清零,因为每个batch的weight的调整都是不一样的。 所以我们才需要在batch里面进行step和zero_grad。 for batch, (X, y) in enumerate(dataloader): X, y = X.to(device), y.to(device)
# Compute prediction error
pred = model(X)
loss = loss_fn(pred, y)
# Backpropagation
loss.backward()
optimizer.step()
optimizer.zero_grad()
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
数值求导gradient 一般用中心差分。 也就是这个公式: 更精确,比向前求导更精确。 
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
在backpropogation的时候, 不是用的数值求导, 而直接用的chairn rule。 数值求导一般用来验证chain… 在backpropogation的时候, 不是用的数值求导, 而直接用的chairn rule。 数值求导一般用来验证chain rule的正确性。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
torch强制转换cast 指定某个variable: variable.type(torch.float)也就是强制转换int 到float
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
pytorch自带的autograd 会让我们直接对loss 调用backwrd()。 也就是会进行自动求gradient。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
超级参数包括layer的层数, NN的数量, learning rate 和batch size。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
一般来说 模型的构建和loss function需要单独分开 为了方便模块。
Define model
class NeuralNetwork(nn.Module): def init(self): super().init() self.flatten = nn.Flatten() self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10) )
def forward(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
model = NeuralNetwork().to(device) 看这段代码, 就没有吧loss 定义进去。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
torch的with torch.no_grad() 不会让我们反过来传播,也就是不回更新weight。 这样我们进行evaluation… torch的with torch.no_grad() 不会让我们反过来传播,也就是不回更新weight。 这样我们进行evaluation的时候或更快。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
L1 和l2 的loss 是通过增加一个对weight 的选项进去loss 来对太大的weight 进行惩罚。 也就是weight… L1 和l2 的loss 是通过增加一个对weight 的选项进去loss 来对太大的weight 进行惩罚。 也就是weight 越大,这个value就会越大。 也就代表loss function的value就会越大。 来防治模型过度拟合。
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
L1 L2 就是在算loss的时候,在原本计算出来的loss,也就是neuron出来的A 和真实的value的差之上,增加的一个项目… L1 L2 就是在算loss的时候,在原本计算出来的loss,也就是neuron出来的A 和真实的value的差之上,增加的一个项目。 L1就是用的绝对值的和, L2 就是用的平方和。 目的是防止model过拟合。 也就是认为的增加loss 然后让一些本来看哪个weights太大了,就要搞他。 不要让它成显眼包。 weights的值越大,惩罚的就越厉害。  L3 就更恐怖了,直接私立方级别的惩罚,来防止model过拟合。 他更加强;
#l1 #l2 #l3 #loss #NN
🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️
Validation set 用来在训练的时候调整hyperparameter 可以从traisn set 里面划分一部分出来专门用来调整。 也就是20 和80 的vali 和train
#匯總今日內容