BPNアルゴリズムの練習

BPNアルゴリズム

BPNアルゴリズムの学習は、次の2つのプロセスに分けることができます。順
伝播:入力はネットワークに供給され、信号は隠れ層を介して入力層から出力層に伝播します。出力層では、エラー関数と損失関数が計算されます。
バックプロパゲーション:バックプロパゲーションでは、最初に出力層のニューロンの損失関数の勾配が計算され、次に隠れ層のニューロンの損失関数の勾配が計算されます。次に、重みをグラデーションで更新します。

最後に、epoch、batch_size、および入力と出力の形状の意味を明確にしました。パラメータの調整とトレーニングモデルが混同されることはもうありません。

結果

2020-01-15 21:30:10.556053:I tensorflow / stream_executor / platform / default / dso_loader.cc:44]動的ライブラリcublas64_100.dllを正常に開きました
エポック:0精度トレイン%:9.748333333333333精度テスト%:10.55
エポック:1000精度train%:81.77333333333333精度テスト%:89.64
エポック:2000精度train%:83.83精度テスト%:91.26
エポック:3000精度train%:84.73333333333333精度テスト%:91.96
エポック:4000精度train%:85.51666666666667精度テスト%:92.95
エポック: 5000精度トレイン%:86.02精度テスト%:93.38
エポック:6000精度トレイン%:86.46精度テスト%:93.59
エポック:7000精度トレイン%:86.68666666666667精度テスト%:93.49
エポック:8000精度トレイン%:86.965精度テスト%:93.88
エポック:9000精度トレイン%:87.11833333333334精度テスト%:93.71
エポック:10000精度トレイン%:87.335精度テスト%:94.15
エポック:11000精度トレイン%:87.39166666666667精度テスト%:94.06
エポック:12000精度トレイン%:87.65精度テスト% :94.34

プロセスは終了コード0で終了しました

BPNのネットワーク構造

コード:コードを自分でノックアウトし、各ステップの実行原理を理解して、トレーニングネットワークの各ステップの実行方法、順伝播、隠れ層計算、逆伝播、重みの更新などがどのように機能するかを明確に理解できるようにします。
隠れ層のあるニューラルネットワーク
入力層:x_in行列構造60x784データ行列
W_hは784x30重み行列
b_hは1x30バイアス行列
W_oは30x10出力層重み行列
b_oは1x30出力層バイアス
図は次のとおりです
ネットワーク内のデータの形状
。X_inとw_hの間は行列の乗算です。つまり、x_inの各行要素にw_hの各列の対応する要素が乗算され、その合計が累積されて、結果行列の対応する位置の値になります。
matmul
上記は、順伝播の分解を示しています。
エポックは数に等しいです。つまり、同じステップが実行されてから、ウェイトネットワークを更新するために数ラウンドのトレーニングが実行されます。
ネットワークの実装:

def multilayer_perception(x, weights, biases):
    # 隐藏层的激活函数RELU
    h_layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['h1'])
    h_layer_out = tf.sigmoid(h_layer_1)
    out_layer = tf.matmul(h_layer_out, weights['out']) + biases['out']
    return tf.sigmoid(out_layer),out_layer,h_layer_out,h_layer_1

誤差逆伝播法

損失関数J(w):
ここに画像の説明を挿入
Jは、重みの各パラメーターの偏導関数を計算します。これは、アクティブ化を出力するためのJからy_hat、out_layerからh_layer_outからh_layer_1、そしてチェーン導関数に相当します。
まだはっきりしていませんので、高い数字を参考にしてください。またはチュートリアルのテンソルフロー
学習で使用される活性化関数は、その導関数であるシグモイドです。

# 导函数:sigmoid(x)[1.0-sigmoid(x)]
def sigmaprime(x):
    return tf.multiply(tf.sigmoid(x),tf.subtract(tf.constant(1.0), tf.sigmoid(x)))

達成するための後方伝播

# 向后传播
delta_2 = tf.multiply(err,sigmaprime(h_2))
# transpose 转置运算
delta_w_2 = tf.matmul(tf.transpose(o_1),delta_2)

wtd_error = tf.matmul(delta_2, tf.transpose(weight['out']))
delta_1 = tf.multiply(wtd_error, sigmaprime(h_1))
delta_w_1 = tf.matmul(tf.transpose(x_in), delta_1)

次に、学習率と組み合わせた勾配降下の方向に従って重みが更新されます。

# update weights
# tf.assign(ref, value, validate_shape=None, use_locking=None, name=None)
# 函数完成了将value赋值给ref的作用。其中:ref 必须是tf.Variable创建的tensor
step = [
    tf.assign(weight['h1'], tf.subtract(weight['h1'],tf.multiply(eta,delta_w_1))),
    tf.assign(bias['h1'], tf.subtract(bias['h1'],tf.multiply(eta,tf.reduce_mean(delta_1,axis=[0])))),
    tf.assign(weight['out'], tf.subtract(weight['out'],tf.multiply(eta,delta_w_2))),
    tf.assign(bias['out'], tf.subtract(bias['out'],tf.multiply(eta,tf.reduce_mean(delta_2,axis=[0]))))
]

個人的に成功を実践するためのコードを添付する

#!/usr/bin/python
# -*- coding = utf-8 -*-
#author:beauthy
#date:2020.1.15
#version:1.0
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# 加载数据集 使用独热编码标签
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)
# 28 X 28 = 784 标签分为10个类0-9
# 超参数包括:学习率、最大迭代周期、每次批量训练的批量大小、以及每次隐藏层中的神经元数量
n_input = 784
n_classes = 10

max_epochs = 12001
learning_rate = 0.15
batch_size = 60
seed = 0
# number of neurons in the hidden layer
n_hidden = 30

# 使用sigmoid函数的导数进行权重更新
# 导函数:sigmoid(x)[1.0-sigmoid(x)]
def sigmaprime(x):
    return tf.multiply(tf.sigmoid(x),tf.subtract(tf.constant(1.0), tf.sigmoid(x)))
def multilayer_perception(x, weights, biases):
    # 隐藏层的激活函数RELU
    h_layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['h1'])
    h_layer_out = tf.sigmoid(h_layer_1)
    out_layer = tf.matmul(h_layer_out, weights['out']) + biases['out']
    return tf.sigmoid(out_layer),out_layer,h_layer_out,h_layer_1

def train_mnist_model():
    x_in = tf.placeholder(tf.float32, [None,n_input])
    y = tf.placeholder(tf.float32, [None,n_classes])
    weight = {
    
    
        'h1': tf.Variable(tf.random_normal([n_input, n_hidden],seed=seed)),
        'out': tf.Variable(tf.random_normal([n_hidden,n_classes],seed=seed))
    }
    bias = {
    
    
        'h1': tf.Variable(tf.random_normal([1, n_hidden],seed=seed)),
        'out': tf.Variable(tf.random_normal([1, n_classes],seed=seed))
    }

    # 前向传播
    y_hat, h_2, o_1,h_1 = multilayer_perception(x_in,weight,bias)

    # 误差
    err = y_hat - y

    # 向后传播
    delta_2 = tf.multiply(err,sigmaprime(h_2))
    # transpose 转置运算
    delta_w_2 = tf.matmul(tf.transpose(o_1),delta_2)

    wtd_error = tf.matmul(delta_2, tf.transpose(weight['out']))
    delta_1 = tf.multiply(wtd_error, sigmaprime(h_1))
    delta_w_1 = tf.matmul(tf.transpose(x_in), delta_1)

    eta = tf.constant(learning_rate)

    # update weights
    # tf.assign(ref, value, validate_shape=None, use_locking=None, name=None)
    # 函数完成了将value赋值给ref的作用。其中:ref 必须是tf.Variable创建的tensor
    step = [
        tf.assign(weight['h1'], tf.subtract(weight['h1'],tf.multiply(eta,delta_w_1))),
        tf.assign(bias['h1'], tf.subtract(bias['h1'],tf.multiply(eta,tf.reduce_mean(delta_1,axis=[0])))),
        tf.assign(weight['out'], tf.subtract(weight['out'],tf.multiply(eta,delta_w_2))),
        tf.assign(bias['out'], tf.subtract(bias['out'],tf.multiply(eta,tf.reduce_mean(delta_2,axis=[0]))))
    ]

    # accuracy
    # tf.argmax(input)用途:返回最大的那个数值所在的下标
    # 1表示按行比较返回最大值的索引
    # equal(x, y, name=None)
    # equal,相等的意思。顾名思义,就是判断,x, y 是不是相等,它的判断方法不是整体判断,
    # 逐个元素判断,相等就是True,不相等就是False。
    acct_mat = tf.equal(tf.argmax(y_hat,1), tf.argmax(y,1))
    accuracy = tf.reduce_sum(tf.cast(acct_mat,tf.float32))

    init = tf.global_variables_initializer()

    # 计算图
    with tf.Session() as sess:
        sess.run(init)
        for epoch in range(max_epochs):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            sess.run([y_hat, h_2, o_1, h_1], feed_dict={
    
    x_in:batch_xs})
            sess.run(step, feed_dict={
    
    
                x_in: batch_xs,
                y:batch_ys
            })
            if epoch%1000 == 0:
                acc_test = sess.run(accuracy,feed_dict={
    
    
                    x_in: mnist.test.images,
                    y: mnist.test.labels
                }) #测试数据集的大小是 1000
                acc_train = sess.run(accuracy,feed_dict={
    
    
                    x_in: mnist.train.images,
                    y: mnist.train.labels
                })
                print('Epoch: {0} accuracy train%:{1} accuracy test%:{2}'
                      .format(epoch,acc_train/600,acc_test/100))

if __name__ == "__main__":
    train_mnist_model()
    pass

おすすめ

転載: blog.csdn.net/beauthy/article/details/105119409