合約量化系統(tǒng)開(kāi)發(fā)(量化Demo)丨量化合約系統(tǒng)開(kāi)發(fā)(規(guī)則分析)丨源碼
量化demo
1.轉(zhuǎn)換onnx模型
首先需要將torch模型轉(zhuǎn)換為onnx模型。轉(zhuǎn)換主要是兩種場(chǎng)景目的:轉(zhuǎn)換torchvision的預(yù)訓(xùn)練模型、轉(zhuǎn)換自定義模型。
轉(zhuǎn)換都是兩個(gè)步驟:加載模型和權(quán)重、調(diào)onnx接口轉(zhuǎn)換
model=models.vgg16(pretrained=True)就會(huì)將模型下載到相應(yīng)路徑
#coding=gbk
#由.pt導(dǎo)成.onnx
import torch
import torchvision.models as models
#定義模型和載入模型權(quán)重
#model=models.resnet18()#【改】定義model
#model=models.resnet50()
model=models.vgg16(pretrained=False)
model.load_state_dict(torch.load("/home/xxx/.cache/torch/hub/checkpoints/vgg16-397923af.pth"))#【改】model權(quán)重地址
##set the model to inference mode
model.eval()關(guān)于區(qū)塊鏈項(xiàng)目技術(shù)開(kāi)發(fā)威:yy625019
x=torch.randn(1,3,224,224)#生成張量
export_onnx_file="/home/xxx/model_optimization_tool/jm_log_quant/onnx_format_weight/vgg16.onnx"#【改】輸出ONNX權(quán)重地址
torch.onnx.export(model,
x,
export_onnx_file,
opset_version=10,
do_constant_folding=True,#是否執(zhí)行常量折疊優(yōu)化
input_names=["input"],#輸入名
output_names=["output"],#輸出名
dynamic_axes={"input":{0:"batch_size"},#批處理變量
"output":{0:"batch_size"}})
1)準(zhǔn)備數(shù)據(jù)集和原始o(jì)nnx模型
按照教程,要在當(dāng)前目錄新建working/data文件夾,將生成的數(shù)據(jù)集(格式為.npy)放在文件夾里。(視頻二還有另一種載入數(shù)據(jù)方式)
原始模型onnx放在working/文件夾
1.只想跑demo不管真實(shí)數(shù)據(jù),可以生成隨機(jī)數(shù)據(jù)集
#生成隨機(jī)數(shù)據(jù)集
import numpy as np
for i in range(32):
np.save(file=f'working/data/{i+1}',arr=np.random.random(size=[1,3,224,224]))
2.載入imagenet數(shù)據(jù)集
#載入ImageNet校準(zhǔn)數(shù)據(jù)集
import os
import torchvision.transforms as transforms
from PIL import Image
import numpy as np
import torch
input_path="xxxxxxx/xxxxx/x"#【改】數(shù)據(jù)集路徑
for file in os.listdir(input_path):
filename=os.fsdecode(file)
img=Image.open(os.path.join(input_path,filename)).convert('RGB')
scaler=transforms.Resize((224,224))
normalize=transforms.Normalize(mean=[0.485,0.456,0.406],
std=[0.229,0.224,0.225])
to_tensor=transforms.ToTensor()
device=torch.device("cpu")
image=normalize(to_tensor(scaler(img))).unsqueeze(0).to(device)
np.save(file=f'working/data/{filename[:-4]}',arr=image)#【改】注意圖像格式是.jpg還是.jpeg,.jpeg則filename[:-5]
print('{}已完成,進(jìn)度{}/{}'.format(filename[:-5],os.listdir(input_path).index(file),len(os.listdir(input_path)