6个版本

0.1.5 2023年11月15日
0.1.4 2023年11月13日
0.1.2 2023年10月11日

#73 in 机器学习

GPL-3.0-only

1MB
26K SLoC

Rust 24K SLoC // 0.2% comments Python 1.5K SLoC // 0.0% comments Objective-C 1K SLoC Shell 149 SLoC // 0.3% comments

RayBNN

RayBNN:一个三维生物神经网络迁移学习模型

系统要求

重要功能

球状细胞碰撞函数,用于生成球体并删除碰撞细胞

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