区块链中的链式结构还有一些其他重要的特点和作用:
可追溯性:由于区块链中的每个区块都包含了前一个区块的哈希值,因此可以追溯到区块链的起始点。这使得交易和数据的来源可以被跟踪和验证,提高了透明度和可信度。
安全性:区块链中的链式结构提供了一种安全的存储和传输方式。由于每个区块都包含了前一个区块的哈希值,任何对数据的篡改都会导致哈希值的不匹配,从而被其他节点所发现。这样的设计使得区块链具有防篡改的特性,增强了数据的安全性。
数据共享和分发:区块链中的链式结构允许数据在网络中被共享和分发。每个参与节点都可以获得完整的区块链副本,从而保持数据的同步和一致性。这种去中心化的特点使得区块链具有高度的可靠性和抗故障能力。
int main(int argc,const char*argv[]){
if(argc<4){
DLOG(INFO)<<"Usage:./quantized.out src.mnn dst.mnn preTreatConfig.jsonn";
return 0;
}
const char*modelFile=argv[1];
const char*preTreatConfig=argv[3];
const char*dstFile=argv[2];
DLOG(INFO)<<">>>modelFile:"<<modelFile;
DLOG(INFO)<<">>>preTreatConfig:"<<preTreatConfig;
DLOG(INFO)<<">>>dstFile:"<<dstFile;
//加载待量化的模型
std::unique_ptr<MNN::NetT>netT;
{
std::ifstream input(modelFile);
std::ostringstream outputOs;
outputOs<<input.rdbuf();
netT=MNN::UnPackNet(outputOs.str().c_str());
}
//temp build net for inference
flatbuffers::FlatBufferBuilder builder(1024);
auto offset=MNN::Net::Pack(builder,netT.get());
builder.Finish(offset);
int size=builder.GetSize();
auto ocontent=builder.GetBufferPointer();
//model buffer for creating mnn Interpreter
std::unique_ptr<uint8_t>modelForInference(new uint8_t[size]);
memcpy(modelForInference.get(),ocontent,size);
std::unique_ptr<uint8_t>modelOriginal(new uint8_t[size]);
memcpy(modelOriginal.get(),ocontent,size);
netT.reset();
netT=MNN::UnPackNet(modelOriginal.get());
//quantize model's weight
DLOG(INFO)<<"Calibrate the feature and quantize model...";
//构建Calibration对象,负责量化
std::shared_ptr<Calibration>calibration(
new Calibration(netT.get(),modelForInference.get(),size,preTreatConfig));
//执行量化,更新参数为int8
calibration->runQuantizeModel();
//将量化的参数写入json文件
calibration->dumpTensorScales(dstFile);
DLOG(INFO)<<"Quantize model done!";
//保存量化后的模型
flatbuffers::FlatBufferBuilder builderOutput(1024);
builderOutput.ForceDefaults(true);
auto len=MNN::Net::Pack(builderOutput,netT.get());
builderOutput.Finish(len);
{
std::ofstream output(dstFile);
output.write((const char*)builderOutput.GetBufferPointer(),builderOutput.GetSize());
}
return 0;
}