前作:PyNet: Use NumPy to build neuron network。在那里我们基于求导规则实现了全连接网络。在这里,我们向当今的深度学习框架看齐,实现属于自己的DL框架。
PyDyNet已被多个技术公众号和社区分享:居然用Numpy实现了一个深度学习框架.
train_loader
函数;@no_grad()
和with no_grad()
,详见autograd.py;PyDyNet也是纯NumPy实现的神经网络,语法受PyTorch的启发,大致结构如下:
文件结构
pydynet
├── __init__.py
├── autograd.py # 微分控制模块
├── data.py # 数据集模块
├── nn # 神经网络模块
│ ├── __init__.py
│ ├── functional.py # 函数类
│ ├── init.py # 初始化模块
│ ├── modules
│ │ ├── __init__.py
│ │ ├── activation.py # 激活函数
│ │ ├── batchnorm.py # BN
│ │ ├── conv.py # 卷积和池化
│ │ ├── dropout.py # dropout
│ │ ├── linear.py # 线性层
│ │ ├── loss.py # 损失函数类
│ │ ├── module.py # Module基类,包括Sequential
│ │ └── rnn.py # RNN
│ └── parameter.py # 参数化类
├── optim.py # 优化器类
└── tensor.py # 张量类
我们实现了:
将NumPy数组包装成具有梯度等信息的张量(Tensor):
from pydynet import Tensor
x = Tensor(1., requires_grad=True)
print(x.data) # 1.
print(x.ndim, x.shape, x.is_leaf) # 0, (), True
将NumPy数组的计算(包括数学运算、切片、形状变换等)抽象成基础算子(Basic operators),并对部分运算加以重载:
from pydynet import Tensor
import pydynet.functional as F
x = Tensor([1, 2, 3])
y = F.exp(x) + x
z = F.sum(x)
print(z.data) # 36.192...
手动编写基础算子的梯度,实现和PyTorch相同的动态图自动微分机制(Autograd),从而实现反向传播
from pydynet import Tensor
import pydynet.functional as F
x = Tensor([1, 2, 3], requires_grad=True)
y = F.log(x) + x
z = F.sum(y)
z.backward()
print(x.grad) # [2., 1.5, 1.33333333]
基于基础算子实现更高级的算子(Complex operators),它们不再需要手动编写导数:
def simple_sigmoid(x: Tensor):
return 1 / (1 + exp(-x))
实现了Mudule,包括激活函数,损失函数等,从而我们可以像下面这样定义神经网络,损失函数项:
import pydynet.nn as nn
import pydynet.functional as F
n_input = 64
n_hidden = 128
n_output = 10
class Net(nn.Module):
def __init__(self) -> None:
super().__init__()
self.fc1 = nn.Linear(n_input, n_hidden)
self.fc2 = nn.Linear(n_hidden, n_output)
def forward(self, x):
x = self.fc1(x)
x = F.sigmoid(x)
return self.fc2(x)
net = Net()
loss = nn.CrossEntropyLoss()
l = loss(net(X), y)
l.backward()
实现了多种优化器(optimizer.py
),以及数据分批的接口(dataloader.py
),从而实现神经网络的训练;其中优化器和PyTorch一样支持权值衰减,即正则化;
Dropout机制,Batch Normalization机制,以及将网络划分成训练阶段和评估阶段;
基于im2col高效实现Conv1d, Conv2d, max_pool1d和max_pool2d,从而实现CNN;
支持多层的双向RNN,LSTM和GRU;
实现了PyTorch中的Dataset类、DataLoader类,从而将批数据集封装成迭代器;
多种初始化方式,包括Kaiming和Xavier。
pip install pydynet
或本地安装
git clone https://github.com/Kaslanarian/PyDyNet
cd PyDyNet
python setup.py install
安装成功后就可以运行下面的例子
tests中是一些例子。
autodiff.py利用自动微分,对一个凸函数进行梯度下降:
DNN.py使用全连接网络对sklearn
提供的数字数据集进行分类,训练参数
训练损失,训练准确率和测试准确率:
CNN.py使用三种网络对fetch_olivetti_faces
人脸(64×64)数据集进行分类并进行性能对比:
其余参数相同:
学习效果对比:
dropout_BN.py使用三种网络对fetch_olivetti_faces
人脸(64×64)数据集进行分类并进行性能对比:
其余参数相同:
学习效果对比:
RNN.py中是一个用双向单层GRU对sklearn
的数字图片数据集进行分类:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。