实际问题:二进制加法


1.遵循加法的规则
2.逢二进一

当前位的加法还要考虑前一位的进位。

完整代码

import copy, numpy as np
np.random.seed(0)# compute sigmoid nonlinearity
def sigmoid(x):output = 1/(1+np.exp(-x))return output# convert output of sigmoid function to its derivative
def sigmoid_output_to_derivative(output):return output*(1-output)# training dataset generation
int2binary = {}
binary_dim = 8largest_number = pow(2,binary_dim)
binary = np.unpackbits(np.array([range(largest_number)],dtype=np.uint8).T,axis=1)
for i in range(largest_number):int2binary[i] = binary[i]# input variables
alpha = 0.1
input_dim = 2
hidden_dim = 16
output_dim = 1# initialize neural network weights
synapse_0 = 2*np.random.random((input_dim,hidden_dim)) - 1
synapse_1 = 2*np.random.random((hidden_dim,output_dim)) - 1
synapse_h = 2*np.random.random((hidden_dim,hidden_dim)) - 1synapse_0_update = np.zeros_like(synapse_0)
synapse_1_update = np.zeros_like(synapse_1)
synapse_h_update = np.zeros_like(synapse_h)# training logic
for j in range(10000):# generate a simple addition problem (a + b = c)a_int = np.random.randint(largest_number/2) # int versiona = int2binary[a_int] # binary encodingb_int = np.random.randint(largest_number/2) # int versionb = int2binary[b_int] # binary encoding# true answerc_int = a_int + b_intc = int2binary[c_int]# where we'll store our best guess (binary encoded)d = np.zeros_like(c)overallError = 0layer_2_deltas = list()layer_1_values = list()layer_1_values.append(np.zeros(hidden_dim))# moving along the positions in the binary encodingfor position in range(binary_dim):# generate input and outputX = np.array([[a[binary_dim - position - 1],b[binary_dim - position - 1]]])y = np.array([[c[binary_dim - position - 1]]]).T# hidden layer (input ~+ prev_hidden)layer_1 = sigmoid(np.dot(X,synapse_0) + np.dot(layer_1_values[-1],synapse_h))# output layer (new binary representation)layer_2 = sigmoid(np.dot(layer_1,synapse_1))# did we miss?... if so, by how much?layer_2_error = y - layer_2layer_2_deltas.append((layer_2_error)*sigmoid_output_to_derivative(layer_2))overallError += np.abs(layer_2_error[0])# decode estimate so we can print it outd[binary_dim - position - 1] = np.round(layer_2[0][0])# store hidden layer so we can use it in the next timesteplayer_1_values.append(copy.deepcopy(layer_1))future_layer_1_delta = np.zeros(hidden_dim)for position in range(binary_dim):X = np.array([[a[position],b[position]]])layer_1 = layer_1_values[-position-1]prev_layer_1 = layer_1_values[-position-2]# error at output layerlayer_2_delta = layer_2_deltas[-position-1]# error at hidden layerlayer_1_delta = (future_layer_1_delta.dot(synapse_h.T) + layer_2_delta.dot(synapse_1.T)) * sigmoid_output_to_derivative(layer_1)# let's update all our weights so we can try againsynapse_1_update += np.atleast_2d(layer_1).T.dot(layer_2_delta)synapse_h_update += np.atleast_2d(prev_layer_1).T.dot(layer_1_delta)synapse_0_update += X.T.dot(layer_1_delta)future_layer_1_delta = layer_1_deltasynapse_0 += synapse_0_update * alphasynapse_1 += synapse_1_update * alphasynapse_h += synapse_h_update * alpha    synapse_0_update *= 0synapse_1_update *= 0synapse_h_update *= 0# print out progressif(j % 1000 == 0):print ("Error:" + str(overallError))print ("Pred:" + str(d))print ("True:" + str(c))out = 0for index,x in enumerate(reversed(d)):out += x*pow(2,index)print (str(a_int) + " + " + str(b_int) + " = " + str(out))print ("------------")

代码分析

激活函数及其求导:

# compute sigmoid nonlinearity
# 激活函数sigmoid
def sigmoid(x):output = 1/(1+np.exp(-x))return output# convert output of sigmoid function to its derivative
# 反向传播sigmoid的导数值
def sigmoid_output_to_derivative(output):return output*(1-output)

十进制与二进制的对应关系:

# training dataset generation
int2binary = {}
binary_dim = 8largest_number = pow(2,binary_dim)
binary = np.unpackbits(np.array([range(largest_number)],dtype=np.uint8).T,axis=1)
for i in range(largest_number):int2binary[i] = binary[i]

网络初始化:

# input variables
alpha = 0.1
input_dim = 2
# 定义输入的维度,即两个数
hidden_dim = 16
# 16个中间神经元
output_dim = 1
# 定义输出的维度,即一个数


初始化w0、w1、wh:

# initialize neural network weights
synapse_0 = 2*np.random.random((input_dim,hidden_dim)) - 1
synapse_1 = 2*np.random.random((hidden_dim,output_dim)) - 1
synapse_h = 2*np.random.random((hidden_dim,hidden_dim)) - 1# 更新参数的值
synapse_0_update = np.zeros_like(synapse_0)
synapse_1_update = np.zeros_like(synapse_1)
synapse_h_update = np.zeros_like(synapse_h)

开始迭代:

# training logic
for j in range(10000):

随机找a、b的值,要小于最大值的一半:

    # generate a simple addition problem (a + b = c)a_int = np.random.randint(largest_number/2) # int versiona = int2binary[a_int] # binary encodingb_int = np.random.randint(largest_number/2) # int versionb = int2binary[b_int] # binary encoding

得出c并转换成二进制数:

    # true answerc_int = a_int + b_intc = int2binary[c_int]
    # where we'll store our best guess (binary encoded)d = np.zeros_like(c)overallError = 0layer_2_deltas = list()layer_1_values = list()# L1层迭代的值layer_1_values.append(np.zeros(hidden_dim))# 第一次迭代的时候先全部初始化为0

前向传播遍历每一位运算:

    # moving along the positions in the binary encodingfor position in range(binary_dim):
        # generate input and outputX = np.array([[a[binary_dim - position - 1],b[binary_dim - position - 1]]])y = np.array([[c[binary_dim - position - 1]]]).T

L1、L2层的值:

        # hidden layer (input ~+ prev_hidden)layer_1 = sigmoid(np.dot(X,synapse_0) + np.dot(layer_1_values[-1],synapse_h))# output layer (new binary representation)layer_2 = sigmoid(np.dot(layer_1,synapse_1))
        # did we miss?... if so, by how much?layer_2_error = y - layer_2# 得出预测值与真实值之间的差异layer_2_deltas.append((layer_2_error)*sigmoid_output_to_derivative(layer_2))overallError += np.abs(layer_2_error[0])



实际的预测值:

        # decode estimate so we can print it outd[binary_dim - position - 1] = np.round(layer_2[0][0])

因为L1层循环的原因,要保存其值:

        # store hidden layer so we can use it in the next timesteplayer_1_values.append(copy.deepcopy(layer_1))

反向传播遍历每一位运算:

    for position in range(binary_dim):
        X = np.array([[a[position],b[position]]])layer_1 = layer_1_values[-position-1]prev_layer_1 = layer_1_values[-position-2]

更新权重:

        # error at output layerlayer_2_delta = layer_2_deltas[-position-1]# error at hidden layerlayer_1_delta = (future_layer_1_delta.dot(synapse_h.T) + layer_2_delta.dot(synapse_1.T)) * sigmoid_output_to_derivative(layer_1)# let's update all our weights so we can try againsynapse_1_update += np.atleast_2d(layer_1).T.dot(layer_2_delta)synapse_h_update += np.atleast_2d(prev_layer_1).T.dot(layer_1_delta)synapse_0_update += X.T.dot(layer_1_delta)future_layer_1_delta = layer_1_delta



参数更新:

    synapse_0 += synapse_0_update * alphasynapse_1 += synapse_1_update * alphasynapse_h += synapse_h_update * alpha    synapse_0_update *= 0synapse_1_update *= 0synapse_h_update *= 0

打印结果:

    # print out progressif(j % 1000 == 0):print ("Error:" + str(overallError))print ("Pred:" + str(d))print ("True:" + str(c))out = 0for index,x in enumerate(reversed(d)):out += x*pow(2,index)print (str(a_int) + " + " + str(b_int) + " = " + str(out))print ("------------")

运行结果

Error:[3.45638663]
Pred:[0 0 0 0 0 0 0 1]
True:[0 1 0 0 0 1 0 1]
9 + 60 = 1
------------
Error:[3.63389116]
Pred:[1 1 1 1 1 1 1 1]
True:[0 0 1 1 1 1 1 1]
28 + 35 = 255
------------
Error:[3.91366595]
Pred:[0 1 0 0 1 0 0 0]
True:[1 0 1 0 0 0 0 0]
116 + 44 = 72
------------
Error:[3.72191702]
Pred:[1 1 0 1 1 1 1 1]
True:[0 1 0 0 1 1 0 1]
4 + 73 = 223
------------
Error:[3.5852713]
Pred:[0 0 0 0 1 0 0 0]
True:[0 1 0 1 0 0 1 0]
71 + 11 = 8
------------
Error:[2.53352328]
Pred:[1 0 1 0 0 0 1 0]
True:[1 1 0 0 0 0 1 0]
81 + 113 = 162
------------
Error:[0.57691441]
Pred:[0 1 0 1 0 0 0 1]
True:[0 1 0 1 0 0 0 1]
81 + 0 = 81
------------
Error:[1.42589952]
Pred:[1 0 0 0 0 0 0 1]
True:[1 0 0 0 0 0 0 1]
4 + 125 = 129
------------
Error:[0.47477457]
Pred:[0 0 1 1 1 0 0 0]
True:[0 0 1 1 1 0 0 0]
39 + 17 = 56
------------
Error:[0.21595037]
Pred:[0 0 0 0 1 1 1 0]
True:[0 0 0 0 1 1 1 0]
11 + 3 = 14
------------

深度学习——02、深度学习入门——python实现RNN算法相关推荐

  1. 【CSDN软件工程师能力认证学习精选】如何入门Python与机器学习

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  2. python初学者怎么学习_Python初学者怎么入门 Python的学习方法有什么?

    Python非常适合那些没有任何基础的同学.在入门阶段,可以自己看一些Python相关的书,或者看视频教程,这是初学者有效的学习方法,再结合实操,就能入门了.Python没有指针变量类型这样的复杂概念 ...

  3. python速成一小时_Python学习|一小时快速入门python(一)

    1. hello world print('Hello World!')`--># 输出:Hello World! 2.基本数据类型 变量:python的变量直接输入不需要声明 a=5# pri ...

  4. 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序

    独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...

  5. 在路上---学习篇(一)Python 数据结构和算法 (3) --快速排序

    独白: 前几天学的基本简单排序算法,相对来说接受起来还是可以的,今天学的快速排序,视频看了2遍加上自己的思考,才真正的研究明白.自己的编程思维在逐渐的形成,日后还需勤加练习.心得:越高级的算法,越是让 ...

  6. 视频教程-人人都会深度学习之Tensorflow基础入门-深度学习

    人人都会深度学习之Tensorflow基础入门 大数据工程师/算法工程师/大数据讲师,毕业于西华大学软件工程专业.在大数据领域有着丰富的实战经验. 擅长领域:Spark/Hadoop.算法设计及系统架 ...

  7. 初学python的体会心得-分享给入门Python小白的学习心得

    原标题:分享给入门Python小白的学习心得 Python诞生于1989年,第一个公开版本于1991年问世.作为一门历史悠久的语言,Python具有代码简短.可读性强等先天优势.Python是一个很全 ...

  8. python找工作心得体会_分享给入门Python小白的学习心得

    原标题:分享给入门Python小白的学习心得 Python诞生于1989年,第一个公开版本于1991年问世.作为一门历史悠久的语言,Python具有代码简短.可读性强等先天优势.Python是一个很全 ...

  9. python快速编程入门黑马-新手如何快速入门Python编程?/开发python入门教程

    Python从入门到实践的教程是什么? 第一阶段Python与Linux数据这是Python的入段,也是帮助零基础学员打好基础的重要阶段,让零基础学员可以具备基础的编程能力,并掌握MySQL进阶内容. ...

最新文章

  1. 领域驱动设计 敏捷_反馈失败:发现敏捷数据驱动的致命弱点的风险
  2. python使用fpdf生成pdf文件章节(chapter),包含:页眉、页脚、章节主题、数据排版等;
  3. email util demo
  4. Docker的安装和使用及dockerfile简单使用
  5. show status like “table%“ 分析mysql表锁定
  6. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
  7. php u6d4b,PHP解码unicode编码的中文字符代码分享
  8. 有关数据库事务的一些理解-原生的Java的JDBC事务
  9. VS2010 TFS 如何把一个项目添加到源代码管理中及其他管理
  10. 最新使用Python进行开发网站教程项目实战(完整)
  11. 精致露营“风”,“吹”进小家电市场
  12. 【Python爬虫Scrapy框架】一、Scrapy爬虫框架的入门案例
  13. RX580 显卡gpu总是乱跳 求解,求解答
  14. Oracle:获取数据库系统的当前时间
  15. python中ret是什么意思_Python ret
  16. 基于51单片机智能家居监控系统设计仿真(proteus仿真+源码+报告)
  17. 这是一个开始,更是一个起点
  18. 音视频编辑合成,配音合成视频。
  19. 程序员老黄历,你见过python版的吗
  20. [转载]互联网Offer选择恐惧症

热门文章

  1. Struts自定义拦截器拦截器工作原理
  2. js中的局部变量和全局变量
  3. 如何让listView加入的HeaderView不可点击【转】
  4. MS讲座:可视化的软件架构设计和Portal Starter Kit挖宝记
  5. 1045 快速排序 (25 分)
  6. django手机访问_Django从入门到大作业:2-见网页
  7. Java黑皮书课后题第9章:**9.13(Location类)设计一个名为Location的类,定位二维数组中的最大值及其位置。
  8. 启动日志_Hybris服务器启动日志分析
  9. 2016年第一堂课课后作业1
  10. [给 ASP.NET初学者的话]挑书与买书,买适合自己的书