昭和のおじさんは動じない
前回から日が開いてしまった。
↓このエラーメッセージで躓いた。
おそらく親クラスかメンバ変数の中にテンプレートがあって、インスタンス生成時にエラーが出る可能性が高いのだろう。要するにメモリサイズが不定なわけだ。こんなものは動的メモリ確保で一発である。昭和のおじさんはこんなエラーメッセージで動じないのだ。
new宣言してやればいい
動的メモリ確保は変数をポインタにしてコンストラクタでnew宣言してやればいい。newでメモリ確保したら、使用後はdeleteで開放してやる。メモリをきっちり管理するのはプログラミングの基本だ。
class Net : torch::nn::Module
{
public:
torch::nn::Conv2d* conv1;
torch::nn::MaxPool2d* pool;
torch::nn::Conv2d* conv2;
torch::nn::Linear* fc1;
torch::nn::Linear* fc2;
Net();
~Net();
};
Net::Net()
{
torch::nn::Module();
conv1 = new torch::nn::Conv2d(1, 6, 5);
pool = new torch::nn::MaxPool2d(torch::nn::MaxPool2dOptions({2, 2}));
conv2 = new torch::nn::Conv2d(6, 16, 5);
fc1 = new torch::nn::Linear(16 * 16, 64);
fc2 = new torch::nn::Linear(64, 10);
}
Net::~Net()
{
delete conv1;
delete pool;
delete conv2;
delete fc1;
delete fc2;
}
int main()
{
Net net1;
std::cout << *net1.conv1 << std::endl;
std::cout << *net1.pool << std::endl;
std::cin.get();
}
↓コンパイルエラーも出ないし、リンクも正常。実行時エラーも出ない。
昭和のおじさんは動的メモリ確保など朝飯前なのだ。
E:\Programing\TorchProject1\TorchProject1\x64\Debug>TorchProject1.exe
torch::nn::Conv2d(1, 6, kernel_size=[5, 5], stride=[1, 1])
torch::nn::MaxPool2d(kernel_size=[2, 2], stride=[2, 2], padding=[0, 0], dilation=[1, 1], ceil_mode=false)
E:\Programing\TorchProject1\TorchProject1\x64\Debug>
コードが美しくない
それにしてもコードが美しくない。メンバ変数の型の種類が多すぎるような気がする。ストリーム演算子はうまくオーバーロード機能が働いているようだが気持ち悪い。継承しているなら共通している親クラスがあるだろう。変数は正しい型で記述するのがCの作法である。昭和のおじさんは行儀が良いのだ。実はMaxPool2dOptionsてのはGoogle先生にきいて出てきたコードをコピペしただけで意味が分かっていない。{2,2}みたいな記述も気になる。こんな表現C++にあったっけ・・・
エラーメッセージにあった記述↓もひっかかる。
nullptrなんて予約語は知らない。
公式サンプル
コードが適当になってきたので、このまま進むのは危ない。やはり先人の知恵を借りたい。というわけでサンプルコードを検索してみたら公式サンプルらしきものが出てきたぞ。↓
https://github.com/nuka137/pytorch-cpp-example/tree/6d82b0240af6cb33af015e30b01ee3f0fc3deec2/resnet/cpp
今日はここまで
つづく