一个用纯Rust(不用C++)打造的仿Pytorch的玩具型AI框架(目前尚不成熟,请勿使用)。该项目不打算支持GPU--因后期可能要支持安卓等平台,不想受制于某(几)种非CPU设备。但可能会加入NEAT等网络进化的算法。
一部分原因是受到pytorch的影响,希望能写个和pytorch一样甚至更易用的AI框架;另一部分是希望本框架只触及(touch)一些关键的东西:
- only torch Rust --- 只用Rust(不用C++是因为其在复杂逻辑项目中容易写出内存不安全代码);也不打算支持Python接口);亦不用第三方lib(所以排除tch-rs),这样对跨平台支持会比较友好。
- only torch CPU --- 不用GPU,因要照顾多平台也不想被某个GPU厂商制约,且基于NEAT进化的网络结构也不太好被GPU优化(也省得考虑数据从CPU的堆栈迁移到其他设备内存的开销问题了)。
- only torch node --- 没有全连接、卷积、resnet这类先入为主的算子概念,具体模型结构均基于NEAT进化。
- only torch tensor --- 所有的数据类型都是内置类型tensor(实现可能会参考peroxide),不需要第三方处理库,如numpy,array或openBLAS(关于blas的一些说明)。
- only torch f32 --- 网络的参数(包括模型的输入、输出)不需要除了f32外的数据类型。
目前无人性化的文档。可直接看Rust自动生成的Api Doc即可。
(无)
-
pass-id实现后:
test_variable_node_initialization_and_set_value_for_forward_count_mechanism
和test_reset_graph_forward_cnt_for_forward_count_mechanism
和fn test_a_complete_case_for_forward_count_mechanism()
删除 -
graph反向传播中有些节点没有值需要过滤怎么添加(如多个output的网络结构)?
-
针对
loss1.backward(retain_graph=True)
和detach()
还有多output输出,多次backward的问题; -
ada_line还是有问题
-
对比Node_variable和Graph的测试,看看如何优化精简Graph的测试
-
Graph测试中该包含各种pub method的正确及错误测试
-
Graph测试中最好添加某个节点后,测试该节点还有其父节点的parents/children属性(又比如:同2个节点用于不同图的add节点,测试其parents/children属性是否正确)(Variable 节点无父节点)、“节点var1在图default_graph中重复”
-
add a
graph
for unit test to test the 多层的jacobi计算,就像ada_line那样? -
各种assign类的op(如:add_assign)是否需要重载而不是复用基本算子?
-
在python中仿造ada_Line构造一个复合多节点,然后基于此在rust中测试这种复合节点,已验证在复合多层节点中的反向传播正确性
-
jacobi到底该测试对parent还是children?
-
how to expose only
in crate::nn
to the nn::Graph`? -
should completely hide the NodeHandle?
-
Graph/NodeHandle rearrange blocks due to visibility and funciontality
-
NodeHandle重命名为Node? 各种
parent/children/node_id
重命名为parents/children/id
? -
should directly use
parents
but notparents_ids
? -
unit test for Graph, and parent/children
-
unit test for each current module methods
-
check other unused methods
-
draw_graph(graphvis画图)
-
save/load网络模型(已有test_save_load_tensor)
-
后期当NEAT,可以给已存在节点添加父子节点后,需要把现有节点检测再完善下;
-
当后期(NEAT阶段)需要在一个已经forwarded的图中添加节点(如将已经被使用过的var1、var2结合一个新的未使用的var3构建一个add节点),可能需要添加一个
reset_forward_cnt
方法来保证图forward的一致性。 -
NEAT之后,针对图backward的
loss1.backward(retain_graph=True)
和detach()
机制的实现(可在GAN和强化学习算法实例中针对性实现测试),可能须和forward_cnt
机制结合, 还要考虑一次forward后多次backward()后的结果。 -
Tensor 真的需要uninit吗?
-
各种命名规范“2维”,“二维”,“二阶”,“2阶”,“一个”,“两个”,“三个”,“需要”,“需”,“须要”,“须”,“值/value”,"变量/variable","node/handle",“注/注意:”,”dim/dimension/rank“,"维/阶",","改为", ","仍然"改为”仍“
-
根据matrixSlow+我笔记重写全部实现!保证可以后期以NEAT进化,能ok拓展至linear等常用层,还有detach,,容易添加edge(如已存在的add节点的父节点),。
-
等ada_line例子跑通后:
Variable
节点做常见的运算重载(如此便不需要用那些丑陋的节点算子了) -
图错误“InvalidOperation” vs “ComputationError”
-
parent.borrow_mut()
或.children_mut()
改变后如何保证其matrix形状是合法的该节点运算后matrix? -
Tensorlei的index将
[[
优化成[
? -
Tensor类的
slice(&[0..m, j..j+1])
是否需要? -
children_mut
是否可合并至children()
? andvalue_mut
是否可合并至value
? -
fn as_node_enum(&self) -> NodeEnum
trait method 是否多余,对于具体实现的节点,可否隐式转换或直接各节点返回NodeEnum?(只要不要影响后期各种算子的重载)? -
use approx::assert_abs_diff_eq; need or not?
-
使用f16代替f32?
目前需要先解决有没有的问题,而不是好不好
- [] 实现类似tch-rs中
tch::no_grad(|| {});
的无梯度功能; - [] 常用激活函数,tanh,Softplus,sech
- [] 基于本框架解决XOR监督学习问题
- [] 基于本框架解决Mnist(数字识别)的监督学习问题
- [] 基于本框架解决CartPole(需要openAI Gym或相关crate支持)的深度强化学习问题
- [] 尝试实现下CFC
(较为成熟的3方库)
-
用纯numpy写各类机器学习算法 (自动微分参考)
-
[]
- scryer-prolog--Rust逻辑推理库
- vampire:自动证明器
- 那迷人的被遗忘的语言:Prolog
- 结合prolog和RL
- prolog与4证人难题
- logic+mL提问- prolog解决数度问题
- 贝叶斯与逻辑推理
- 用一阶逻辑辅佐人工神经网络
- 二阶逻辑杂谈
- 关于二阶逻辑的概念问题
- 书:《The Book of Why》
- 书:《Causality:Models,Reasoning,and Inference》
- 知乎:因果推断杂谈
- 信息不完备下基于贝叶斯推断的可靠度优化方法
- 贝叶斯网络中的因果推断
- Sac用以复合Action
- EfficientZero
- [EfficientZero Remastered]
- SpeedyZero
- LightZero系列
- 随机MuZero代码
- Redeeming Intrinsic Rewards via Constrained Optimization
- Learning Reward Machines for Partially Observable Reinforcement Learning
- combo代码
- 2023最新model-based offline算法:MOREC
- 众多model-base/free的offline算法
- model-free offline算法:MCQ解析
- RL论文列表(curiosity、offline、uncertainty,safe)
- 代替Gym的综合库
- 动手学深度学习-李沐著
- openMMLab-Yolo
- GRU解释
- 基于人类语音指挥的AI
- webGPT会上网的gpt
- LeCun的自监督世界模型
- awesome Rust
- 去雾算法
- rust人工智能相关的项目
本项目遵循MIT协议(简言之:不约束,不负责)。