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

#匯總今日內容