今天想和大家分享一个很棒的开源项目,它只用Numpy实现了一个深度学习框架。它不是一个demo,而是一个可以应用的深度学习框架。其语法与PyTorch一致,可用于实现CNN、RNN、DNN等经典神经网络。这个框架对于学习深度学习的朋友来说非常友好,因为它的代码量不到2000行,阅读源码就可以全面了解神经网络的内部细节。如果大家看完源码后能做出类似的深度学习框架就更完美了。1.与PyTorch的比较接下来,我使用这个框架搭建了一个简单的神经网络,并与PyTorch进行了比较。我们使用这个神经网络来实现线性回归:使用下面的函数生成训练样本defsynthetic_data(w,b,num_examples):"""Generatey=w1*x1+w2*x2+btrainingsamples"""X=np.random.normal(0,1,(num_examples,len(w)))y=np.dot(X,w)+by+=np.random.normal(0,0.01,y.shape)返回X,y.reshape((-1,1))w=np.array([2,-3.4])b=4.2features,labels=synthetic_data(w,b,1000)这里我们设置w1=2,w2=-3.4,b=4.2,随机生成1000个训练样本,将x1和x2存入features变量,y存入labels变量。接下来我们要做的就是将这些样本输入到神经网络中去训练参数w1、w2和b。我们希望模型训练出来的参数尽可能接近实际的w1、w2和b。首先使用PyTorch搭建神经网络并训练模型。fromtorchimportnn,Tensorimporttorch#只有一个神经元,是线性神经元#2表示有2个特征(x1,x2),1表示输出1个特征(y)net=nn.Linear(2,1)print(f'initialw:{net.weight.data}')print(f'initialb:{net.bias.data}')#使用均方误差作为线性回归损失函数loss=nn.MSELoss()#使用梯度下降算法优化参数,lr为学习率trainer=torch.optim.SGD(net.parameters(),lr=0.03)#转TensorX=Tensor(features)y=Tensor(labels)#迭代次数num_epochs=300forepochinrange(num_epochs):l=loss(net(X),y)#计算损失trainer.zero_grad()l.backward()#反向传播,推导trainer.step()#更新参数l=loss(net(X),y)#参数更新后,再次计算lossprint(f'epoch{epoch+1},loss{round(float(l.data),8)}')print(f'waftermodeltraining:{net.weight.data}')print(f'baftermodeltraining:{net.bias.data}')这里我们使用只有一个神经元的最简单的神经网络。代码也比较简单,每一行都有注释。产出的结果也符合我们的预期。输出loss如下:epoch1,loss33.65092468epoch2,loss29.78330231epoch3,loss26.36030769...epoch298,loss0.0001022epoch299,loss0.0001022epoch30loss0.0001022前面几个的loss轮次比较大。经过300次迭代,loss已经很小了。查看训练好的参数:初始w:tensor([[0.5753,0.6624]])初始b:tensor([-0.5713])...模型训练后w:tensor([[1.9995,-3.4001]])b:tensor([4.1998])经过模型训练,我们可以看到经过训练后,模型的参数与设定的参数非常接近。下面我们再用今天介绍的框架来实现一下。frompydynetimportnn,Tensorfrompydynet.optimizerimportSGDnet=nn.Linear(2,1)print(f'initialw:{net.weight.data}')print(f'initialb:{net.bias.data}')loss=nn.MSELoss()trainer=SGD(net.parameters(),lr=0.03)X=Tensor(features)y=Tensor(labels)num_epochs=300forepochinrange(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'modeltrainedw:{net.weight.data}')print(f'baftermodeltraining:{net.bias.data}')代码是从pydynet目录导入的。可以看到用法和PyTorch差不多。输出参数如下:Initialw:[[-0.25983338][-0.29252936]]Initialb:[-0.65241649]...waftermodeltraining:[[2.00030734][-3.39951581]]baftermodeltraining:[4.20060585】训练结果也符合预期。2.项目结构pydynet项目结构如下:目前只有5个Python源文件,不到2000行代码。在第一节中,我们只实现了最简单的神经网络。其他经典神经网络也有源代码。项目地址大家可以自行查看:https://github.com/Kaslanaria...非常喜欢这个项目,也很佩服这个项目作者。如果你刚好是学习人工智能的,强烈推荐研究这个项目。以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能收到海量学习资料,涵盖Python电子书和教程,数据库编程、Django、爬虫、云计算等。或者去编程学习网了解更多编程技术知识。
