6个版本
0.1.5 | 2023年11月15日 |
---|---|
0.1.4 | 2023年11月13日 |
0.1.2 | 2023年10月11日 |
#73 in 机器学习
1MB
26K SLoC
RayBNN
RayBNN:一个三维生物神经网络迁移学习模型
系统要求
- RTX 3090或更强大的显卡,至少24GB VRAM
- 32GB RAM
- 20 GB磁盘空间
- Docker (https://docker.net.cn/)
- Rust (https://rust-lang.net.cn/)
- Arrayfire (https://github.com/arrayfire/arrayfire)
- Arrayfire Rust (https://github.com/arrayfire/arrayfire-rust)
- Pytorch (https://pytorch.ac.cn/)
- Pytorch geometric (https://github.com/pyg-team/pytorch_geometric)
- Matlab
重要功能
球状细胞碰撞函数,用于生成球体并删除碰撞细胞
RayBNN/src/physics/initial_f32.rs
sphere_cell_collision_batch()
:批量生成球体并检测细胞碰撞。所有细胞同时进行检查sphere_cell_collision_serial()
:生成球体并按顺序检测细胞碰撞。每个细胞逐个进行检查sphere_cell_collision_minibatch()
:生成球体并在小批量中检测细胞碰撞。检查细胞组/小批量
输入神经元分配
RayBNN/src/physics/initial_f32.rs
create_spaced_input_neuron_on_sphere()
:为大小为(Nx,Ny)的2D图像在球面上创建输入神经元create_spaced_input_neuron_on_sphere_1D()
:为具有随机神经元位置分配的1D数据在球面上创建输入神经元
光线追踪算法
RayBNN/src/physics/raytrace_f32.rs
RT1_random_rays()
:创建神经网络连接的射线追踪算法1。随机生成具有可变数量随机射线的随机方向射线RT2_directly_connected()
:创建神经网络连接的射线追踪算法2。同时连接神经网络球体内的所有神经元RT3_distance_limited_directly_connected()
:创建神经网络连接的射线追踪算法3。连接minibatch/神经元组内的所有神经元
神经网络训练算法
RayBNN/src/neural/network_f32.rs
state_space_forward_batch()
:使用CSR加权邻接稀疏矩阵和UAF进行前向传递。生成所有内部状态和神经网络输出state_space_backward_group2()
:使用CSR加权邻接稀疏矩阵和UAF进行反向传递。生成稀疏加权邻接矩阵的梯度
安装指南
1. 在宿主机上。将RayBNN.zip放入$RAYBNN_DIR并解压。
将$RAYBNN_DIR环境变量设置为一个文件夹,用于存储所有RayBNN文件
例如,将$RAYBNN_DIR设置为/opt/
export RAYBNN_DIR=/opt/
将RayBNN.zip放入$RAYBNN_DIR并解压以生成
- $RAYBNN_DIR/RayBNN/src/
- $RAYBNN_DIR/RayBNN/examples/
- $RAYBNN_DIR/RayBNN/matlab_plot/
- $RAYBNN_DIR/RayBNN/python_verify/
2. 确保宿主机上已安装Matlab。
确保宿主系统上已安装Matlab。已在Matlab 2023a上进行测试
3. 在宿主机上。从Nvidia下载CUDA Docker容器
这将下载一个CUDA Docker容器,并将宿主机上的$RAYBNN_DIR目录链接到Docker容器中的/workspace/目录。
docker run --name raybnn \
--gpus all \
-v $RAYBNN_DIR:/workspace \
-w /workspace \
-it nvcr.io/nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04 bash
4. 在Docker容器内,验证GPU已检测到且CUDA为12.1
请注意,您需要一个24 GB或更大VRAM的GPU才能运行所有代码。RayBNN已在RTX3090上测试。验证GPU是否已检测到
nvidia-smi
5. 在Docker容器内,安装依赖项并安装RayBNN
./install.sh
在docker容器内安装所有依赖项。
cd /workspace/RayBNN
chmod 700 ./install.sh
bash ./install.sh
exit
6. 安装Docker容器以运行其他模型
下载pytorch docker容器,已在RTX 3090和i5-8400上测试
docker run --name othermodel \
--gpus all \
-v $RAYBNN_DIR:/workspace \
-w /workspace \
-it pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime bash
pip install scikit-learn matplotlib pandas pytorch-lightning==1.9.0
pip install torch_geometric
pip install pyg_lib torch_scatter \
torch_sparse torch_cluster \
torch_spline_conv \
-f https://data.pyg.org/whl/torch-1.13.0+cu116.html
apt update
apt install wget git curl git-lfs
exit
在论文中重现结果
批量重现结果
在宿主机上,重新启动Docker容器
docker restart raybnn
docker exec -it raybnn bash
cd /workspace/RayBNN
bash run_results_rust.sh
exit
docker restart othermodel
docker exec -it othermodel bash
cd /workspace/RayBNN
bash run_results_fig4_other_models.sh
exit
bash plot_results_matlab.sh
重现单个结果
在宿主机上,重新启动Docker容器
docker restart raybnn
docker exec -it raybnn bash
cd /workspace/RayBNN
绘制图1b,一个简单神经网络的示例
相关脚本位于
RayBNN/examples/figure1b.rs
RayBNN/matlab_plot/figure1b_plot.m
图1b是一个具有射线追踪连接的简单神经网络的示例
在Docker容器内,生成包含整个神经网络的./figure1_neural_network.csv
cd /workspace/RayBNN
cargo run --example figure1b --release
mv *.csv ./matlab_plot/
在宿主机上,使用Matlab绘制./figure1_neural_network.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure1b_plot.m
绘制图2a 测量细胞密度和碰撞概率
相关脚本位于
RayBNN/examples/figure2a.rs
RayBNN/matlab_plot/figure2a_plot.m
神经网络球体半径保持不变,而细胞数量变化。这允许我们绘制细胞密度与细胞碰撞概率的关系图
在Docker容器内,生成./initial_cell_num.csv ./final_neuron_num.csv ./final_glia_num.csv ./collision_run_time.csv
cd /workspace/RayBNN
cargo run --example figure2a --release
mv *.csv ./matlab_plot/
在宿主机上,使用Matlab绘制./initial_cell_num.csv ./final_neuron_num.csv ./final_glia_num.csv ./collision_run_time.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure2a_plot.m
绘制图2b 测量各种碰撞检测算法的运行时间
相关脚本位于
RayBNN/examples/figure2b.rs
RayBNN/matlab_plot/figure2b_plot.m
该代码运行了串行、小批量和大批量版本的细胞碰撞检测。它比较了这些算法的运行时间
Docker容器内,生成 ./collision_run_time.csv ./collision_run_time_serial.csv ./collision_run_time_batch.csv
cd /workspace/RayBNN
cargo run --example figure2a --release
cargo run --example figure2b --release
mv *.csv ./matlab_plot/
在主机机器上,使用Matlab绘制 ./collision_run_time.csv ./collision_run_time_serial.csv ./collision_run_time_batch.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure2b_plot.m
绘制图2c,细胞分布与半径的关系
相关脚本位于
RayBNN/examples/figure2c.rs
RayBNN/matlab_plot/figure2c_plot.m
此代码在半径为739.81的网络中生成240,000个神经元和240,000个胶质细胞。目的是绘制细胞分布与半径的关系
Docker容器内,生成 ./neuron_pos.csv ./glia_pos.csv
cd /workspace/RayBNN
cargo run --example figure2c --release
mv *.csv ./matlab_plot/
在主机机器上,使用Matlab绘制 ./neuron_pos.csv ./glia_pos.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure2c_plot.m
绘制图2d,各种光线追踪算法的运行时间
相关脚本位于
RayBNN/examples/figure2d.rs
RayBNN/matlab_plot/figure2d_plot.m
此代码测试了RT-1、RT-2和RT-3的运行时间。RT-3具有20、40和60个神经元半径的变量
Docker容器内,生成所有csv文件
cd /workspace/RayBNN
cargo run --example figure2d --release
mv *.csv ./matlab_plot/
在主机机器上,使用Matlab绘制 ./RT1_run_time.csv ./RT2_run_time.csv ./RT3_20_run_time.csv ./RT3_40_run_time.csv ./RT3_60_run_time.csv ./neuron_num_list.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure2d_plot.m
绘制图2e,光线长度的概率密度函数
相关脚本位于
RayBNN/examples/figure2e.rs
RayBNN/matlab_plot/figure2e_plot.m
此代码使用RT-3绘制光线长度的概率密度函数,并与神经网络球体的密度进行比较
Docker容器内,生成所有csv文件
cd /workspace/RayBNN
cargo run --example figure2e --release
mv *.csv ./matlab_plot/
在主机机器上,使用Matlab绘制 ./WRowIdxCOO_*.csv ./WColIdx_*.csv ./neuron_pos_*.csv ./neuron_idx_*.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure2e_plot.m
绘制图2f,每个神经元的连接数概率密度函数
相关脚本位于
RayBNN/examples/figure2f.rs
RayBNN/matlab_plot/figure2f_plot.m
此代码使用RT-3绘制每个神经元的连接数的概率密度函数,并与神经网络球体的密度进行比较
Docker容器内,生成所有csv文件
cd /workspace/RayBNN
cargo run --example figure2f --release
mv *.csv ./matlab_plot/
在主机机器上,使用Matlab绘制 ./WRowIdxCOO_*.csv ./WColIdx_*.csv ./neuron_pos_*.csv ./neuron_idx_*.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure2f_plot.m
绘制图3b和3c,权重和删除权重的概率分布
相关脚本位于
RayBNN/examples/figure3b.rs
RayBNN/matlab_plot/figure3b_plot.m
RayBNN/matlab_plot/figure3c_plot.m
此代码训练一个神经网络,并以概率删除5%的最小权重。绘制权重分布和删除的权重
Docker容器内,生成所有csv文件
cd /workspace/RayBNN
cargo run --example figure3b --release
mv *.csv ./matlab_plot/
在主机机器上,使用Matlab绘制 ./before_delete_WRowIdxCOO.csv ./before_delete_WColIdx.csv ./before_delete_WValues.csv ./after_delete_WRowIdxCOO.csv ./after_delete_WColIdx.csv ./after_delete_WValues.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure3b_plot.m
matlab -r figure3c_plot.m
绘制图3d、3e和3f,稀疏性、UAF和加权邻接矩阵
相关脚本位于
RayBNN/examples/figure3d.rs
RayBNN/matlab_plot/figure3d_plot.m
RayBNN/matlab_plot/figure3e_plot.m
RayBNN/matlab_plot/figure3f_plot.m
此代码训练一个神经网络并绘制权重的稀疏性。它还绘制了UAF和加权邻接矩阵
Docker容器内,生成所有csv文件
cd /workspace/RayBNN
cargo run --example figure3d --release
mv *.csv ./matlab_plot/
在主机机器上,使用Matlab绘制 ./sparsenetwork_*.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure3d_plot.m
matlab -r figure3e_plot.m
matlab -r figure3f_plot.m
绘制图4
运行RayBNN对Alcala数据集进行测试
室内定位平台上的Alcala数据集
https://web.archive.org/web/20211130114720/http://indoorlocplatform.uji.es/
相关脚本位于
RayBNN/examples/figure4_raybnn.rs
RayBNN/matlab_plot/figure4a_plot.m
RayBNN/matlab_plot/figure4b_plot.m
RayBNN/matlab_plot/figure4c_plot.m
RayBNN/matlab_plot/figure4d_plot.m
RayBNN/matlab_plot/figure4e_plot.m
RayBNN/matlab_plot/figure4f_plot.m
在图4中对Alcala数据集进行10折测试。请注意,CUDA在运行时编译内核,所以第一次运行较慢。在RTX 3090和i5-8400上测试
Docker容器内,生成所有csv文件
cd /workspace/RayBNN
cargo run --example figure4_raybnn --release
mv *.csv ./matlab_plot/
在主机机器上,使用Matlab绘制 ./info_*.csv ./test_act_*.csv ./test_pred_*.csv
cd $RAYBNN_DIR/RayBNN/matlab_plot/
matlab -r figure4a_plot.m
matlab -r figure4b_plot.m
matlab -r figure4c_plot.m
matlab -r figure4d_plot.m
matlab -r figure4e_plot.m
matlab -r figure4f_plot.m
运行其他Pytorch代码对Alcala数据集进行测试
在宿主机上,重新启动Docker容器
docker restart othermodel
docker exec -it othermodel bash
cd /workspace/RayBNN
运行CNN模型对Alcala数据集进行测试
运行CNNRSSI.py代码进行10折测试的示例
Docker容器内,生成所有.dat文件
cd /workspace/RayBNN/python_verify/RSSI2/
python3 ./All_run.py CNNRSSI.py
python3 ./getresult.py
运行GCN2模型对Alcala数据集进行测试
运行GCN2RSSI.py代码进行10折测试的示例
Docker容器内,生成所有.dat文件
cd /workspace/RayBNN/python_verify/RSSI2/
python3 ./All_run.py GCN2RSSI.py
python3 ./getresult.py
运行LSTM模型对Alcala数据集进行测试
运行LSTMRSSI.py代码进行10折测试的示例
Docker容器内,生成所有.dat文件
cd /workspace/RayBNN/python_verify/RSSI2/
python3 ./All_run.py LSTMRSSI.py
python3 ./getresult.py
运行MLP模型对Alcala数据集进行测试
运行MLPRSSI.py代码进行10折测试的示例
Docker容器内,生成所有.dat文件
cd /workspace/RayBNN/python_verify/RSSI2/
python3 ./All_run.py MLPRSSI.py
python3 ./getresult.py
运行GCN2LSTM模型对Alcala数据集进行测试
运行GNNLSTMRSSI.py代码进行10折测试的示例
Docker容器内,生成所有.dat文件
cd /workspace/RayBNN/python_verify/RSSI2/
python3 ./All_run.py GNNLSTMRSSI.py
python3 ./getresult.py
运行BILSTM模型对Alcala数据集进行测试
运行BILSTMRSSI.py代码进行10折测试的示例
Docker容器内,生成所有.dat文件
cd /workspace/RayBNN/python_verify/RSSI2/
python3 ./All_run.py BILSTMRSSI.py
python3 ./getresult.py
依赖关系
~8.5MB
~162K SLoC