1. 程式人生 > >深度學習小白——Tensorflow(二)卷積

深度學習小白——Tensorflow(二)卷積

本文記錄用兩層卷積網路實現訓練MNIST資料集

先介紹一下所用核心函式

1.tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,data_format=None,name=None)

input:待卷積的資料,格式要求為一個張量tensor,【batch,in_height,in_width,in_channels】

分別表示 批次數,影象高度,寬度,輸入通道數

filter:卷積核,格式要求為【filter_height,filter_width,in_channels,out_channels】

分別表示 卷積核的高度,寬度,輸入通道數,輸出通道數

strides:一個長為4的list,表示每次卷積以後卷積視窗在input中滑動的距離

padding:SAMEVALID兩個選項,表示是否要保留影象邊上那一圈不完全卷積的部分,如果是SAME,則保留

use_cudnn_on_gpu:是否使用cudnn加速,預設是True

2.tf.nn.max_pool(value,ksize,strides,padding,data_format="NHWC",name=None)

value: 一個4維的張量,格式為【batch,height,width,channels】與conv2d中input格式一樣

ksize:長為4的list,表示池化視窗的尺寸

strides:池化視窗的滑動值,與conv2d中的一樣

padding:與conv2d中用法一樣

具 體 實 例

1.讀入資料

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

#import data
mnist = input_data.read_data_sets("C:\\Users\\1\\AppData\\Local\\Programs\\Python\Python35\\Lib\\site-packages\\tensorflow\\examples\\
tutorials\\mnist", one_hot=True)

2.搭建模型

2.1設定變數以及佔位符

x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
2.2定義變數初始化的函式
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1) #變數的初始值為截斷正態分佈
  return tf.Variable(initial)

def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)#變數初始值設為常數,不為0的小數
  return tf.Variable(initial)

2.3卷積函式的實現

功能:給定4維的輸入input和filter,計算出一個2維卷積結果

def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') #此處要求卷積後圖像大小不變,padding的值為SAME

2.4定義池化函式

tf.nn.max_pool是進行最大值池化操作,tf.nn.avg_pool是平均值池化操作

def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')

2.5 訓練過程

2.5.1第一層卷積

第一層卷積核(filter)的尺寸是5*5,通道數為1(因為原圖通道為1),輸出通道為32(32個濾波器),即feature map數目為32

又因為strides=[1,1,1,1]所以單個通道的輸出尺寸應該跟輸入影象一樣,即總的卷積輸出為?*28*28*32,?是批次數

在池化階段,ksize=[1,2,2,1]那麼卷積的結果經過池化後,其尺寸應該是?*14*14*32

W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
x_image = tf.reshape(x, [-1,28,28,1])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

2.5.2 第二層卷積

卷積核5*5,輸入通道為32,輸出通道為64

卷積前影象的尺寸為?*14*14*32,卷積後為?*14*14*64

池化後,輸出的影象尺寸為?*7*7*64

W_conv2 = weight_variable([5, 5, 32, 64])#注意此時輸入影象通道數為32
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

2.5.3 全連線層

輸入維度為7*7*64,輸出維度為1024

W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

這裡使用了Dropout技術,隨機安排一些cell輸出值為0,防止過擬合

keep_prob = tf.placeholder(tf.float32) #作為要輸入的值
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

2.6 分類層

輸入1024維,輸出10維,也就是具體的0~9分類

W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

2.7定義損失函式,優化方法

cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
這裡採用了Adam優化

3.訓練

sess.run(tf.initialize_all_variables()) # 變數初始化
for i in range(20000):
    batch = mnist.train.next_batch(50)
    if i%100 == 0:
        # print(batch[1].shape)
        train_accuracy = accuracy.eval(feed_dict={
            x:batch[0], y_: batch[1], keep_prob: 1.0})
        print("step %d, training accuracy %g"%(i, train_accuracy))
    train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

print("test accuracy %g"%accuracy.eval(feed_dict={
    x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))#注意測試集測試時不使用dropout


相關推薦

深度學習——Tensorflow()

本文記錄用兩層卷積網路實現訓練MNIST資料集 先介紹一下所用核心函式 1.tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,data_format=None,name=None) input:待

深度學習——TensorFlow(一)簡介

我選擇tensorFlow作為我學習的第一個神經網路框架,恰巧最近Tensorflow支援了windows,所以讓我的學習變得更加便捷。 我的主要參考文章有 http://blog.csdn.net/u014595019/article/details/52677412 h

深度學習筆記5-tensorflow實現神經網路

深度學習筆記5-tensorflow實現卷積神經網路 在股票等預測模型中,可以從原始資料提取金融因子等特徵。而影象則無有效特徵,只能藉助SIFT、HOG等提取有效特徵,再集合SVM等機器學習演算法進行影象識別。卷積神經網路(CNN)提取的特徵則可以達到更好的效果,同時它不需要將特徵提取和

深度學習——Tensorflow(三) 讀取資料

Tensorflow 程式讀取資料一共有3種方法: 供給資料(feeding):在程式執行的每一步,讓Python程式碼來供給資料從檔案讀取資料: 讓一個輸入管線從檔案中讀取資料預載入資料:在tensorflow圖中定義常量或變數來儲存所有資料(適用於資料量小的時候)

深度學習——tensorflow(四)CIFAR-10例項

一、資料讀取 因為之前寫過,見http://blog.csdn.net/margretwg/article/details/70168256,這裡就不重複了 二、模型建立 全域性引數 import os import re import sys import tar

深度學習——神經網路視覺化(

一、由卷積後的code得到原始影象 可以看出隨著卷積網路的進行,越來越多的資訊被扔掉了,能還原除的資訊也就越少。 二、Deep Dream google發明的起初是用來看神經網路各層在“看”什麼,後來因為得到的影象很具有藝術感,所以成為了一個藝術圖片生成器。 這是一

TensorFlow:實戰Google深度學習框架》——6.3 神經網路常用結構

1、卷積層 圖6-8顯示了卷積層神經網路結構中重要的部分:濾波器(filter)或者核心(kernel)。 過濾器可以將當前層神經網路上的一個子節點矩陣轉化為下一層神經網路上的一個單位節點矩陣 。 單位節點矩陣指的是一個長和寬都為1,但深度不限的節點矩陣 。 在一個卷積層巾,過濾器

TensorFlow:實戰Google深度學習框架》——6.2 神經網路簡介(神經網路的基本網路結構及其與全連線神經網路的差異)

下圖為全連線神經網路與卷積神經網路的結構對比圖: 由上圖來分析兩者的差異:                  全連線神經網路與卷積網路相同點   &nb

TensorFlow:實戰Google深度學習框架》——6.3 神經網路常用結構(池化層)

池化層在兩個卷積層之間,可以有效的縮小矩陣的尺寸(也可以減小矩陣深度,但實踐中一般不會這樣使用),co。池從而減少最後全連線層中的引數。 池化層既可以加快計算速度也可以防止過度擬合問題的作用。 池化層也是通過一個類似過濾器結構完成的,計算方式有兩種: 最大池化層:採用最

機器學習深度學習系列連載: 第二部分 深度學習(十一)神經網路 2 Why CNN for Image?

卷積神經網路 2 Why CNN 為什麼處理圖片要用CNN? 原因是: 一個神經元無法看到整張圖片 能夠聯絡到小的區域,並且引數更少 圖片壓縮畫素不改變圖片內容 1. CNN 的特點 卷積: 一些卷積核遠遠小於圖片大小; 同樣的pat

吳恩達深度學習系列課程筆記:神經網路(一)

本系列文章將對吳恩達在網易公開課“深度學習工程師”微專業內容進行筆記總結,這一部分介紹的是“卷積神經網路”部分。 1、計算機視覺 計算機視覺在我們還是生活中有非常廣泛的應用,以下幾個是最常見的例子: 影象分類: 可以對影象中的物體種類進行判斷,如確定影象中

深度學習】8:CNN神經網路與sklearn資料集實現數字識別

前言:這個程式碼是自己閒暇無事時候寫的。 因為CNN卷積神經網路用MNIST資料集、sklearn資料集程式碼很多部分都很相似,這一篇就不附詳細說明,原始碼最下。CNN卷積神經網路的工作原理,請詳情參考——【深度學習】5:CNN卷積神經網路原理、MNIST資料

機器學習筆記:tensorflow實現神經網路經典案例--識別手寫數字

從識別手寫數字的案例開始認識神經網路,並瞭解如何在tensorflow中一步步建立卷積神經網路。 安裝tensorflow 資料來源 kaggle新手入門的數字識別案例,包含手寫0-9的灰度值影象的csv檔案,下載地址:https://www.

吳恩達深度學習:基於Matlab完成神經網路第四課第一週程式設計任務

          這兩三個月通過吳恩達老師的課程學習了深度學習,從零開始學理論,做程式設計任務。感覺學了很多知識。現在學到卷積神經網路,想把第一週的程式設計任務、其中的要點上傳和編寫,方便自己以後鞏固。(注:吳恩達老師課程的程式設計任務是用Python來完成的,而我是用ma

深度學習(十)——花式(2)

花式卷積 depthwise separable convolution(續) 它包含一個深度方面的卷積(一個為每個通道單獨執行的空間卷積,depthwise convolution),後面跟著一個逐點的卷積(一個跨通道的1×1卷積,pointwis

深度學習】5:CNN神經網路原理、識別MNIST資料集

前言:先坦白的說,深度神經網路的學習在一開始對我造成的困擾還是很大的,我也是通過不斷地看相關的視訊資料、文獻講解嘗試去理解記憶。畢竟這些內容大多都是不可查的,我們看到的都只是輸入輸出的東西,裡面的內部運作以及工作原理,都需要沉心靜思。 這篇CNN卷積神經網路的

深度學習介紹(四)操作

接下來介紹一下,CNNs是如何利用空間結構減少需要學習的引數數目的 如果我們有一張1000x1000畫素的影象,有1百萬個隱層神經元,那麼他們全連線的話(每個隱層神經元都與影象的每一個畫素點相連),這樣就有1000x1000x1000000=10^12個連線,

吳恩達深度學習第四課:神經網路(學習筆記2)

前言 1.之所以堅持記錄,是因為看到其他人寫的優秀部落格,內容準確詳實,思路清晰流暢,這也說明了作者對知識的深入思考。我也希望能儘量將筆記寫的準確、簡潔,方便自己回憶也方便別人參考; 2.昨天看到兩篇關於計算機視覺的發展介紹的文章:[觀點|朱鬆純:初探計算機

深度學習——神經網路5(引數更新)

一、引數更新 1.隨機梯度下降及各種更新方法 【普通更新】:沿著負梯度方向改變引數 x+= -learning_rate * dx 其中學習率是一個超引數,它是一個固定的常量。 【動量更新】(Momentum) 這個方法在深度網路上幾乎總能得到更好的收斂速度。是從物理角度

深度學習(6)——基於神經網路的影象樣式轉換

基於卷積神經網路的影象樣式轉換 摘要 以不同風格呈現影象的語義內容是困難的影象處理任務。 可以說,先前方法的主要限制因素是缺乏明確表示語義資訊的影象表示,不能將影象內容與樣式分離。 在這裡,我們使用從針對物件識別優化的卷積神經網路匯出的影象表示,這使得高