import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.optim import SGD
import matplotlib.pyplot as plt
import seaborn as sns
x = torch.linspace(start=0., end=1., steps=11)
class BasicNN(nn.Module):
def __init__(self):
super().__init__()
self.w00 = nn.Parameter(torch.tensor(1.70), requires_grad=False)
self.b00 = nn.Parameter(torch.tensor(-0.85), requires_grad=False)
self.w01 = nn.Parameter(torch.tensor(-40.8), requires_grad=False)
self.w10 = nn.Parameter(torch.tensor(12.6), requires_grad=False)
self.b10 = nn.Parameter(torch.tensor(0.0), requires_grad=False)
self.w11 = nn.Parameter(torch.tensor(2.7), requires_grad=False)
self.final_bais = nn.Parameter(torch.tensor(-16.), requires_grad=False)
def forward(self, input):
input_to_top_relu = input * self.w00 + self.b00
top_relu_output = F.relu(input_to_top_relu)
scaled_top_relu_output = top_relu_output * self.w01
input_to_bottom_relu = input * self.w10 + self.b10
bottom_relu_output = F.relu(input_to_bottom_relu)
scaled_bottom_relu_output = bottom_relu_output * self.w11
input_to_final_relu = scaled_top_relu_output + scaled_bottom_relu_output + self.final_bais
output = F.relu(input_to_final_relu)
return output
model = BasicNN()
y = model(x)
sns.set(style="whitegrid")
sns.lineplot(x=x, y=y, color="green", linewidth=2.5)
plt.ylabel("Effectiveness")
plt.xlabel("Dose")
class BasicNN_train(nn.Module):
def __init__(self):
super().__init__()
self.w00 = nn.Parameter(torch.tensor(1.70), requires_grad=False)
self.b00 = nn.Parameter(torch.tensor(-0.85), requires_grad=False)
self.w01 = nn.Parameter(torch.tensor(-40.8), requires_grad=False)
self.w10 = nn.Parameter(torch.tensor(12.6), requires_grad=False)
self.b10 = nn.Parameter(torch.tensor(0.0), requires_grad=False)
self.w11 = nn.Parameter(torch.tensor(2.7), requires_grad=False)
self.final_bais = nn.Parameter(torch.tensor(0.), requires_grad=True)
def forward(self, input):
input_to_top_relu = input * self.w00 + self.b00
top_relu_output = F.relu(input_to_top_relu)
scaled_top_relu_output = top_relu_output * self.w01
input_to_bottom_relu = input * self.w10 + self.b10
bottom_relu_output = F.relu(input_to_bottom_relu)
scaled_bottom_relu_output = bottom_relu_output * self.w11
input_to_final_relu = scaled_top_relu_output + scaled_bottom_relu_output + self.final_bais
output = F.relu(input_to_final_relu)
return output
inputs = torch.tensor([0., 0.5, 1.0])
labels = torch.tensor([0., 1., 0.])
model = BasicNN_train()
optimizer = SGD(model.parameters(), lr = 0.07)
outputs = model(inputs)
sns.set(style="whitegrid")
sns.lineplot(x=inputs, y=outputs.detach(), color="green", linewidth=2.5)
plt.ylabel("Effectiveness")
plt.xlabel("Dose")
print("Final bias, before optimization: " + str(model.final_bais.data) + "\n")
for epoch in range(100):
total_loss = 0
for iteration in range(len(inputs)):
input_i = inputs[iteration]
label_i = labels[iteration]
output_i = model(input_i)
loss = (label_i - output_i) ** 2
loss.backward()
total_loss += float(loss)
if total_loss < 0.0001:
print("Num steps: " + str(epoch))
break
optimizer.step()
optimizer.zero_grad()
print("Step: " + str(epoch) + " Final Bias: " + str(model.final_bais.data) + "\n")
print("Final bias, after optimization: " + str(model.final_bais.data) + "\n")
sns.set(style="whitegrid")
sns.lineplot(x=x, y=model(x).detach(), color="green", linewidth=2.5)
plt.ylabel("Effectiveness")
plt.xlabel("Dose")
print(model(inputs))
使用Pytorch搭建简易的神经网络模型
最新推荐文章于 2023-08-15 01:35:48 发布