今日份学习目标

  1. 掌握激活函数
  2. 学习激活函数的意义
  3. 激活函数和线性变化之间能产生的作用
  4. 链式求导
  5. 反向传播
  6. 传播的顺序由拓扑排序来决定
  7. 拓扑排序的原理和实现过程

激活函数

世界中的很多真实关系都不是简单的线性关系,我们是否可以构建一些基本的模块,然后来组成复杂的函数

其实早期的神经网络 只有线性变化+激活函数 深度网路最重要的是多了一个CNN

理论上所有的函数都可以用多层的线性函数+非线性变化来进行拟合。但是我们之所以又有了CNN,RNN这些模型,就是因为一个问题维数灾难,就是当参数每上升一个维度,我们所需要的数据就要10倍增长,所以我们不能无节制的使用多层线性函数,因为会增加参数,这也是我们为什么使用CNN,RNN因为会减少参数。

常用的激活函数:sigmoid,relu,tanh

def sigmoid(x): # basic sub-model : Transfer :Activation Function : 激活函数return 1 / (1 + np.exp(-x))def relu(x):return x * (x > 0)def tanh(x):
#     return np.tanh(x)return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))def leaky_relu(x):return 0.1*x*(x<0)+x*(x>0)x=np.linspace(-10,10,100)
plt.plot(tanh(x))

构建神经网络拓扑图

首先我们要构建神经网络拓扑图,可视化需要用到一个工具包networkx

NetworkX是一款Python的软件包,用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。 
有了NetworkX你就可以用标准或者不标准的数据格式加载或者存储网络,它可以产生许多种类的随机网络或经典网络,也可以分析网络结构,建立网络模型,设计新的网络算法,绘制网络等等。

#搭建神经网络
import networkx as nx
#代表着网络的结构
computing_graph = {'x1': ['linear-01'], 'k1': ['linear-01'],'b1': ['linear-01'],'linear-01': ['sigmoid'], 'sigmoid': ['linear_2'],'k2': ['linear_2'],'b2': ['linear_2'],'linear_2': ['loss']
}#此处直接输入字典表示节点和边,当然可以使用其他的形式
graph=nx.DiGraph(computing_graph)#建立一个有向图
# nx.draw(graph,with_labels=True)
layout=nx.layout.spring_layout(graph)# 一种布局方式,用Fruchterman-Reingold算法排列节点(这个算法我不了解,样子类似多中心放射状)
nx.draw(graph,layout,with_labels=True,node_color='green')#显示标签,并设置颜色

显示图如下,还是比较清晰的

以上就是一个简单的展示,接下来,我们就正式开始

第一步:需要进行拓扑排序,确定节点遍历的顺序

第二步:前向传播

第三步:反向传播

首先进行第一步代码展示:

import random
#拓扑排序,来决定节点前向传播和反向传播的顺序
def topologic(graph):sorted_node=[]while len(graph)>0:all_inputs=[]all_outputs=[]for n in graph:all_inputs+=graph[n]all_outputs.append(n)all_inputs=set(all_inputs)all_outputs=set(all_outputs)need_remove=all_outputs-all_inputs#需要删除的节点,也就是只有输出没有输入的点if len(need_remove)>0:node=random.choice(list(need_remove))visited_next=[node]#如果是最后一个节点,比如linear2-lossif len(graph)==1: visited_next+=graph[node]graph.pop(node)sorted_node+=visited_nextelse:break    return sorted_node
#图中的所有节点
computing_graph = {'x1': ['linear-01'], 'k1': ['linear-01'],'b1': ['linear-01'],'linear-01': ['sigmoid'], 'sigmoid': ['linear_2'],'k2': ['linear_2'],'b2': ['linear_2'],'linear_2': ['loss']
}
visit_order_by_algorithm=topologic(computing_graph)

第二步,前向传播如下:

#首先建立图
import networkx as nx
computing_graph = {'x1': ['linear-01'], 'k1': ['linear-01'],'b1': ['linear-01'],'linear-01': ['sigmoid'], 'sigmoid': ['linear_2'],'k2': ['linear_2'],'b2': ['linear_2'],'linear_2': ['loss']
}
graph=nx.DiGraph(computing_graph)
layout=nx.layout.spring_layout(graph)#该函数用来给每一步前向传播画图
def visited_procedure(graph, postion, visited_order, step, sub_plot_index=None, colors=('red', 'green')):changed = visited_order[:step] if step is not None else visited_orderbefore, after = colorscolor_map = [after if c in changed else before for c in graph]nx.draw(graph, postion, node_color=color_map, with_labels=True, ax=sub_plot_index)#构建前向传播
import matplotlib.pyplot as plt
import numpy as npdimension = int(len(visit_order_by_algorithm)**0.5)fig, ax = plt.subplots(dimension, dimension+1, figsize=(15,15))for i in range(len(visit_order_by_algorithm)+1):ix = np.unravel_index(i, ax.shape)#索引按照ax.shape进行排序plt.sca(ax[ix])#选择(0,0)这个曲线,开始绘制ax[ix].title.set_text('Feed Forward Step: {}'.format(i))visited_procedure(graph, layout, visit_order_by_algorithm, step=i, sub_plot_index=ax[ix])

第三步,反向传播:

#反向传播代码基本一样,只需将,遍历顺序颠倒即可
dimension = int(len(visit_order_by_algorithm)**0.5)fig, ax = plt.subplots(dimension, dimension+1, figsize=(15,15))
for i in range(len(visit_order_by_algorithm)+1):ix = np.unravel_index(i, ax.shape)#索引按照ax.shape进行排序plt.sca(ax[ix])#选择(0,0)这个曲线,开始绘制ax[ix].title.set_text('Feed Forward Step: {}'.format(i))visited_procedure(graph, layout, visit_order_by_algorithm[::-1], step=i, sub_plot_index=ax[ix],colors=['green','red'])

很感谢大家的观看,有什么问题欢迎随时留言交流。

如何从0-1构建自己的”pytorch“(自己专属的深度学习框架)——part02相关推荐

  1. 如何从0-1构建自己的”pytorch“(自己专属的深度学习框架)——part01

    整体学习目标 建立属于你自己的深度学习框架 Python创建线性回归模型,L1损失函数,L2损失函数 参数初始化 掌握梯度下降算法,创建优化器函数 学会设置学习率以避免梯度爆炸 掌握多个常用激活函数, ...

  2. Keras vs PyTorch:谁是第一深度学习框架?

    「第一个深度学习框架该怎么选」对于初学者而言一直是个头疼的问题.本文中,来自 deepsense.ai 的研究员给出了他们在高级框架上的答案.在 Keras 与 PyTorch 的对比中,作者还给出了 ...

  3. 从TensorFlow到PyTorch:九大深度学习框架哪款最适合你?

    人工智能AI与大数据技术实战  公众号: weic2c 开源的深度学习神经网络正步入成熟,而现在有许多框架具备为个性化方案提供先进的机器学习和人工智能的能力.那么如何决定哪个开源框架最适合你呢?本文试 ...

  4. Keras与PyTorch全方位比较 哪一个深度学习框架更适合初学者?

    Keras或PyTorch作为您的第一个深度学习框架 你想学习深度学习吗?无论您是想开始将其应用于您的业务,建立您的下一个项目,还是仅仅获得当下热门的技能 – 选择合适的深度学习框架来学习是实现目标的 ...

  5. 除了TensorFlow、PyTorch,还有哪些深度学习框架值得期待?

    分布式技术是深度学习技术的加速器. 同时利用多个工作节点,分布式地.高效地训练出性能优良的神经网络模型,能够显著提高深度学习的训练效率.进一步增大其应用范围. <首席AI架构师--分布式高性能深 ...

  6. 除了 Tensorflow、PyTorch ,还有哪些深度学习框架值得期待?

    分布式技术是深度学习技术的加速器. 同时利用多个工作节点,分布式地.高效地训练出性能优良的神经网络模型,能够显著提高深度学习的训练效率.进一步增大其应用范围. <首席AI架构师--分布式高性能深 ...

  7. 终极之战!TensorFlow与PyTorch谁最适合深度学习

    选自builtin 本文经机器之心授权转载,禁止二次转载 (微信公众号:almosthuman2014) 参与:吴攀.杜伟 谷歌的 Tensorflow 与 Facebook 的 PyTorch 一直 ...

  8. DL:深度学习框架Pytorch、 Tensorflow各种角度对比

    DL:深度学习框架Pytorch. Tensorflow各种角度对比 目录 先看两个框架实现同样功能的代码 1.Pytorch.Tensorflow代码比较 2.Tensorflow(数据即是代码,代 ...

  9. numpy pytorch 接口对应_拆书分享篇深度学习框架PyTorch入门与实践

    <<深度学习框架PyTorch入门与实践>>读书笔记 <深度学习框架PyTorch入门与实践>读后感 小作者:马苗苗  读完<<深度学习框架PyTorc ...

最新文章

  1. Single Molecule Real-Time Sequencing
  2. viewPager开启界面导航之旅
  3. uva 10759 Dice Throwing
  4. 以云战“疫”,这次阿里云又让人们惊了……
  5. No input file specified的解决方法
  6. ElasticSearch 7 正式发布!
  7. Failed to load Idlinux.c32, Boot failed: press any key to retry
  8. 发字的楷书写法图片_想要不侵权?收下这篇可能是最全面的书法字设计指南!...
  9. 通信技术专业技术人员考试 动力与环境_建筑信息模型专业技术人员等级认定培训考试项目介绍...
  10. python是一门胶水语言_python为什么叫胶水语言
  11. windows之IP地址(一)
  12. Fiddler之自动修改数据包(Free HTTP插件)
  13. pandas精华总结
  14. mysql MMM方案
  15. 穿上钢铁侠战衣变身钢铁侠,现代表示我做到了!
  16. 2022年二级建造师考试机电工程练习题及答案
  17. 企业局域网如何搭建?
  18. 网络编程中常见错误码总结
  19. 支付宝小程序获取php用户id,02支付宝小程序(基于知晓云)~如何获取用户ID
  20. 数学建模之时间序列模型及其应用

热门文章

  1. Python的最佳学习方式
  2. 免费报名 | 微软全双工语音对话以及在智能硬件上的应用
  3. 一个电商供应链系统的DDD实战
  4. 牛逼!一个故事讲清楚 NIO 了
  5. 为了面试,从头到尾说一次 Java 垃圾回收
  6. kaggle、TDS、arXiv等,我最喜欢的数据科学资源
  7. 卷积神经网络(CNN)综述
  8. 南大硕士毕业生举报同组同学抄袭,被举报者回应了
  9. AI面试官也太好骗了吧!
  10. 我用AI分析了《赛博朋克 2077》的评价,发现真爱粉都是来吸猫的