Minitorch-1
Minitorch-1 Fundamentals 基础
Task 0.1 Operators
第一关是完成一些简单的函数。需要注意下 relu 的定义。
此外还有 xx_back 系列函数,指的是反向传播的求导:d×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 可以导入这个包,一开始没有运行:
最后成功:
试了一下 Torch Example的几个简单任务,Module 0还没有 train 的选项,因为我们还没做到,不过这是最初的一步!