前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >神经网络的简单例子

神经网络的简单例子

原创
作者头像
_咯噔_
修改2020-04-23 10:14:49
1.3K0
修改2020-04-23 10:14:49
举报
文章被收录于专栏:CS学习笔记CS学习笔记

上次说了梯度下降用于简单的线性回归问题,这次将梯度下降用于较复杂一点的神经网络结构。

  • 网络模型比较简单,分为三层,分别为输入层、隐藏层、输出层,每层节点数可以自己定义
  • 每个神经元将输入信号加权求和,激活函数采用sigmoid函数
  • init函数初始化网络相关参数,包括随机初始化两个链接权重矩阵,采用的是一种稍微复杂的初始化方法,使用正态分布采样权重,均值为0,方差为1/\sqrt{传入链接数},权重切忌取成一样的值也不能取0值
  • train函数负责训练,采用梯度下降法更新链接权重,误差函数使用平方差函数,学习率和迭代次数可自己调节
  • query函数针对输入给出输出,主要用于测试样本

代码语言:txt
复制
class neuralNetwork :

    # initialise the neural network
    def __init__(self, inputnodes, hiddennodes, outputnodes,learningrate) :
        # set number of nodes in each input, hidden, output layer
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes

        # link weight matrices, wih and who
        # weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
        # w11 w21
        # w12 w22 etc
        self.wih = numpy.random.normal(0.0, pow(self.hnodes,-0.5), (self.hnodes, self.inodes))
        self.who = numpy.random.normal(0.0, pow(self.onodes,-0.5), (self.onodes, self.hnodes))
        # learning rate
        self.lr = learningrate

        # activation function is the sigmoid function
        self.activation_function = lambda x: scipy.special.expit(x)



    # train the neural network
    def train(self, inputs_list, targets_list, num_iter) :
        # convert inputs list to 2d array
        inputs = numpy.array(inputs_list, ndmin=2).T
        targets = numpy.array(targets_list, ndmin=2).T

        for i in range(0, num_iter):
            
            # calculate signals into hidden layer
            hidden_inputs = numpy.dot(self.wih, inputs)
            # calculate the signals emerging from hidden layer
            hidden_outputs = self.activation_function(hidden_inputs)

            # calculate signals into final output layer
            final_inputs = numpy.dot(self.who, hidden_outputs)
            # calculate the signals emerging from final output layer
            final_outputs = self.activation_function(final_inputs)
        
            output_errors = targets - final_outputs

            hidden_errors = numpy.dot(self.who.T, output_errors)

            self.who += self.lr * numpy.dot(output_errors * final_outputs * (1 - final_outputs), hidden_outputs.T)
            self.wih += self.lr * numpy.dot(hidden_errors * hidden_outputs * (1 - hidden_outputs), inputs.T)
            
            if i % 1000 == 0:
                print("%d st iteratiton"%i)
                print(final_outputs)
                #print(self.wih)
                #print(self.who)
                
        print("final_outputs:")
        print(final_outputs)

            
    # query the neural network
    def query(self, inputs_list) :
        # convert inputs list to 2d array
        inputs = numpy.array(inputs_list, ndmin=2).T

        # calculate signals into hidden layer
        hidden_inputs = numpy.dot(self.wih, inputs)
        # calculate the signals emerging from hidden layer
        hidden_outputs = self.activation_function(hidden_inputs)

        # calculate signals into final output layer
        final_inputs = numpy.dot(self.who, hidden_outputs)
        # calculate the signals emerging from final output layer
        final_outputs = self.activation_function(final_inputs)

        return final_outputs
    

这里的输入和输出只给一组数据作为训练样本,主要来说明神经网络训练的效果,注意输入输出的值都不要给的过大,0~1之间最佳,但切忌取0

代码语言:txt
复制
n = neuralNetwork(3, 3, 3, 0.02)
n.train([1.0, 0.5, 0.8],[0.2, 0.9, 0.5], 4000)

每1000次打印输出,可以看到网络的输出渐渐接近于我们给定的目标输出值[0.2, 0.9, 0.5],达到训练的效果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档