ない気まぐれ:pythonの独自のニューラルネットワークを書くようにしてください

まず、ニューラルネットワークは何ですか?相互接続(ニューロン)成分の数千億によるヒト脳細胞のシナプス。シナプスの着信十分な興奮は、神経細胞の興奮を引き起こす可能性があります。このプロセスは、「思考」と呼ばれています。

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

私たちは、このプロセスをシミュレートするために、コンピュータ上でニューラルネットワークを書くことができます。生体分子レベルでのみアナログルール、人間の脳をシミュレートするために、より高いレベルを必要としません。我々は、マトリックス(二次元データテーブル)この数学的ツールを使用し、簡単にするため、3つのだけの入力と1つの出力ニューロンをシミュレートします。

私たちは、次のような問題を解決するために、ニューロンを訓練します。前者の例としては、4つのトレーニングセットと呼ばれています。あなたは、出力は常に一番左の列の入力値に等しくなることがあります。だから、「?「1にする必要があります。

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

トレーニング方法

しかし、どのように私たちの神経細胞を作るためには、正しい答え?与えられた各入力重量は、正または負の数であってもよいです。出力ニューロンを決定する大きな正(または負)の重量入力を有します。重量当たりの重量は、第1の乱数の初期値を設定し、トレーニングプロセスを開始します:

  1. その出力ニューロンは、特定の式により算出される調整量を用いて、訓練入力のサンプルを取ります。
  2. エラー、ニューロンにおける予想される出力とトレーニングサンプル間の、すなわち差を計算します。
  3. 誤差は多少の重みを調整しています。
  4. このプロセスは、10万回も繰り返されます。

 

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

最終重量はトレーニングセットに合わせて最適なソリューションとなります。ニューロンは、この法律の新しいケースを考えると、それは良い予測を与えます。

このプロセスはBPです。

出力ニューロン式

あなたは、どのような式ニューロン出力がある計算に考えるかもしれませんか?まず、重み付けされた入力およびニューロン、すなわちを計算し、

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

その後、標準化、0と1の間で結果を確認します。この数学関数を使用して--Sigmoid機能を実行します。

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

シグモイド関数は、パターン「S」字曲線です。

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

第二、出力ニューロンの計算のための最終的な式に最初の式を代入します。

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

重い重量調整式

私たちは常に訓練中に重みを調整します。しかし、どのようにそれを調整するには?あなたは、「エラー加重デリバティブ」の式を使用することができます。

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

なぜ、この式を使うのか?まず第一に、私たちは、比例サイズ変更やエラーを作りたいです。入力が0であれば第二に、入力(0又は1)により、重みは調整されないであろう。最後に、勾配はシグモイド曲線(図4)を乗じました。

シグモイド曲線の傾きが導出することによって得ることができます。

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

最初の式に第2式を代入し、重みが最終的な式の重みを与えるように調整します。

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

Pythonコードの構造

我々は、ニューラルネットワークライブラリを使用しませんでしたが、4つの方法でnumpyのPythonの数学ライブラリをインポートしますが。彼らは以下のとおりです。

  • 自然指数をexp--
  • array--行列を作成します
  • dot--マトリックス乗算
  • random--乱数を生成します

 

行列の転置(行変数列)のための「.T」が方法。だから、このストアデジタルコンピュータ:

パイソンの9行でシンプルな神経回路網を書きますか? あなたが信じることを敢えてか? それは超シンプルに見えます

 

ソースコードの行ごとに、私はすべてを説明するコメントを追加します。各反復で、我々はまた、すべてのトレーニングデータを扱うことに注意してください。そう変数は、マトリックス(二次元データテーブル)です。次のサンプルコードは、Pythonのと完全に書かれています。

#numpy导入自然指数,创建矩阵,产生随机数,矩阵乘法的方法
from numpy import exp,array,random,dot

class NeuralNetwork(object):     def __init__(self):         #指定随机数发生器种子,保证每次获得相同结果的随机数         random.seed(1)         #对含有3个输入一个输出的单个神经元建模         #即3*1矩阵(树突)赋予随机权重值。范围(-1,1)         #即(a,b)范围的c*d矩阵随机数为(b-a)*random.random((c,d))+a         self.dendritic_weights = 2*random.random((3,1))-1     #Sigmoid函数,s形曲线,用于对输入的加权总和x做(0,1)正规化     #它可以将一个实数映射到(0,1)的区间     def __sigmoid(self,x):         return 1/(1+exp(-x))     #Sigmoid函数的导数(梯度)(当前权重的置信程度,越小代表越可信)     #这里的x指的是1/(1+exp(-x)),即output输出     def __sigmoid_derivative(self,x):         return x*(1-x)     #训练该神经网络,并调整树突的权重     def train(self,training_inputs,training_outputs,number_of_training_iterations):         '''         training_inputs:训练集样本的输入         training_outputs:训练集样本的输出         number_of_training_iterations:训练次数         1.我们使用Sigmoid曲线计算(输入的加权和映射到0至1之间)作为神经元的输出         2.如果输出是一个大的正(或负)数,这意味着神经元采用这种(或另一种)方式,         3.从Sigmoid曲线可以看出,在较大数值处,Sigmoid曲线斜率(导数)小,即认为当前权重是正确的,就不会对它进行很大调整。         4.所以,乘以Sigmoid曲线斜率便可以进行调整         '''         for iteration in range(number_of_training_iterations):             #训练集导入神经网络             output = self.think(training_inputs)             #计算误差(实际值与期望值的差)             error = training_outputs - output             #将误差乘以输入,再乘以S形曲线的梯度             adjustment = dot(training_inputs.T,error*self.__sigmoid_derivative(output))             #对树突权重进行调整             self.dendritic_weights += adjustment         #神经网络     def think(self,inputs):         #输入与权重相乘并正规化         return self.__sigmoid(dot(inputs,self.dendritic_weights)) if __name__ == '__main__':     #初始化神经网络nn     nn = NeuralNetwork()     #初始权重     print("初始树突权重:{}".format(nn.dendritic_weights))     #训练集,四个样本,每个样本有3个输入,1个输出     #训练样本的输入     training_inputs_sample = array([[0,0,1],                                     [1,1,1],                                     [1,0,1],                                     [0,1,1]])     #训练样本的输出     training_outputs_sample = array([[0,1,1,0]]).T     #用训练集训练nn,重复一万次,每次做微小的调整     nn.train(training_inputs_sample,training_outputs_sample,100000)     #训练后的树突权重     print("训练后树突权重:{}".format(nn.dendritic_weights))     #用新数据进行测试     test_result = nn.think(array([1,0,0]))     print('测试结果:{}'.format(test_result))

 

 

エピローグ

実行した後、あなたがこのような結果が表示されます。

 

 

我々はそれをやりました!私たちは、単純なニューラルネットワークを構築するためのPythonを使用します!

まず、自分の体重のランダムなニューラルネットワークを与え、その後、自分自身を訓練するためにトレーニングセットを使用します。次に、それが新しい場合を考える[1、0、0]と0.99993704予測されます。正解は1です。非常に近いです!

おすすめ

転載: www.cnblogs.com/rrh4869/p/11204224.html