zoukankan      html  css  js  c++  java
  • 简单神经网络的构建


    参考文章:
    https://www.zybuluo.com/hanbingtao/note/476663
    https://www.zybuluo.com/hanbingtao/note/448086


    # -*- coding: utf-8 -*-
    import numpy as np
    def sigmoid(x):#激活函数
        return 1/(1+np.exp(-x))
    input1 = np.array([[0.35],[0.9],[0.58],[0.78]]) #输入数据  4x1
    w1 = np.random.rand(3,4)#第一层权重参数                                    3x4
    w2 = np.random.rand(2,3)#第二层权重参数                                    2x3
    real = np.array([[0.5],[0.7]])#标签
    for s in range(100):
        output1 = sigmoid(np.dot(w1,input1))#第一层输出  3x1
        output2 = sigmoid(np.dot(w2,output1))#第二层输出,也即是最终输出    2x1
        cost = np.square(real-output2)/2#误差      2x1
        delta2=output2*(1-output2)*(real-output2)          #2x1
        delta1=output1*(1-output1)*w2.T.dot(delta2)      #3x1
        w2 = w2 + delta2.dot(output1.T)                        #2x3
        w1 = w1 + delta1.dot(input1.T)                         #3x4
        print(output1)
        print(output2)
        print(cost)
    

    代码剖析

    def sigmoid(x):#激活函数
        return 1/(1+np.exp(-x))
    

    定义激活sigmoid激活函数的定义:
    此处输入图片的描述


    output1 = sigmoid(np.dot(w1,input1))#第一层输出  3x1
    output2 = sigmoid(np.dot(w2,output1))#第二层输出,也即是最终输出    2x1
    

    第一层输出和第二层输出
    第一层输出的计算方式是:
    样本数据 左乘 权重
    $vec{a}=f(Wcenterdotvec{x})qquad $
    第二层类似,只不过替换为第一层的输出左乘权重


    cost = np.square(real-output2)/2#误差      2x1
    

    计算误差:$e=frac{1}{2}(y-ar{y})^2$
    误差主要是用来衡量模型效果的


    delta2=output2*(1-output2)*(real-output2)          #2x1
    delta1=output1*(1-output1)*w2.T.dot(delta2)      #3x1
    

    计算误差项:
    误差项 主要是用来更新权重使用的

    • 对于输出层节点:
      $delta_i=y_i(1-y_i)(t_i-y_i)qquad$
      其中,$delta_i$是节点$i$的误差项,$y_i$是节点$i$的输出值,$t_i$是样本对应于节点$i$的目标值

    • 对于隐藏层节点:
      $delta_i=a_i(1-a_i)sum_{kin{outputs}}w_{ki}delta_kqquad$
      其中,$a_i$是节点的输出值,$w_{ki}$是节点$i$到它的下一层节点$k$的连接的权重,$delta_k$是节点$i$的下一层节点$k$的误差项。例如,对于隐藏层节点4来说,计算方法如下:
      $delta_4=a_4(1-a_4)(w_{84}delta_8+w_{94}delta_9)$


     w2 = w2 + delta2.dot(output1.T)                        #2x3
     w1 = w1 + delta1.dot(input1.T)                         #3x4
    

    最后,更新每个连接上的权值:
    $w_{ji}gets w_{ji}+etadelta_jx_{ji}qquad$

    其中,$w_{ji}$是节点$i$到节点$j$的权重,$eta$是一个成为学习速率的常数,$delta_i$是节点$i$的误差项,$x_{ji}$是节点$i$传递给节点$j$的输入。例如,$w_{84}$权重的更新方法如下:
    $w_{84}gets w_{84}+etadelta_8 a_4$

  • 相关阅读:
    jQuery核心函数——(一)
    ECMAScript——(二)
    JS简介——(一)
    jQuery动态给下拉列表添加一个选项(创建DOM对象)
    Ajax异步请求struts的JSON机制(省市区三级联动)
    struts2官方演示程序总结struts2-blank
    详解数据库之存储过程与错误处理
    使用jdk的socket通信
    hadoop深入研究:(五)——Archives
    解决删除Volume报错的问题
  • 原文地址:https://www.cnblogs.com/zfcode/p/9144338.html
Copyright © 2011-2022 走看看