使用Pytorch搭建简易的神经网络模型

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值