import torch\n\
import torch.nn as nn\n\
\n\
model = nn.Sequential(\n\
nn.Linear(32,16),\n\
nn.ReLU(),\n\
nn.Linear(16,8),\n\
nn.ReLU()\n\
)\n\
\n\
criterion = nn.MSELoss()\n\
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)\n\
\n\
x=torch.randn(2,32)\n\
y=torch.randn(2,8)\n\
\n\
for i in range(500):\n\
y_pred = model(x)\n\
loss = criterion(y_pred,y)\n\
optimizer.zero_grad()\n\
loss.backward()\n\
optimizer.step()\n\
\n\
model.eval()\n\
m = torch.jit.script(model)\n\
torch.jit.save(m,'PyTorchModel.pt')\n";
void TMVA_SOFIE_PyTorch(){
m.SaveSource(
"make_pytorch_model.py");
gSystem->Exec(
"python3 make_pytorch_model.py");
std::vector<size_t> inputTensorShapeSequential{2, 32};
std::vector<std::vector<size_t>> inputShapesSequential{inputTensorShapeSequential};
model.Generate();
model.OutputGenerated("PyTorchModel.hxx");
std::cout << "\n\n";
model.PrintRequiredInputTensors();
std::cout << "\n\n";
model.PrintInitializedTensors();
std::cout << "\n\n";
model.PrintIntermediateTensors();
std::cout << "\n\nTensor \"0weight\" already exist: " << std::boolalpha << model.CheckIfTensorAlreadyExist("0weight")
<< "\n\n";
std::vector<size_t> tensorShape = model.GetTensorShape("0weight");
std::cout << "Shape of tensor \"0weight\": ";
for (auto &it : tensorShape) {
std::cout << it << ",";
}
std::cout<<"\n\nData type of tensor \"0weight\": ";
std::cout<<"\n\n";
model.PrintGenerated();
}
Class supporting a collection of lines with C++ code.
RModel Parse(std::string filepath, std::vector< std::vector< size_t > > inputShapes, std::vector< ETensorType > dtype)
Parser function for translating PyTorch .pt model into a RModel object.
std::string ConvertTypeToString(ETensorType type)