Pythonの手書き数字認識、対応する数式と詳細な手順
まず、数学的な導出
2つのプログラムコード
第三に、コードおよび対応する方程式
私たちが最初に彼らの数学的な導出を見なければならないが、コードは見ることができません。しかし、導出は、必ずそれらを読んで。
4つのコア式アルゴリズム1.BP
パラメータリスト
x = np.array(x)
y = np.array(y)
weights = [] # 权重列表
bias = [] # 偏置列表
xは、yは出力変数、入力変数はどこである
X 33の555サンプル値に変数x 784の相当する[X 1、X 2、X 。3、...、xは784 ]
Y 33555のまた、サンプル値を、Y 0-9の番号に対応する出力た
重量が重量であり、バイアスがバイアスされ
、Y = AX + B、当量、バイアス等価Bと同様。
重みの重みは、それが上の写真から見て、それぞれ第一の層(入力層)に対応する、2つの要素を有している- >第二の層(中間層)は、第2層(中間層) - >第三の層(出力層) 、ニューラルネットワークが持つ三層感覚で見ることができます。
注:重量、バイアスは、ランダムに初期化されます。例えば
layers = [784,784,10]
for i in range(1, len(layers)): # 正态分布初始化
self.weights.append(np.random.randn(layers[i-1], layers[i]))
self.bias.append(np.random.randn(layers[i]))
アクティベーション機能
def sigmoid(x): # 激活函数采用Sigmoid
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x): # Sigmoid的导数
return sigmoid(x) * (1 - sigmoid(x))
まず、バックプロパゲーションアルゴリズム
a = [x[k % n]] # 保存各层激活值的列表
ニューロンの出力を表し、それは最初のサンプル値xに対応する入力層のニューロンの出力層であるれているため
、前方伝播が始まり
for lay in range(len(self.weights)):
a.append(self.activation(np.dot(a[lay], self.weights[lay]) + self.bias[lay]))
前記活性化は、対応する重みプラスバイアスを掛けた各レイヤの出力コードループ手段ニューロンの活性化関数です。活性化して得られた関数値
バックプロパゲーションの開始を
label = np.zeros(a[-1].shape)#shape得到a[-1]的维度
label[y[k % n]] = 1 # 根据类号生成标签
error = label - a[-1] # 误差值
#a[-1]从后往前第一组数据
deltas = [error * self.activation_deriv(a[-1])] # 保存各层误差值的列表
layer_num = len(a) - 2 # 导数第二层开始
for j in range(layer_num, 0, -1):
deltas.append(deltas[-1].dot(self.weights[j].T) * self.activation_deriv(a[j])) # 误差的反向传播
deltas.reverse()
反復-1導出意味バックデルタとは逆の順序でのために、これは正確にポイントの逆の派生です。
フォワード重みが更新されます
for i in range(len(self.weights)): # 正向更新权值
layer = np.atleast_2d(a[i])
delta = np.atleast_2d(deltas[i])
self.weights[i] += learning_rate * layer.T.dot(delta)
self.bias[i] += learning_rate * deltas[i]
コード
self.weights[i] += learning_rate * layer.T.dot(delta)
self.bias[i] += learning_rate * deltas[i]
層layer.Tマトリックス行くことを意味する、対応するパラメータを解きます
終了
間違った場所がある場合はこれまでのところ、あなたのプログラムの基本的な側面があり、式に対応する紹介、ギャングポインティングまたは2をご了承ください。
最後に、式控除と書き込みコード大物を提供するために、感謝。