加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

100行Python代码,轻松搞定神经网络

发布时间:2019-05-06 07:59:05 所属栏目:建站 来源:eisenjulian 编译:周家乐、钱天培 用tensor
导读:大数据文摘出品 来源:eisenjulian 编译:周家乐、钱天培 用tensorflow,pytorch这类深度学习库来写一个神经网络早就不稀奇了。 可是,你知道怎么用python和numpy来优雅地搭一个神经网络嘛? 现如今,有多种深度学习框架可供选择,他们带有自动微分、基于图

然后, 训练过程将有三个步骤, 计算前向传递, 然后后向传递, 最后更新权重。这里关键的一点是把更新权重放在最后, 因为权重可以在多个层中重用,我们更希望在需要的时候再更新它。

  1. class Layer: 
  2.   def __init__(self): 
  3.     self.parameters = [] 
  4.  
  5.   def forward(self, X): 
  6.     """ 
  7.     Override me! A simple no-op layer, it passes forward the inputs 
  8.     """ 
  9.     return X, lambda D: D 
  10.  
  11.   def build_param(self, tensor): 
  12.     """ 
  13.     Creates a parameter from a tensor, and saves a reference for the update step 
  14.     """ 
  15.     param = Parameter(tensor) 
  16.     self.parameters.append(param) 
  17.     return param 
  18.  
  19.   def update(self, optimizer): 
  20.     for param in self.parameters: optimizer.update(param) 

标准的做法是将更新参数的工作交给优化器, 优化器在每一批(batch)后都会接收参数的实例。最简单和最广为人知的优化方法是mini-batch随机梯度下降。

  1. class SGDOptimizer(): 
  2.   def __init__(self, lr=0.1): 
  3.     self.lr = lr 
  4.  
  5.   def update(self, param): 
  6.     param.tensor -= self.lr * param.gradient 
  7.     param.gradient.fill(0) 

在此框架下, 并使用前面计算的结果后, 线性层如下所示:

  1. class Linear(Layer): 
  2.   def __init__(self, inputs, outputs): 
  3.     super().__init__() 
  4.     tensor = np.random.randn(inputs, outputs) * np.sqrt(1 / inputs) 
  5.     selfself.weights = self.build_param(tensor) 
  6.     selfself.bias = self.build_param(np.zeros(outputs)) 
  7.  
  8.   def forward(self, X): 
  9.     def backward(D): 
  10.       self.weights.gradient += X.T @ D 
  11.       self.bias.gradient += D.sum(axis=0) 
  12.       return D @ self.weights.tensor.T 
  13.     return X @ self.weights.tensor +  self.bias.tensor, backward 

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读