📈

GNN使ってみてる話Part1

2024/11/24に公開

初心者なので仮想環境を構築するところから記録

使用するもの
Docker
ターミナル

(1)下準備

0.ターミナルを開く

1.作成した場所にプロジェクト用のファイルを作成

mkdir ファイル名(任意)

2.作成したファイルを開く

cd ファイル名(任意)

→もしもエラーが出てしまったら、path(場所を示すようなもの)を指定する

pathってはじめたてのころはわからなかった記憶がある。
pathpathっていろんなところに書いてあるけど、そのpathとやらが分からんのやとキレていた。

pathは概念を掴めば理解できた
ファイルaの中にファイルbがあったとする。
ターミナルでファイルbを開きたい場合は、

cd ファイルa/ファイルb

で開けちゃう〜〜〜

それでも分からない場合は

ls

って打つと一覧が出てくるから、そこから
cd 〇〇って広げてみればおけ

3.コードファイルを作成

次のコマンドでファイルを作成し、編集モードに入る

nano ファイル名(今回はperceptron.cpp)

4.先ほどのコードファイルにコードを記載

#include <iostream>
#include <cmath>
#include <vector>

// シグモイド関数
double sigmoid(double x) {
    return 1.0 / (1.0 + exp(-x));
}

// シグモイドの微分
double sigmoid_derivative(double x) {
    double sig = sigmoid(x);
    return sig * (1 - sig);
}

// トレーニングデータ
struct Data {
    double x1;
    double x2;
    double y; // ターゲット値
};

// 学習パラメータを最適化する関数
void train(std::vector<Data> &dataset, double &w1, double &w2, double &b, double learning_rate, int epochs) {
    for (int epoch = 0; epoch < epochs; ++epoch) {
        double total_loss = 0.0;

        for (const auto &data : dataset) {
            // フォワード計算
            double z = w1 * data.x1 + w2 * data.x2 + b;
            double y_pred = sigmoid(z);

            // 誤差
            double error = y_pred - data.y;

            // コスト関数(二乗誤差)
            total_loss += 0.5 * error * error;

            // 勾配の計算
            double grad_y_pred = error;
            double grad_z = grad_y_pred * sigmoid_derivative(z);
            double grad_w1 = grad_z * data.x1;
            double grad_w2 = grad_z * data.x2;
            double grad_b = grad_z;

            // パラメータの更新
            w1 -= learning_rate * grad_w1;
            w2 -= learning_rate * grad_w2;
            b -= learning_rate * grad_b;
        }

        // エポックごとの損失を表示
        std::cout << "Epoch " << epoch + 1 << ": Loss = " << total_loss << std::endl;
    }
}

int main() {
    // トレーニングデータセット
    std::vector<Data> dataset = {
        {0, 0, 0},
        {0, 1, 1},
        {1, 0, 1},
        {1, 1, 1},
    };

    // 初期パラメータ
    double w1 = 0.0, w2 = 0.0, b = 0.0;
    double learning_rate = 0.1;
    int epochs = 1000;

    // 学習
    train(dataset, w1, w2, b, learning_rate, epochs);

    // 結果の表示
    std::cout << "Trained Parameters:" << std::endl;
    std::cout << "w1 = " << w1 << ", w2 = " << w2 << ", b = " << b << std::endl;

    return 0;
}

保存してエディタを終了(Control + Oで保存 → Enter → Control + Xで閉じる)

(2)Dockerのインストール

5.Docker Desktop をダウンロード

Dockerの公式サイト(https://www.docker.com/)にアクセスし、「Docker Desktop for Mac」をダウンロード

6.Docker Desktopをインストール

ダウンロードしたファイルを開き、インストール手順に従う

7.Docker Desktopがインストールされたことをターミナルで確認

docker --version

→Dockerのバージョンが表示されたらOK

(3)DockerコンテナでC++環境を構築

8.Dockerfileを作成

プロジェクトフォルダ内で次のコマンドをターミナルで実行:

nano Dockerfile

画面が切り替わったら以下の内容を貼り付ける

FROM gcc:latest
WORKDIR /app
COPY . .
RUN apt-get update && apt-get install -y nano
CMD ["bash"]

保存してエディタを終了(Control + Oで保存 → Enter → Control + Xで閉じる)

ファイル名は絶対にDockerfileでないといけないみたい!!!注意!
→名前を異なるものにしてしまった場合は

docker build -t cpp_env -f 自分で選んだファイル名 .

でいけるらしい

9.Dockerイメージをビルド

次のコマンドでイメージをビルドする(環境作るよ)

docker build -t cpp_env .

10.Dockerコンテナを起動

次のコマンドでコンテナを起動

docker run -it --name cpp_container cpp_env

11.コンテナ内でコードをコンパイル

g++ perceptron.cpp -o perceptron

→エラーが出なければOK

このときにエラーが出た
エラー内容は下記のもの

perceptron.cpp:28:20: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
        for (const auto &data : dataset) {
                   ^
perceptron.cpp:28:31: warning: range-based for loop is a C++11 extension [-Wc++11-extensions]
        for (const auto &data : dataset) {
                              ^
perceptron.cpp:59:23: error: non-aggregate type 'std::vector<Data>' cannot be initialized with an initializer list
    std::vector<Data> dataset = {
                      ^         ~
2 warnings and 1 error generated.****

これの原因を探ってみたらg++ コンパイラが C++11 機能を有効にしていないかららしい
解決策として

g++ -std=c++11 perceptron.cpp -o perceptron

これやったら上手くいった

12.コンテナ内でコードを実行

./perceptron

13.実行結果

w1 = 3.30955, w2 = 3.31161, b = -1.34464

こんなふうに出ましたよーーーん。重みがこれでわかる的な。

14.コンテナを終了する場合

exit

15.もっかいコンテナを使いたい時

docker start -ai cpp_container

Discussion