歩行脳は,つぎのユニット/機能で構成される:
・歩行脳NN
・経験ログ処理 (記憶)
・パラメータ更新処理 (教師あり学習)
したがって,NN のプログラム nn_brain.py に,「記憶」 「教師あり学習」 のコードを書き加えれば,歩行脳のプログラムが出来上がることになる。
これを実際にやるとしよう。
なお,nn_brain.py は,以下のようになっている:
#################################
# nn_brain.py
#################################
import torch
from torch import nn
import sys
import json
#########################
# class NN_Brain
class NN_Brain(nn.Module):
def __init__(self):
super().__init__()
self.network = nn.Sequential(
# 入力は,つぎの5つの特徴量
# last_gait, position, earth, visual, enegy
# 各 16 byte,合計 80 byte
nn.Linear(
80,
128
),
nn.ReLU(),
nn.Linear(
128,
128
),
nn.ReLU(),
# 出力は,gait_feature, 16 byte
# 16 byte
nn.Linear(
128,
16
)
)
###################################
# サブルーチン
###################################
#####################
# ストアからの入力の成形
# 入力は, stdin から
# これを,NN への入力に成形
def nn_input(self):
# 入力を受ける
line = sys.stdin.readline()
data = json.loads(line)
last_gait_feat = torch.tensor(
[ data["last_gait"] ],
dtype=torch.float32
)
position_feat = torch.tensor(
[ data["position"] ],
dtype=torch.float32
)
earth_feat = torch.tensor(
[ data["earth"] ],
dtype=torch.float32
)
vision_feat = torch.tensor(
[ data["vision"] ],
dtype=torch.float32
)
energy_feat = torch.tensor(
[ data["energy"] ],
dtype=torch.float32
)
# NN用入力
x = torch.cat(
[
last_gait_feat
position_feat,
earth_feat,
vision_feat,
energy_feat,
],
dim=1
)
return x
#####################
# NN の入出力
def forward(self, x):
y = self.network(x)
return y
#########################
# main
def main():
# object 化
nn_brain = NN_Brain()
# 入力値
x = nn_brain.nn_input()
# 出力値
y = nn_brain.forward(x)
# 出力 (stdout へ)
print( y )
##################
# プログラムの起動
if __name__ == '__main__':
main()
備考. ストアから NN への入力
# NN への入力
nn_brain_input = {
"last_gait": self.last_gait.__dict__
"position": self.position.__dict__,
"visual": self.visual.__dict__,
"earth": self.earth.__dict__,
"energy": self.energy.__dict__,
}
# 入力を JSON にして送る
input_json = json.dumps(brain_input)
self.nn.stdin.write(input_json + "\n")
self.nn.stdin.flush()
|