前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >神经网络连载(二)

神经网络连载(二)

作者头像
巴山学长
发布2019-07-15 15:34:48
3360
发布2019-07-15 15:34:48
举报
文章被收录于专栏:巴山学长

一:从生物角度开始

几乎地球上每一种动物都有其特定的神经系统,都是由简单的神经元组合成神经网络,然后完成其特定的功能。比如,简单的低等动物,就像蚂蚁。可能只有几十万个神经元。但可以完成觅食,战斗,判别气味等等复杂的功能。人类的计算机可以模拟上亿个神经元。在理论上讲,能完成的工作远远不止这些。(都是废话,下面进入主题)

二:神经元的结构

这是一个人工神经元的结构,模拟了一个生物意义上的神经元。其中x1,x2,x3.......都表示输入,wk1,wk2,wk3表示的是这个神经元对各个输入的权值。bk代表阈值,然后经过一个激活函数处理。得到了这一个神经元的输出,也就是下一个神经元的输入。大家对比一下下面的大脑神经元图片。发现有多相似点。

学过中学生物的都了解,一个神经元有很多树突,这都是这个神经元的输入信号。有一个轴突,是这个神经元的输出信号。轴突的末端分出很多条触手,分别对应到别的神经元的树突,这样就完成了信号的传播。在神经元中,信号的强弱会受到神经元的处理,对应着人工神经元的激活函数。很多个神经元按照如下方式组合在一起,就模拟人的神经系统,得到了神经网络。一个初级模型。

三:神经元的功能

1:输入与输出

对于每一个神经元来讲,输入和输出对于它来讲都十分重要。在这里再引入几个概念概念:

1.1权重w(i,j)。

代表的意思是上一层第i个神经元的输入以多大的比重到达这一层神经网络的第j个神经元.

1.2阈值B。

每个隐藏层神经元都有一个阈值。对应到生物中,意思是信号到了一定的强度才会激发。

1.3激活函数

神经元输入的信号需要经过处理才能够输出,处理输入信号的函数叫做激活函数。常见的激活函数如下

以上函数有共同的特点,将很大范围类的数字集中到很小的区间类,这样能方便进行处理。

四:代码实现

首先我们要定义上面的一些量,这一次我用到的是python作为开发工具。首先定义激活函数,我们用tanh(x)

代码语言:javascript
复制
def tanh(x):
    return np.tanh(x)


def tanh_deriv(x):
    return 1.0 - np.tanh(x) * np.tanh(x)

下一步,我们定义这个神经网络。

代码语言:javascript
复制
class NeuralNetwork:
    def __init__(self, layers, activation='tanh'):
        if activation == 'logistic':
            self.activation = logistic
            self.activation_deriv = logistic_derivative
        elif activation == 'tanh':
            self.activation = tanh
            self.activation_deriv = tanh_deriv

        self.weights = []
        for i in range(1, len(layers) - 1):
            self.weights.append(
                (2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1) * 0.25)
        self.weights.append(
            (2 * np.random.random((layers[-2] + 1, layers[-1])) - 1) * 0.25)

self.weights用来储存这些神经元的权值和阈值。一个for循环,用随机数初始化这些权值。跳出循环后加上阈值。这样就构成了一个神经网络简单模型。

此神经网络的功能是预测。我们还需要定义下面一个功能,由于篇幅有限,关于下面的代码,我在下一篇推送中会详细介绍。

代码语言:javascript
复制
    def predict(self, x):
            x = np.array(x)
            temp = np.ones(x.shape[0] + 1)
            temp[0:-1] = x
            a = temp
            for l in range(0, len(self.weights)):
                a = self.activation(np.dot(a, self.weights[l]))
            return a

下面,我演示一下这个简单的神经网络,我们定义了三层神经网络,实例化的nn就是这样nn = NeuralNetwork([2, 3, 1])。输入层有两个神经元,隐藏层有三个,输出层有一个。这样我们的输入就必须是两个,比如[[0, 0], [0, 1], [1, 0], [1, 1]]。这就是我们用到的输入,一共有四组,每组有两个,输出必须是一个,[0, 1, 1, 0]这是我们用到的四组输出,每组一个,与输入相互对应。这属于训练集。大家有什么不懂的,欢迎留言,我以后详细讲解。

大家记住,这是一个没有经过训练的神经网络,所以网络的输出和实际输出差距很大(网络输出在右下角,实际输出就是定义的四组输出),以后我会讲如何训练神经网络。到时候会达到惊人的吻合。

下面就是全部的代码(一个简单的框架,以后慢慢填充)。码字不易,大家多多支持。另外,暂时录不了带声音的视频(地下车库不让进),对一些朋友表达歉意。

代码语言:javascript
复制
import numpy as np


def tanh(x):
    return np.tanh(x)


def tanh_deriv(x):
    return 1.0 - np.tanh(x) * np.tanh(x)



class NeuralNetwork:
    def __init__(self, layers):

            self.activation = tanh
            self.activation_deriv = tanh_deriv

            self.weights = []
            for i in range(1, len(layers) - 1):
                self.weights.append(
                    (2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1) * 0.25)
            self.weights.append(
                (2 * np.random.random((layers[-2] + 1, layers[-1])) - 1) * 0.25)
            
    def predict(self, x):
            x = np.array(x)
            temp = np.ones(x.shape[0] + 1)
            temp[0:-1] = x
            a = temp
            for l in range(0, len(self.weights)):
                a = self.activation(np.dot(a, self.weights[l]))
            return a



nn = NeuralNetwork([2, 3, 1])
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 1, 1, 0])
for i in [[0, 0], [0, 1], [1, 0], [1, 1]]:
    print(i, nn.predict(i))

参考文献链接:https://blog.csdn.net/sunlanchang/article/details/71791628

本文作者:南海一号

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

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