熟悉最简单的神经网络及其分步实施

当我遇到Tarik Rashid所著的《创建您的神经网络》一书时。 与许多其他有关神经网络的书籍不同,本文以简单的语言介绍了所有内容,并提供了足够的示例和技巧

受到本书的启发,我想逐步学习它,即它的实践部分,为最简单的神经网络编写代码
本文适用于那些想要从事神经网络和机器学习,但到目前为止仍难以理解这一令人惊奇的科学领域的人。 下面将描述神经网络代码的最简单框架 ,以便使许多人理解该神经网络所组成的所有事物的最简单构造和相互作用原理。

图片


Habré上有关机器学习和神经网络的理论就足够了。 但是,如果有人需要它,我将在文章末尾留下一些链接。 现在,我们将开始直接编写代码,我们将使用Python编写代码,建议您在编写代码时使用Jupyter-Notebook

步骤1.网络初始化


首先,当然,我们需要初始化网络的所有活动组件

# numpy —    Python,        import numpy #  scipy.special , -scipy    , ,  ,      ,       ,   - " " import scipy.special #,      import matplotlib.pyplot #     class neuralNetwork: #     def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): #     ,   ,   ,  ) #     ,  ,   self.inodes = inputnodes self.hnodes = hiddennodes self.onodes = outputnodes #    , wih -       ,    who-       self.wih = numpy.random.rand(self.hnodes, self.inodes) self.who = numpy.random.rand(self.onodes, self.hnodes) #   -  ,  ,  ,    ,     ,     ,  ,  ,   self.lr = learningrate #  -   self.activation_function = lambda x: scipy.special.expit(x) 

乙状结肠


此函数属于连续函数的类别,在输入时采用任意实数(即不一定是整数)在输出中给出从0到1的实数

特别是,大(模) 负数变为零而大正 变为1

它的输出可以很好地解释神经元激活的水平 :从没有激活 (0)到完全饱和的激活 (1)。

乙状结肠由下式表示:

图片

S型函数的图形如下图所示:

图片

乙状结肠功能为:

  • 连续的
  • 单调增加;
  • 可区分的。

如您所见,在此代码中,以信号expit(x)的形式出现了S型信号。

关于节点在神经网络中的外观


图片

图片显示了最多的那个节点,只有通常以圆形而不是矩形的形式显示。 如我们所见,在矩形(井或圆形)内-这都是抽象的,有2个函数:

第一个功能是这样的事实:它接收所有输入,并考虑到权重,数据,有时甚至考虑到位移神经元(一种特殊的神经元,它只允许图形移动,而不会混入一个丑陋的堆中,仅此而已)

第二功能将与第一功能求和的值相同的参数作为参数,而第二功能称为激活功能。 在我们的例子中, 乙状结肠

我们继续

第2部分。神经网络训练


 def train(self, inputs_list, targets_list): #       inputs = numpy.array(inputs_list, ndmin=2).T #     input targets = numpy.array(targets_list, ndmin=2).T #  targets #      hidden_inputs = numpy.dot(self.wih, inputs) #  ,       .    ,       hidden_inputs (1 ),        -   (2 ) hidden_outputs = self.activation_function(hidden_inputs) #    ()  final_inputs = numpy.dot(self.who, hidden_outputs) #  ,     final_outputs = self.activation_function(final_inputs) #   ( - ) output_errors = targets - final_outputs #      ,    <b>  </b>,   <b>       </b>(      ) hidden_errors = numpy.dot(self.who.T, output_errors) #        ( ,      ) self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs)) #       (       ) self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs)) 

现在我们快结束了

第3部分。神经网络的询问


 #  ,      def query(self, inputs_list): #         inputs = numpy.array(inputs_list, ndmin=2).T #      hidden_inputs = numpy.dot(self.wih, inputs) #  ,     hidden_outputs = self.activation_function(hidden_inputs) #      final_inputs = numpy.dot(self.who, hidden_outputs) #     ,     final_outputs = self.activation_function(final_inputs) return final_outputs 

我们把它结束


 #     ,  ,  (  <b></b>-    , ,   input_nodes = 3 hidden_nodes = 3 output_nodes = 3 #    -   , ... 0.3! learning_rate = 0.3 #   (n    neuralNetwork ,      __init__ ,        n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate) 

聚苯乙烯


上面介绍了神经网络的一个计算最简单的模型。 但没有显示具体的应用。

如果您愿意,可以通过在MNIST代码中添加识别手写文本的功能来走得更远 ,为此,您可以完全使用jupyter文件来弄清楚(并从中获得乐趣),我的任务是演示代码,并在可能的情况下咀嚼网络,并为什么答案

PPS


您将在下面找到有用的链接:

1.链接到Github Tarik- >
2.他的书->
3.机器学习理论->
4,机器学习理论->
5,机器学习理论->

Source: https://habr.com/ru/post/zh-CN440190/


All Articles