跳转至

Minitorch-1 Fundamentals 基础#

Task 0.1 Operators#

第一关是完成一些简单的函数。需要注意下 relu 的定义。

此外还有 xx_back 系列函数,指的是反向传播的求导:\(d \times f’(x)\)​,一开始没看懂什么意思。

Task 0.2 Testing and Debuging#

第二关要完成 tests/test_operators.py 下面的测试函数

在做 test_sigmod 的时候遇到精度问题:测试函数递增性的时候怎么都过不了,想出直接排除掉相近的结果,不知道是否可行?

if math.fabs(sigmoid(a) - sigmoid(b)) > 1e-6:
    assert sigmoid(a) < sigmoid(b) if a < b else sigmoid(a) > sigmoid(b)

Task 0.3 Functional Python 函数式编程#

第三关涉及到 python 的高级特性,因为之前没有用过 python 的高阶用法,有点难度。

map 将第一个函数 作用于 后面的 list,并且每次调用是传递 list 的一个值并修改

def square(x: float) -> float:
    return x ** 2
res = map(square, [1, 2, 3, 4, 5])
print(list(res))
# [1, 4, 9, 16, 25]

Callable 类型提示:可以理解为限定了参数和返回值的函数

from typing import Callable

# 使用Callable类型提示
def operate_on_two_integers(op: Callable[[int, int], int], a: int, b: int) -> int:
    return op(a, b)

# 符合上面的 op 的一个实例
def add(x: int, y: int) -> int:
    return x + y
result = operate_on_two_integers(add, 2, 3)
print(result)
# 5

Iterable 类型:可以迭代的类型:

def print_elements(elements: Iterable) -> None:
    for element in elements:
        print(element)

最后是装饰器,把一个处理值的函数变成处理 list->list 的函数:

先看返回值,根据返回值写出改返回的函数(如 process),然后再考虑怎么写这个函数内容。

def map(fn: Callable[[float], float]) -> Callable[[Iterable[float]], Iterable[float]]:
    def process(ls: Iterable[float]) -> Iterable[float]:
        return [fn(x) for x in ls]
    return process

一旦学会了这种装饰器写法后面的就简单了

Task 0.4 Modules#

第四关是完成一棵树,读一下 class module 和 class parameter 就知道在干嘛了。

主要都是用到递归的写法,不过要稍微注意一下 named_parameters,它有独特的命名规则,写的不是很清楚,需要去 test_module.py 看它需要的命名规则是什么。

Task 0.5 Visualization 可视化#

第五关可以运行一个交互式应用:

streamlit run app.py -- 0

不过会报ModuleNotFoundError: No module named 'altair.vegalite.v4'错误,是因为最新版是 v5,没有安装 v4 版本,需要 pip install --upgrade altair==4

成功运行之后发现导入失败:ModuleNotFoundError: No module named 'minitorch'

应该是包未安装,研究发现应该运行:python -m pip install -Ue .这个是更新minitorch 包的命令,从而让 streamlit 可以导入这个包,一开始没有运行:

image-20240711114137559

最后成功:

image-20240711115647859

试了一下 Torch Example的几个简单任务,Module 0还没有 train 的选项,因为我们还没做到,不过这是最初的一步!