2024-09-20, 21:40-今日內容

在Mac上实现nvim 查看latex ,我安装了mactex。 Skim要把latex 的文档跳转回到nvim的code。 shift和command 同时按,然后点击就可以了。 只要编写latex文档,就必须要用固定的 格式, 也就是document , 还有package。 如果要写数学公式 就要说: Torch再厉害,也需要用for循环。特别是在处理batch得时候:这是必要的而且时候很常见的。 Zip(*) 就是用来揭开包装的。 我们在定义模型的时候,是需要model和optimizer的 因为他是model的重要组件,也就是backpropogation的… torch得optimizer就是怎么更新weight 和bias的。 他需要知道model的parameter 还有我们每次更新… Torch的nn.Linear 就是做这个的scratch:特别牛逼, 你注意思考: 为什么我们调用这个class 还要加上括号。 我们的class不是不用加上括号。 因为加上括号才会让__init__被调用。 Torch的cross entropy就是帮我们实现了nll Pdb的用法。 C 是continue Ipython 里面可以用set trace 来追踪debug, 也就是jupyter notebook可以, 我的iron也可以… 还是不懂为什么range 可以写在array的index里面 如果定义了一个函数的写法, 但是又突发奇想,想给他起个另外的名字。 那么我们直接可以补血括号,把函数赋值给另一个varianle。… y=e^x 自己新建model 其实就是新建里从x 输入的data到weights 和bias。 然后loss 就可以了。 Log softmax的实现: Plt画出辅助线, 就用axhline 和axvline。 一个简单的例子: Loss 比如说是cross entropy loss , 其实是对所有的batch进行计算出来的一个mean的value 我们… 当我们对matrix进行了sum或者mean的操作,他就会把我们的batch的数据都压缩一个dim, 所以我们才会unsqueeze… Unsqueezed 事torch上面的新方法, 可以用来对某个指定的dim插入一个新维度1 。 比如说,如果之前的shape是1… Math 里面的exp 等等都是只能操作一个value的。 Torch里面如果你看到结尾是下划线结尾的,就是表示原地操作 in place operation。也就是直接修改,而不创建新对象… 如果要变更一个tensor,让他可以记录autograd ,那么就要调用weights.requires_grad_() Xavier initialization 的初始化的意思就是 1/sqrt(n) 也就是当28 * 28 的mnist的image… python 要用一些sqrt 等等,就要用math 这个import 想要非常光滑的normal distribution的图, 用scipy的stats 里面的pdf来当作y 就可以画出来 给很多变量外面加上()就相当于是告诉他, 我们现在可以iterable了。 Python 里面的内置函数map很有用,帮我们对多个参数进行某一个函数的转换: 不确定某个文件的格式, 可以在cml用file 来查看这个文件 也就是说一半我们request回来的数据都是要用byte 也就是二进制来写进去。是吗。我们看到request 用了get 和content… FILENAME = “mnist.pkl.gz”这首先是一个gzip的压缩文件。然后是python的序列化文件也就是pickle… 利用pathlib 也就是路径library 定义好path之后,我们只需要告诉他 创建路径就好了: 对于python的路径管理,以前都用的os。 现在有更方便的叫做pathlib。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

在Mac上实现nvim 查看latex ,我安装了mactex。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Skim要把latex 的文档跳转回到nvim的code。 shift和command 同时按,然后点击就可以了。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

只要编写latex文档,就必须要用固定的 格式, 也就是document , 还有package。 如果要写数学公式 就要说: amsmath

这里有个基本的结构: \documentclass{article} % 定义文档类型 \usepackage{amsmath} % 导入用于数学公式的包

\begin{document} % 开始文档内容

% 行内公式 $a^2 + b^2 = c^2$

% 独立公式 \begin{equation} E = mc^2 \end{equation}

\end{document} % 结束文档内容

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Torch再厉害,也需要用for循环。特别是在处理batch得时候:这是必要的而且时候很常见的。 losses, nums = zip( *[loss_batch(model, loss_func, xb, yb) for xb, yb in valid_dl] )既然torch 那么会操作tensor, 为什么还需要在这里用for语句呢

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Zip(*) 就是用来揭开包装的。 是不是因为这里的return是两个,所以我们才可以unpack

def loss_batch(model, loss_func, xb, yb, opt=None): loss = loss_func(model(xb), yb)

if opt is not None:
    loss.backward()
    opt.step()
    opt.zero_grad()

return loss.item(), len(xb) 你看就需要揭开包装:

import numpy as np

def fit(epochs, model, loss_func, opt, train_dl, valid_dl): for epoch in range(epochs): model.train() for xb, yb in train_dl: loss_batch(model, loss_func, xb, yb, opt)

    model.eval()
    with torch.no_grad():
        losses, nums = zip(
            *[loss_batch(model, loss_func, xb, yb) for xb, yb in valid_dl]
        )
    val_loss = np.sum(np.multiply(losses, nums)) / np.sum(nums)

    print(epoch, val_loss)

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

我们在定义模型的时候,是需要model和optimizer的 因为他是model的重要组件,也就是backpropogation的… 我们在定义模型的时候,是需要model和optimizer的 因为他是model的重要组件,也就是backpropogation的重要方法,也就是怎么更新weights和bias, 以及每次lr减去多少。 所以我们在定义了要return model和这个optimizer/

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

torch得optimizer就是怎么更新weight 和bias的。 他需要知道model的parameter 还有我们每次更新… torch得optimizer就是怎么更新weight 和bias的。 他需要知道model的parameter 还有我们每次更新的lr。 from scratch是这样的:

    with torch.no_grad():
        weights -= weights.grad * lr
        bias -= bias.grad * lr
        weights.grad.zero_()
        bias.grad.zero_()

我们直接可以用非常简单的一句话来说清楚这件事L: optimizer = opt.SGD(model.parameters(), lr=0.01) # lr 是学习率,可以根据需要调整

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Torch的nn.Linear 就是做这个的scratch:特别牛逼, 你注意思考: class Mnist_Logistic(nn.Module): def init(self): super().init() self.lin = nn.Linear(28 * 28, 10)

def forward(self, xb):
    return self.lin(xb)

scratch: class Mnist_Logistic(nn.Module): def init(self): super().init() self.weights = nn.Parameter(torch.randn(28 * 28, 10) / math.sqrt(28 * 28)) self.bias = nn.Parameter(torch.zeros(10))

def forward(self, xb):
    return xb @ self.weights + self.bias

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

为什么我们调用这个class 还要加上括号。 我们的class不是不用加上括号。 因为加上括号才会让__init__被调用。 只有在定义class的时候才不需要括号。 只有我们需要显示的继承一个class的时候才需要在定义class的时候加上括号

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Torch的cross entropy就是帮我们实现了nll 也就是negative log likelihood 我们可以直接用import torch.nn.functional as F 替换我们自己写的,防止出错。 他就算是高层封装了。 , loss_func = F.cross_entropy

def nll(input, target): return -input[range(target.shape[0]), target].mean()

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Pdb的用法。 C 是continue N是next b 行号是设置breakpoint s是进入函数内部 Q是退出debug。 直接输入变量的名字就可以查看value了

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Ipython 里面可以用set trace 来追踪debug, 也就是jupyter notebook可以, 我的iron也可以… Ipython 里面可以用set trace 来追踪debug, 也就是jupyter notebook可以, 我的iron也可以。 直接from Ipython.core.debugger import set_trace 就可以了。 这里有个例子:

from IPython.core.debugger import set_trace

lr = 0.5 # learning rate epochs = 2 # how many epochs to train for

for epoch in range(epochs): for i in range((n - 1) // bs + 1): # set_trace() start_i = i * bs end_i = start_i + bs xb = x_train[start_i:end_i] yb = y_train[start_i:end_i] pred = model(xb) loss = loss_func(pred, yb)

    loss.backward()
    with torch.no_grad():
        weights -= weights.grad * lr
        bias -= bias.grad * lr
        weights.grad.zero_()
        bias.grad.zero_()

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

还是不懂为什么range 可以写在array的index里面 import numpy as np

示例数据:一个3x3的二维数组

input = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]])

目标索引:表示每一行中我们感兴趣的列的索引

target = np.array([0, 2, 1])

使用 range() 生成行索引

indices = range(target.shape[0]) # [0, 1, 2]

使用行索引和列索引提取元素

selected_values = input[indices, target] # [1.0, 6.0, 8.0]

输出提取的元素

print(“Selected values:”, selected_values)

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

如果定义了一个函数的写法, 但是又突发奇想,想给他起个另外的名字。 那么我们直接可以补血括号,把函数赋值给另一个varianle。… 如果定义了一个函数的写法, 但是又突发奇想,想给他起个另外的名字。 那么我们直接可以补血括号,把函数赋值给另一个varianle。 这样另一个variable就是和这个函数一摸一样的了。 我们不屑括号的原因是,不想调用函数。 而是引用他。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

y=e^x 

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

自己新建model 其实就是新建里从x 输入的data到weights 和bias。 然后loss 就可以了。 def model(xb): return log_softmax(xb @ weights + bias)

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Log softmax的实现: def log_softmax(x): return x - x.exp().sum(-1).log().unsqueeze(-1) 你看, 这里的x其实是log(e(x)) 出来的, 你可以看到这里的sum减少了维度,unsqueeze又增加了维度。 对应到了batch的每一条数据 

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Plt画出辅助线, 就用axhline 和axvline。 一个简单的例子:

设置轴的范围为接近 0 的小范围

axis = np.linspace(-0.01, 40, 1000)

过滤掉零和负数值

plt.plot(axis, np.log(axis), label=’log(x)’) plt.axvline(x=0, color=’red’, linestyle=’–’, label=’x=0’) plt.axhline(y=0, color=’green’, linestyle=’–’, label=’y=0’) plt.xlabel(‘x’) plt.ylabel(‘log(x)’) plt.title(‘Logarithm Function Near Zero’) plt.legend() plt.show()

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Loss 比如说是cross entropy loss , 其实是对所有的batch进行计算出来的一个mean的value 我们… Loss 比如说是cross entropy loss , 其实是对所有的batch进行计算出来的一个mean的value 我们后来unsqueeze,才让每一个batch有了他们自己的mean。 我们计算出以来的log softmax其实就是loss function对吧。 我们算出来的value也是这些送进去的batch的mean对吧。 我们然后把这些mean送进去每一个数据条数了

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

当我们对matrix进行了sum或者mean的操作,他就会把我们的batch的数据都压缩一个dim, 所以我们才会unsqueeze… 当我们对matrix进行了sum或者mean的操作,他就会把我们的batch的数据都压缩一个dim, 所以我们才会unsqueeze, 在最后添加一个维度。 也就是帮我们的mean或者sum对每个batch 都有对应的value。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Unsqueezed 事torch上面的新方法, 可以用来对某个指定的dim插入一个新维度1 。 比如说,如果之前的shape是1… Unsqueezed 事torch上面的新方法, 可以用来对某个指定的dim插入一个新维度1 。 比如说,如果之前的shape是1, 如果unsqueeze(-1)那么,就是在最后一个dim插入一个dim是1. 现在的shape就从1 变成了(1, 1)

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Math 里面的exp 等等都是只能操作一个value的。 如果我们要对一组array 统一进行操作, 我们就要用np里面的exp这里有个简单的例子: import numpy as np import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100) plt.plot(x, np.exp(x))

添加标题和标签

plt.title(‘Exponential Function’) plt.xlabel(‘x’) plt.ylabel(‘exp(x)’)

显示图形

plt.show() 

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Torch里面如果你看到结尾是下划线结尾的,就是表示原地操作 in place operation。也就是直接修改,而不创建新对象… Torch里面如果你看到结尾是下划线结尾的,就是表示原地操作 in place operation。也就是直接修改,而不创建新对象,这样可以节约内存。 看到了就不要觉得奇怪了。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

如果要变更一个tensor,让他可以记录autograd ,那么就要调用weights.requires_grad_() 这是呼叫这个方法,让他开始记录。 直接呼叫weights.requires_grad是查看variable的value, 看他到底是不是true。 而不是呼叫方法。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Xavier initialization 的初始化的意思就是 1/sqrt(n) 也就是当28 * 28 的mnist的image… Xavier initialization 的初始化的意思就是 1/sqrt(n) 也就是当28 * 28 的mnist的image的n就是28 我们没有让mean是0, std是1. 而是利用了Xavier让std成了1/28 可以避免梯度消失和梯度爆炸。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

python 要用一些sqrt 等等,就要用math 这个import

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

想要非常光滑的normal distribution的图, 用scipy的stats 里面的pdf来当作y 就可以画出来 如果是要看实际的数据的random的normal distribution的散点图, 就用bin。 我们只需要给x就可以了,他会自己帮我们筛选落入每个bin的数量,成为y。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

给很多变量外面加上()就相当于是告诉他, 我们现在可以iterable了。 就是当我有四个东西需要包装的时候,我们就要自己手动的给他() 对吧。 让他可以用for或者别的function可以操作iterable的。 这有个例子: x_train, y_train, x_valid, y_valid = map( torch.tensor, (x_train, y_train, x_valid, y_valid) )

注意看我们给他搞成了一个iterable的东西了。 上面的函数相当: results = map(torch.tensor, (x_train, y_train, x_valid, y_valid)) x_train, y_train, x_valid, y_valid = results。 你注意看 揭开包装的过程, 很好玩。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

Python 里面的内置函数map很有用,帮我们对多个参数进行某一个函数的转换: x_train, y_train, x_valid, y_valid = map( torch.tensor, (x_train, y_train, x_valid, y_valid) )

你看这就相当于对每一个x和y都用了某一个torch.tensor(x_train)的方法。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

不确定某个文件的格式, 可以在cml用file 来查看这个文件 他会显示压缩信息,还有文件大小和格式。

In [21]: !file data/MNIST/mnist.pkl.gz data/MNIST/mnist.pkl.gz: gzip compressed data, was “mnist.pkl”, last modified: Thu Jan 14 17: 32:04 2010, max compression, original size modulo 2^32 220080342 约等于 220 M

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

也就是说一半我们request回来的数据都是要用byte 也就是二进制来写进去。是吗。我们看到request 用了get 和content… 也就是说一半我们request回来的数据都是要用byte 也就是二进制来写进去。是吗。我们看到request 用了get 和content 就知道回来的数据是bytes的二进制。 我们要写入他到文件的时候,就要用wb这个关键字,也就是write binary啦。 这有个简单的例子:

if not (PATH / FILENAME).exists(): content = requests.get(URL + FILENAME).content (PATH / FILENAME).open(“wb”).write(content)

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

FILENAME = “mnist.pkl.gz”这首先是一个gzip的压缩文件。然后是python的序列化文件也就是pickle… FILENAME = “mnist.pkl.gz”这首先是一个gzip的压缩文件。然后是python的序列化文件也就是pickle 泡菜格式。 (泡菜是二进制的格式哦)

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

利用pathlib 也就是路径library 定义好path之后,我们只需要告诉他 创建路径就好了: 是这样创建的: PATH.mkdir(parents=True, exist_ok=True)

也就是说,告诉他如果没有路径,创建路径。 如果已经存在这个路径,别报错。

🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️下一個筆記🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️🐿️

对于python的路径管理,以前都用的os。 现在有更方便的叫做pathlib。 具体就是我们只要说了一个path事这个pathlib下面的Path的一个对象。 那么我们就可以非常方便的用他overleaded的这个/来后续做一些操作了。 三大操作系统都支持哦 具体例子在这里: from pathlib import Path import requests

DATA_PATH = Path(“data”) DATA_PATH PATH = DATA_PATH / “mnist”

#匯總今日內容