1. 程式人生 > >神經網路 權重視覺化

神經網路 權重視覺化

深度學習已經應用在各種不同的領域,並且都取得了不錯的效果,但是在很多情況下,深度學習網路被我們看做一個黑匣子,我們不知道通過訓練,我們的網路到底學習到了什麼。今天給大家分享一個簡單的權重視覺化的方法,在我們訓練完網路之後,可以通過權重視覺化,直觀的理解網路到底學習到了什麼。本次實驗基於MNIST資料集,通過建立一個兩層的神經網路,採用softmax對資料集進行分類。訓練完成之後,就可以看到網路的權重分佈了。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

import pylab
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
x = tf.placeholder(tf.float32, [None, 784])
y_actual = tf.placeholder(tf.float32, shape=[None, 10])
W1 = tf.Variable(tf.random_normal([784,10]))        #初始化權值W
b1 = tf.Variable(tf.random_normal([10]))            #初始化偏置項b
layer1=tf.nn.sigmoid(tf.matmul(x,W1) + b1)
y_predict = tf.nn.softmax(layer1)     #加權變換並進行softmax迴歸,得到預測概率
regularizer=tf.contrib.layers.l2_regularizer(0.05) 
regloss=regularizer(W1)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_actual*tf.log(y_predict),reduction_indices=1))   #損失函式為交叉熵
totalloss=cross_entropy+regloss
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(totalloss)   #用梯度下降法使得殘差最小

correct_prediction = tf.equal(tf.argmax(y_predict,1), tf.argmax(y_actual,1))   #在測試階段,測試準確度計算
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))                #多個批次的準確度均值

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    
    for i in range(10000):               #訓練階段,迭代10000次
        batch_xs, batch_ys = mnist.train.next_batch(100)           #按批次訓練,每批100行資料
        sess.run(train_step, feed_dict={x: batch_xs, y_actual: batch_ys})   #執行訓練
        if(i%1000==0):                  #每訓練1000次,測試一次
            print ("accuracy:",sess.run(accuracy, feed_dict={x: mnist.test.images, y_actual: mnist.test.labels}))

    W_1=W1.eval() # 把權重矩陣儲存成array,array.shape=(784,10)  
    for i in range(10):  # 繪製10個隱層神經元與輸入層神經元個之間的權重
        im=W_1[:,i].reshape(28,28)  #把矩陣的每一列 變化層 28*28 的矩陣
        plt.imshow(im)  #繪圖
        plt.show()
結果圖如下:
以上為10個節點的權重視覺化結果,我們大概可以看出神經網路的權重已經學習到了對應數字的輪廓。

由於上述實驗結果訓練輪數比較少,當訓練輪數增加時,權重視覺化的效果會變得更加清晰。