• 技术文章 >后端开发 >Python教程

    Python中递归神经网络实现的简单示例分享

    黄舟黄舟2017-08-11 14:00:57原创1308
    这篇文章主要介绍了Python实现的递归神经网络,是一篇摘录自github代码片段的文章,涉及Python递归与数学运算相关操作技巧,需要的朋友可以参考下

    本文实例讲述了Python实现的递归神经网络。分享给大家供大家参考,具体如下:


    # Recurrent Neural Networks
    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 = 8
    largest_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)) - 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):
      # generate a simple addition problem (a + b = c)
      a_int = np.random.randint(largest_number/2) # int version
      a = int2binary[a_int] # binary encoding
      b_int = np.random.randint(largest_number/2) # int version
      b = int2binary[b_int] # binary encoding
      # true answer
      c_int = a_int + b_int
      c = int2binary[c_int]
      # where we'll store our best guess (binary encoded)
      d = np.zeros_like(c)
      overallError = 0
      layer_2_deltas = list()
      layer_1_values = list()
      layer_1_values.append(np.zeros(hidden_dim))
      # moving along the positions in the binary encoding
      for position in range(binary_dim):
        # generate input and output
        X = 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_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 out)
        d[binary_dim - position - 1] = np.round(layer_2[0][0])
        # store hidden layer so we can use it in the next timestep
        layer_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 layer
        layer_2_delta = layer_2_deltas[-position-1]
        # error at hidden layer
        layer_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 again
        synapse_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 * alpha
      synapse_1 += synapse_1_update * alpha
      synapse_h += synapse_h_update * alpha
      synapse_0_update *= 0
      synapse_1_update *= 0
      synapse_h_update *= 0
      # print(out progress)
      if j % 1000 == 0:
        print("Error:" + str(overallError))
        print("Pred:" + str(d))
        print("True:" + str(c))
        out = 0
        for 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
    ------------

    以上就是Python中递归神经网络实现的简单示例分享的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Python 神经网络 简单
    上一篇:Python中两种方法实现模拟登陆的代码实例 下一篇:Python播放wav文件(调用系统底层API)的方法
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• Python怎么利用contextvars实现管理上下文变量• 总结分享Python冷门的技巧• 带你了解Python进程管理神器Supervisor• Python的functools模块使用总结• python虚拟环境配置与管理
    1/1

    PHP中文网