乐趣区

关于numpy:居然用-Numpy-实现了一个深度学习框架

明天跟大家分享一个牛逼的开源我的项目,该我的项目只用 Numpy 就实现了一个深度学习框架。

它不是一个 demo,而是一个实实在在能利用的深度学习框架,它的语法与PyTorch 统一,用它能够实现 CNNRNNDNN 等经典的神经网络。

该框架对正在学习 深度学习 的敌人十分敌对,因为它的代码量不到 2000 行,大家齐全能够通过浏览源码来深刻理解 神经网络 外部的细节。

如果大家读完源码本人也能做一个相似的深度学习框架,就更完满了。

1. 与 PyTorch 比照

接下来,我用该框架搭建一个简略的神经网络,并与 PyTorch 比照。

咱们用这个神经网络来实现线性回归:

用上面的函数来生成训练样本

def synthetic_data(w, b, num_examples): 
    """生成 y =w1*x1+w2*x2+ b 训练样本"""
    X = np.random.normal(0, 1, (num_examples, len(w)))
    y = np.dot(X, w) + b
    y += np.random.normal(0, 0.01, y.shape)
    return X, y.reshape((-1, 1))

w = np.array([2, -3.4])
b = 4.2
features, labels = synthetic_data(w, b, 1000)

这里咱们令 w1=2w2=-3.4b=4.2,随机生成1000 个训练样本,x1x2寄存在 features 变量中,y寄存在 labels 变量中。

上面咱们要做的是将这些样本输出神经网络中,训练出参数 w1w2b,咱们心愿模型训练进去的参数跟理论的 w1w2b越靠近越好。

先用 PyTorch 来搭建神经网络,并训练模型。

from torch import nn, Tensor
import torch

# 只有一个神经元,并且是线性神经元
# 2 代表有 2 个特色(x1、x2),1 代表输入 1 个特色(y)net = nn.Linear(2, 1)

print(f'初始 w:{net.weight.data}')
print(f'初始 b:{net.bias.data}')

# 用均方误差作为线性回归损失函数
loss = nn.MSELoss()
# 采纳梯度降落算法优化参数,lr 是学习速率
trainer = torch.optim.SGD(net.parameters(), lr=0.03)

# 转 Tensor
X = Tensor(features)
y = Tensor(labels)

# 迭代次数
num_epochs = 300
for epoch in range(num_epochs):
    l = loss(net(X), y)  # 计算损失
    trainer.zero_grad()
    l.backward()  # 反向流传,求导
    trainer.step()  # 更新参数
    l = loss(net(X), y) # 参数更新后,再次计算损失
    print(f'epoch {epoch + 1}, loss {round(float(l.data), 8)}')

print(f'模型训练后的 w:{net.weight.data}')
print(f'模型训练后的 b:{net.bias.data}')

这里咱们用的是最简略的神经网络,只有一个神经元。

代码也比较简单,每行都做了正文。

输入的后果也是合乎咱们的预期,输入的损失如下:

epoch 1, loss 33.65092468
epoch 2, loss 29.78330231
epoch 3, loss 26.36030769
...
epoch 298, loss 0.0001022
epoch 299, loss 0.0001022
epoch 300, loss 0.0001022

前几轮损失比拟大,等迭代 300 次后,损失曾经十分小了。再看训练进去的参数:

初始 w:tensor([[0.5753, 0.6624]])
初始 b:tensor([-0.5713])
...
模型训练后的 w:tensor([[1.9995, -3.4001]])
模型训练后的 b:tensor([4.1998])

能够看到,经过训练后,模型的参数与设定的参数也是十分靠近的。

上面,咱们再用明天介绍的框架再来实现一遍。

from pydynet import nn, Tensor
from pydynet.optimizer import SGD

net = nn.Linear(2, 1)

print(f'初始 w:{net.weight.data}')
print(f'初始 b:{net.bias.data}')


loss = nn.MSELoss()
trainer = SGD(net.parameters(), lr=0.03)

X = Tensor(features)
y = Tensor(labels)

num_epochs = 300
for epoch in range(num_epochs):
    l = loss(net(X), y)  # 计算损失
    trainer.zero_grad()
    l.backward()  # 反向流传,求导
    trainer.step()  # 更新参数
    l = loss(net(X), y)  # 参数更新后,再次计算损失
    print(f'epoch {epoch + 1}, loss {round(float(l.data), 8)}')
    
print(f'模型训练后的 w:{net.weight.data}')
print(f'模型训练后的 b:{net.bias.data}')

代码从 pydynet 目录引入的,能够看到,用法跟 PyTorch 简直是截然不同,输入参数如下:

初始 w:[[-0.25983338]
 [-0.29252936]]
初始 b:[-0.65241649]

...

模型训练后的 w:[[2.00030734]
 [-3.39951581]]
模型训练后的 b:[4.20060585]

训练进去的后果也是合乎预期的。

2. 我的项目构造

pydynet我的项目架构如下:

目前只有 5 个 Python源文件,不到 2000 行代码。

第一大节咱们只实现最简略的神经网络,其余经典的神经网络,也有源码,大家能够自行查阅

我的项目地址:https://github.com/Kaslanaria…

我十分喜爱这个我的项目,拜服这个我的项目的作者。如果你也正好在学习人工智能,强烈建议学习学习这个我的项目。

以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python 编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩 Python 电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

退出移动版