DiNN学习笔记2-代码部分
整体流程1.设置函数 our_default_gate_bootstrapping_parameters()函数 new_random_gate_bootstrapping_secret_keyset()
2.读入数据3.初始化变量4.进行同态预测隐藏层的计算输出层的计算
5.测试结果统计6.释放空间参考资料
整体流程
函数整体流程图如下:
1.设置
设置步骤整体流程如下:
参数准备和初始化步骤中初始化了如下参数:
函数 our_default_gate_bootstrapping_parameters()
函数位置:cpp/nn.cpp输入参数:int minimum_lambda //安全系数 λ返回值:TFheGateBootstrappingParameterSet //自举密钥参数的结构体
const int32_t ks_tconst int32_t ks_basebitconst LweParams *const in_out_params //LWE 参数const TGswParams *const tgsw_params //TGSW 参数 函数功能:自举密钥参数集设置函数步骤:
安全参数超过128报错:仅支持128比特的安全性进行基本参数初始化
n-LWE的维度:static const int n = SEC_PARAMS_n //600N-LWE的维度:static const int N = SEC_PARAMS_N //1024多项式次数k:static const int k = SEC_PARAMS_k //1安全参数的标准差:static const double max_stdev = SEC_PARAMS_STDDEV //pow(2., -20) 进行自举所需参数初始化
自举密钥的基:static const int bk_Bgbit = SEC_PARAMS_BK_BASEBITS //10自举密钥的长度:static const int bk_l = SEC_PARAMS_BK_LENGTH //3自举密钥的标准差:static const double bk_stdev = SEC_PARAMS_BK_STDDEV //pow(2., -36) 进行密钥转换所需参数初始化
密钥转换密钥的基:static const int ks_basebit = SEC_PARAMS_KS_BASEBITS //1密钥转换密钥的长度:static const int ks_length = SEC_PARAMS_KS_LENGTH //18密钥转换密钥的标准差:static const double ks_stdev = SEC_PARAMS_KS_STDDEV //pow(2., -25) 使用之前初始化的参数形成 LWE, TLWE, TGSW 的参数集
LweParams *params_in = new_LweParams(n, ks_stdev, max_stdev)TLweParams *params_accum = new_TLweParams(N, k, bk_stdev, max_stdev)TGswParams *params_bk = new_TGswParams(bk_l, bk_Bgbit, params_accum) 形成垃圾回收站GC
TfheGarbageCollector::register_param(params_in)TfheGarbageCollector::register_param(params_accum)TfheGarbageCollector::register_param(params_bk) 形成并返回结构体
return new TFheGateBootstrappingParameterSet(ks_length, ks_basebit, params_in, params_bk)
函数 new_random_gate_bootstrapping_secret_keyset()
函数位置:*cpp/tfhe/tfhe_gate_bootstrapping.cpp输入参数:const TFheGateBootstrappingParameterSet *params //自举密钥参数返回值:TFheGateBootstrappingSecretKeySet //自举密钥的结构体
const TFheGateBootstrappingParameterSet* const params //参数集合const LweBootstrappingKey* const bk //自举密钥const LweBootstrappingKeyFFT* const bkFFT //自举密钥 FFT 形式const LweKey* lwe_key //LWE 密钥const TGswKey* tgsw_key //TGSW 密钥 函数功能:生成一个随机的自举密钥函数步骤:
生成 LWE 密钥
调用 new_LweKey():使用参数 in_out_params调用 lweKeyGen() 生成 TGSW 密钥
调用 new_TGswKey():使用参数 tgsw_params调用 tGswKeyGen() 生成自举密钥
调用 new_LweBootstrappingKey():使用参数 ks_t, ks_basebit, in_out_params, tgsw_params调用 tfhe_createLweBootstrappingKey() 生成自举密钥的 FFT 形式:LweBootstrappingKeyFFT *bkFFT = new_LweBootstrappingKeyFFT(bk)
2.读入数据
读入数据步骤整体流程如下:
用于神经网络的图像数据、神经元中的权重与偏置、正确的标签,均由对应文件读入
3.初始化变量
进行一些相关变量的初始化
4.进行同态预测
进行同态预测步骤整体流程如下:
该方案中神经网络的拓扑结构:
该方案的整体流程:
隐藏层的计算
输出层的计算
5.测试结果统计
测试结果统计步骤整体流程如下:
该步骤进行结果的统计和输出
6.释放空间
释放空间步骤整体流程如下:
参考资料
代码:https://github.com/mminelli/dinn
本文仅供个人学习使用
1024凑个热闹