1. 程式人生 > >利用TensorFlow使卷積神經網路各層及卷積特徵視覺化

利用TensorFlow使卷積神經網路各層及卷積特徵視覺化

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 26 14:37:30 2018


@author: Administrator
"""
#匯入所需要的庫
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
print ("庫已準備好")


mnist = input_data.read_data_sets('mnist_data', one_hot=True)#第一個引數是存放資料集的地址
train_X = mnist.train.images
train_Y = mnist.train.labels
test_X = mnist.test.images
test_Y = mnist.test.labels
print ("資料集已準備好")


"""
這裡可以選用CPU/GPU,當然也可以不選用
device_type = "/cpu:1"
with tf.device(device_type): 
"""
n_input  = 784    #輸入影象大小是28*28*1=784
n_output = 10     #輸出類別是10
weights  = {
        'wc1': tf.Variable(tf.random_normal([3, 3, 1, 64], stddev=0.1)),       #第一卷積核是3*3*64,利用高斯分佈初始化
        'wd1': tf.Variable(tf.random_normal([14*14*64, n_output], stddev=0.1)) #第二層卷積核是14*14*64
    }
biases   = {
        'bc1': tf.Variable(tf.random_normal([64], stddev=0.1)),       #偏置,高斯分佈初始化
        'bd1': tf.Variable(tf.random_normal([n_output], stddev=0.1))
    }
def conv_model(_input, _w, _b):
    #把輸入影象變成28*28*1
    _input_r = tf.reshape(_input, shape=[-1, 28, 28, 1])   
    #第一層卷積:步長是1,padding='SAME'表示輸出與輸入大小一樣
    _conv1 = tf.nn.conv2d(_input_r, _w['wc1'], strides=[1, 1, 1, 1], padding='SAME')
    #新增偏置
    _conv2 = tf.nn.bias_add(_conv1, _b['bc1'])
     #relu線性函式,max(0,x)
    _conv3 = tf.nn.relu(_conv2)
    #最大池化層,步長是2,padding='SAME'表示輸出與輸入大小一樣
    _pool  = tf.nn.max_pool(_conv3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
     #pool層輸出壓縮
    _dense = tf.reshape(_pool, [-1, _w['wd1'].get_shape().as_list()[0]])
     #全連線層
    _out = tf.add(tf.matmul(_dense, _w['wd1']), _b['bd1'])
        # Return everything
    out = {
            'input_r': _input_r, 'conv1': _conv1, 'conv2': _conv2, 'conv3': _conv3
            , 'pool': _pool, 'dense': _dense, 'out': _out
        }
    return out
print ("CNN準備好")


#定義x,y,佔位符
x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_output])


learning_rate   = 0.001 #學習率
training_epochs = 10   #迭代次數
batch_size      = 100  #batch是100
display_step    = 1   #顯示


prediction = conv_model(x, weights, biases)['out']
#交叉熵計算
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = prediction,labels= y))
#優化cost,使cost達到最小
optm = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
corr = tf.equal(tf.argmax(prediction,1), tf.argmax(y,1)) # Count corrects
accr = tf.reduce_mean(tf.cast(corr, tf.float32)) # Accuracy
init = tf.initialize_all_variables()  #變數初始化
# Saver 
save_step = 1;
savedir = "tmp/"
saver = tf.train.Saver(max_to_keep=3) 
print ("Network Ready to Go!")




do_train = 1
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True))
sess.run(init)


if do_train == 1:
    for epoch in range(training_epochs):
        avg_cost = 0.  #平均損失初始化
        total_batch = int(mnist.train.num_examples/batch_size)
        #遍歷所有的batch
        for i in range(total_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            # 計算optm,資料來自於batch_xs,batch_ys
            sess.run(optm, feed_dict={x: batch_xs, y: batch_ys})
            #計算平均損失
            avg_cost += sess.run(cost, feed_dict={x: batch_xs, y: batch_ys})/total_batch


        # 顯示
        if epoch % display_step == 0: 
            print ("Epoch: %03d/%03d cost: %.9f" % (epoch, training_epochs, avg_cost))
            train_acc = sess.run(accr, feed_dict={x: batch_xs, y: batch_ys})
            print (" Training accuracy: %.3f" % (train_acc))
            test_acc = sess.run(accr, feed_dict={x: test_X, y: test_Y})
            print (" Test accuracy: %.3f" % (test_acc))


        
    print ("Optimization Finished.")
if do_train == 0:
    epoch = training_epochs-1
    saver.restore(sess, "/tmp/cnn_mnist_simple.ckpt-" + str(epoch))
    print ("NETWORK RESTORED")




conv_out = conv_model(x, weights, biases)


input_r = sess.run(conv_out['input_r'], feed_dict={x: train_X[0:1, :]})
conv1   = sess.run(conv_out['conv1'], feed_dict={x: train_X[0:1, :]})
conv2   = sess.run(conv_out['conv2'], feed_dict={x: train_X[0:1, :]})
conv3   = sess.run(conv_out['conv3'], feed_dict={x: train_X[0:1, :]})
pool    = sess.run(conv_out['pool'], feed_dict={x: train_X[0:1, :]})
dense   = sess.run(conv_out['dense'], feed_dict={x: train_X[0:1, :]})
out     = sess.run(conv_out['out'], feed_dict={x: train_X[0:1, :]})




# 顯示'input_r'
print ("Size of 'input_r' is %s" % (input_r.shape,))
label = np.argmax(train_Y[0, :])
print ("Label is %d" % (label))
# 畫圖顯示
plt.matshow(input_r[0, :, :, 0], cmap=plt.get_cmap('gray'))
plt.title("Label of this image is " + str(label) + "")
plt.colorbar()
plt.show()


print ("Size of 'conv1' is %s" % (conv1.shape,))
# 畫圖顯示 
for i in range(3):
    plt.matshow(conv1[0, :, :, i], cmap=plt.get_cmap('gray'))
    plt.title(str(i) + "th conv1")
    plt.colorbar()
    plt.show() 

相關推薦

利用TensorFlow使神經網路特徵視覺

# -*- coding: utf-8 -*-"""Created on Thu Apr 26 14:37:30 2018@author: Administrator"""#匯入所需要的庫import numpy as npimport tensorflow as tfimport matplotlib.py

詳細解釋CNN神經網路的引數和連線個數的計算

積神經網路是一個多層的神經網路,每層由多個二維平面組成,而每個平面由多個獨立神經元組成。        圖:卷積神經網路的概念示範:輸入影象通過和三個可訓練的濾波器和可加偏置進行卷積,濾波過程如圖一,卷積後在C1層產生三個特徵對映圖,然後特徵對映圖中每組的四個畫素再進行

詳細解釋CNN神經網路的引數和連結個數的計算

卷積神經網路是一個多層的神經網路,每層由多個二維平面組成,而每個平面由多個獨立神經元組成。        圖:卷積神經網路的概念示範:輸入影象通過和三個可訓練的濾波器和可加偏置進行卷積,濾波過程如圖

神經網路基本知識

參考:https://blog.csdn.net/yjl9122/article/details/70198357卷積神經網路(CNN)由輸入層、卷積層、啟用函式、池化層、全連線層組成,即INPUT(輸入層)-CONV(卷積層)-RELU(啟用函式)-POOL(池化層)-FC

cnn 神經網路介紹和典型神經網路

轉載:https://blog.csdn.net/cxmscb/article/details/71023576   原部落格附帶tensorflow cnn實現一、CNN的引入在人工的全連線神經網路中,每相鄰兩層之間的每個神經元之間都是有邊相連的。當輸入層的特徵維度變得很高

神經網路——輸入、啟用函式、池、全連線

卷積神經網路(CNN)由輸入層、卷積層、啟用函式、池化層、全連線層組成,即INPUT(輸入層)-CONV(卷積層)-RELU(啟用函式)-POOL(池化層)-FC(全連線層) 卷積層 用它來進行特徵提取,如下: 輸入影象是32*32*3,3是它

關於LeNet-5神經網路 S2與C3連線的引數計算的思考???

關於LeNet-5卷積神經網路 S2層與C3層連線的引數計算的思考??? 首先圖1是LeNet-5的整體網路結構圖 圖1 LeNet-5結構 該神經網路共有7層(不計輸入層),輸入影象大小為32×32。 層編號特點:英文字母+數字     &n

【Coursera】吳恩達 deeplearning.ai 04.神經網路 第二週 深度神經網路 課程筆記

深度卷積神經網路 2.1 為什麼要進行例項化 實際上,在計算機視覺任務中表現良好的神經網路框架,往往也適用於其他任務。 2.2 經典網路 LeNet-5 AlexNet VGG LeNet-5 主要針對灰度影象 隨著神經網路的加深

吳恩達《深度學習-神經網路》2--深度神經網路

1. Why look at case studies本節展示幾個神經網路的例項分析為什麼要講例項?近些年CNN的主要任務就是研究如何將基本構件(CONV、POOL、CF)組合起來形成有效的CNN,而學習瞭解前人的做法可以激發創造2. Classic Networks1)Le

cs231n-(7)神經網路:架構,/池

卷積神經網路和普通神經網路非常類似。卷積神經網路由神經元組成,每個神經元包含權重weight和諞置bias;它接收上一層輸入,和權重相乘,通常再經過一個非線性函式(可選)輸出。整個網路擬合一個可微分的score function:從原始影象到每類別得分。在

【學習筆記1】吳恩達_神經網路_第一週神經網路(1)

一、卷積神經網路 1.邊緣檢測 不同的語言中表示卷積的函式不同,在Python中為在tensorflow裡為 濾波器:垂直、水平邊緣檢測。 Sobel filter:其優點在於增加了中間一行元素的權重,即影象中間的畫素點提高,會使結果的魯棒(robust)性提高。

神經網路(三):權值初始方法之Xavier與MSRA

基礎知識 首先介紹一下Xavier等初始化方法比直接用高斯分佈進行初始化W的優勢所在: 一般的神經網路在前向傳播時神經元輸出值的方差會不斷增大,而使用Xavier等方法理論上可以保證每層神經元輸入輸出方差一致。 這裡先介紹一個方差相乘的公式,以便理解Xav

神經網路中1*1 的理解

Question: 從NIN 到Googlenet mrsa net 都是用了這個,為什麼呢? 發現很多網路使用了1X1卷積核,這能起到什麼作用呢?另外我一直覺得,1X1卷積核就是對輸入的一個比例縮放,因為1X1卷積核只有一個引數,這個核在輸入上滑動,就相當於給輸入資料乘以一個係數。不知道我理解的是否正確。

一文讀懂神經網路中的1x1

前言 在介紹卷積神經網路中的1x1卷積之前,首先回顧卷積網路的基本概念[1]。 卷積核(convolutional kernel):可以看作對某個區域性的加權求和;它是對應區域性感知,它的原理是在觀察某個物體時我們既不能觀察每個畫素也不能一次觀察整體,而是

Tensorflow學習教程------利用神經網路對mnist資料集進行分類_利用訓練好的模型進行分類

#coding:utf-8 import tensorflow as tf from PIL import Image,ImageFilter from tensorflow.examples.tutorials.mnist import input_data def imageprepare(ar

續(利用tensorflow實現簡單的神經網路-對程式碼中相關函式介紹)——遷移學習小記(三)

  上篇文章對cnn進行了一些介紹,附了完整小例子程式碼,介紹了一部分函式概念,但是對我這樣的新手來說,程式碼中涉及的部分函式還是無法一下子全部理解。於是在本文中將對程式碼中使用的函式繼續進行一一介紹。 具體程式碼見上一篇(二) 一、 #定義輸入的placehoder,x是特徵

利用tensorflow實現簡單的神經網路——遷移學習小記(二)

一、什麼是神經網路(CNN)     卷積神經網路(Convolutional Neural Network,簡稱CNN),是一種前饋神經網路,人工神經元可以影響周圍單元,可以進行大型影象處理。卷積神經網路包括卷積層和池化層。卷積神經網路是受到生物思考方式的啟發的MLPs(多

利用tensorflow實現簡單的神經網路

一、什麼是神經網路(CNN)     卷積神經網路(Convolutional Neural Network,簡稱CNN),是一種前饋神經網路,人工神經元可以影響周圍單元,可以進行大型影象處理。卷積神經網路包括卷積層和池化層。卷積神經網路是受到生物思考方式的啟發的MLPs(

利用TensorFlow實現神經網路做文字分類

這篇部落格是翻譯Denny Britz寫的使用卷積神經網路做文字分類並且在Tensorflow上面實現,作者已經授權翻譯,這是原文。 在這篇部落格中,我們將實現一個類似於 Kim Yoon 論文中用於句子分類的卷積神經網路模型。論文中的模型在一系列文字分類任務(如情感分類)中獲得了良好的分類效能,併成為新文字

TensorFlow官方文件樣例——三神經網路訓練MNIST資料

        上篇部落格根據TensorFlow官方文件樣例實現了一個簡單的單層神經網路模型,在訓練10000次左右可以達到92.7%左右的準確率。但如果將神經網路的深度拓展,那麼很容易就能夠達到更高的準確率。官方中文文件中就提供了這樣的樣例,它的網路結構如