LoginSignup
1
0

More than 1 year has passed since last update.

Pythonが嫌いなのでC++版のPytorchで画像認識をやってみる 3日目

Last updated at Posted at 2022-07-30

昭和のおじさんは動じない

前回から日が開いてしまった。
↓このエラーメッセージで躓いた。
image.png
おそらく親クラスかメンバ変数の中にテンプレートがあって、インスタンス生成時にエラーが出る可能性が高いのだろう。要するにメモリサイズが不定なわけだ。こんなものは動的メモリ確保で一発である。昭和のおじさんはこんなエラーメッセージで動じないのだ。

new宣言してやればいい

動的メモリ確保は変数をポインタにしてコンストラクタでnew宣言してやればいい。newでメモリ確保したら、使用後はdeleteで開放してやる。メモリをきっちり管理するのはプログラミングの基本だ。

c++
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++にあったっけ・・・
エラーメッセージにあった記述↓もひっかかる。
image.png
nullptrなんて予約語は知らない。

公式サンプル

コードが適当になってきたので、このまま進むのは危ない。やはり先人の知恵を借りたい。というわけでサンプルコードを検索してみたら公式サンプルらしきものが出てきたぞ。↓
https://github.com/nuka137/pytorch-cpp-example/tree/6d82b0240af6cb33af015e30b01ee3f0fc3deec2/resnet/cpp

今日はここまで
つづく

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0