🧠学習の為、非常に単純な1次元4層位のニューラルネットをモデル化できますか?
はい、学習目的のために非常に単純な1次元4層のニューラルネットワークをモデル化することは可能です。ここでは、各層が1つのニューロンを持つと仮定しましょう。このモデルでは、各層間の接続は1対1で、各接続には重みがあります。また、簡単のためにバイアスは考慮しないことにします。活性化関数としては、よく使われるReLU(Rectified Linear Unit)を採用しましょう。
モデルの構造は次のようになります:
入力層:1つのニューロン(入力値を受け取る)
隠れ層1:1つのニューロン
隠れ層2:1つのニューロン
出力層:1つのニューロン(最終出力を生成)
各層間の重みを w1,w2,w3 とし、ReLU関数を ReLU(x)=max(0,x) とします。このネットワークの順伝播と逆伝播のプロセスをモデル化してみましょう。
import torch
import torch.nn as nn
import torch.optim as optim
# ネットワークの定義
class SimpleNetwork(nn.Module):
def __init__(self):
super(SimpleNetwork, self).__init__()
self.fc1 = nn.Linear(1, 1) # 隠れ層1
self.fc2 = nn.Linear(1, 1) # 隠れ層2
self.fc3 = nn.Linear(1, 1) # 出力層
def forward(self, x):
x = torch.relu(self.fc1(x)) # ReLU活性化関数
x = torch.relu(self.fc2(x)) # ReLU活性化関数
x = self.fc3(x)
return x
# ネットワークのインスタンス化
net = SimpleNetwork()
# 損失関数と最適化手法
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 入力データと目標出力
input = torch.tensor([[1.0]]) # 例:入力値 1.0
target = torch.tensor([[0.0]]) # 例:目標出力 0.0
# 学習プロセス
for i in range(100): # 100回の学習イテレーション
# 順伝播
output = net(input)
# 損失の計算
loss = criterion(output, target)
# 逆伝播
optimizer.zero_grad() # 勾配を0に初期化
loss.backward() # 勾配の計算
optimizer.step() # 重みの更新
# 途中経過の表示
if (i+1) % 10 == 0: # 10イテレーションごとに表示
print(f"Iteration {i+1}/100")
print(f" Input: {input.item()}")
print(f" Output: {output.item()}")
print(f" Loss: {loss.item()}")
for name, param in net.named_parameters():
print(f" {name}: {param.item()}")
print("-" * 30)
このコードは、100回の学習イテレーションを行い、各10イテレーションごとに入力、出力、損失、および各層の重みの現在の値を表示します。このようにすることで、ネットワークがどのように出力を改善し、損失を減少させていくかを観察することができます。
いいなと思ったら応援しよう!
お願い致します