GNN使ってみてる話Part1
初心者なので仮想環境を構築するところから記録
使用するもの
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