利用Pytorch框架实现感知机

利用Pytorch框架实现感知机

import random

import torch
from torch import nn


class Perception(nn.Module):
    def __init__(self, n):
        super(Perception, self).__init__()
        self.w = nn.Parameter(torch.ones((n, 1)))
        self.b = nn.Parameter(torch.zeros((1, 1)))

    def forward(self, x):
        pred = torch.mm(x, self.w) + self.b
        pred = torch.sign(pred)
        return pred

    def loss_func(self, x, y):
        return -y * (torch.mm(x, self.w) + self.b).squeeze()

    def init_param(self):
        for name, param in self.named_parameters():
            print(name)
            nn.init.kaiming_normal_(param)


def SGD_optimizer(net, input_x, label):
    y_pred = net(input_x)
    y_pred = y_pred.squeeze()
    non_zero = torch.nonzero(torch.eq(y_pred, label)).squeeze(1)
    # print(non_zero, non_zero.tolist())
    index = (set(range(len(label))) - set(non_zero.tolist()))
    if len(index) == 0:
        return -1, -1
    index = list(index)
    # sgd
    index = random.choice(index)
    loss = net.loss_func(input_x[index].unsqueeze(0), label[index])
    return loss, 0


if __name__ == '__main__':
    x = torch.tensor([[3., 3.], [4, 3], [1, 1]])
    y = torch.tensor([1., 1, -1])
    model = Perception(len(x[0]))
    model.init_param()
    while True:
        loss, _ = SGD_optimizer(model, x, y)
        if _ == -1:
            print('Done!')
            break
        loss.backward()
        with torch.no_grad():
            for param in model.parameters():
                # print(param.grad)
                param -= param.grad * 0.01

        print(loss.item())

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值