兩層卷積網路 MNIST練習

2021-08-28 08:49:03 字數 4016 閱讀 9600

原理參考:

啟用函式:

# -*- coding:utf-8 -*-

import os

os.environ['tf_cpp_min_log_level'] = '2'

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("g:/tensorflow/mnist_data/",one_hot=true)

# x 為訓練影象的佔位符,y_為訓練影象標籤的佔位符

x = tf.placeholder(tf.float32,[none,784])

y_ = tf.placeholder(tf.float32,[none,10])

#將影象還原為28*28,[-1,28,28,1]中-1表示樣本數量不固定,最後乙個1代表顏色通道數

x_image = tf.reshape(x,[-1,28,28,1])

'''定義初始化函式:

1、weight_variable 可以返回乙個給定形狀的變數

從截斷的正態分佈中輸出隨機值。stddev: 正態分佈的標準差,shape:一維的張量

生成的值服從具有指定平均值和標準偏差的正態分佈,如果生成的值大於平均值2個標準偏差的值則丟棄重新選擇。

在正態分佈的曲線中,橫軸區間(μ-σ,μ+σ)內的面積為68.268949%。

橫軸區間(μ-2σ,μ+2σ)內的面積為95.449974%。

橫軸區間(μ-3σ,μ+3σ)內的面積為99.730020%。

x落在(μ-3σ,μ+3σ)以外的概率小於千分之三,在實際問題中常認為相應的事件是不會發生的,基本上可以把區間(μ-3σ,μ+3σ)看作是隨機變數x實際可能的取值區間,這稱之為正態分佈的「3σ」原則。

在tf.truncated_normal中如果x的取值在區間(μ-2σ,μ+2σ)之外則重新進行選擇。這樣保證了生成的值都在均值附近。

2、bias_variable

為偏置值增加正值--0.1來避免死亡節點

'''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)

return tf.variable(initial)

''' tf.nn.cov2d()為二維卷積函式,x為輸入,w是卷積引數,[1,1,1,1]前兩個數代表卷積核的尺寸,第三個數代表有多少

channel(因為影象為黑白,因此為1,若是彩色rgb則該值為3),最後乙個數代表卷積核的數量,也就是卷積會提取多

少類的特徵。padding代表邊界的處理方式,same表示邊界加上padding讓卷積的輸出和輸入保持同樣的尺寸

'''def conv2d(x,w):

return tf.nn.conv2d(x,w,strides=[1,1,1,1,],padding='same')

'''池化層

'''def max_pool_2x2(x):

return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='same')

'''第乙個卷積層

'''w_conv1 = weight_variable([5,5,1,32]) #代表卷積核尺寸為5x5,1個顏色通道,32個不同的卷積核

b_conv1 = bias_variable([32]) #增加偏置

h_conv1 = tf.nn.relu(conv2d(x_image,w_conv1) + b_conv1) #卷積後使用relu啟用函式進行非線性處理

h_pool1 = max_pool_2x2(h_conv1) #池化操作

'''第二個卷積層

'''w_conv2 = weight_variable([5,5,32,64]) #卷積核數量變為64,即提取64個特徵

b_conv2 = bias_variable([64])

h_conv2 = tf.nn.relu(conv2d(h_pool1,w_conv2) + b_conv2)

h_pool2 = max_pool_2x2(h_conv2)

#經過兩次2x2的最大池化,邊長為原來的1/4,尺寸由28*28變為7*7,第二層卷積核數量為64,因此tensor尺寸為7*7*64

#將其變形為1d向量 1024,連線乙個全連線層並使用relu啟用函式

'''全連線層

'''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層:傳入keep_prob來減輕過擬合,並不是永久去除,僅在當前步驟隨機去除(keep_prob訓練為0.5,測試為1)

'''keep_prob = tf.placeholder(tf.float32)

h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)

'''將dropout層的輸出鏈結乙個softmax層,得到最後的概率輸出

'''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)

#根據y和y_構造交叉熵損失

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y_conv))

#利用adam方法針對模型w和b進行優化,0.01代表學習速率

train_step = tf.train.adamoptimizer(1e-4).minimize(cross_entropy)

correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))

#算**準確率tf.cast將correct_prediction轉換為float32(false為0,true為1),tf.reduce_mean計算陣列中的所有元素的平均值,即分類準確率

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

#建立預設的interaction session

sess = tf.interactivesession()

sess.run(tf.global_variables_initializer())

for i in range(20000):

batch = mnist.train.next_batch(50)

if i%100 == 0:

train_accuracy = accuracy.eval(feed_dict=)

print("step %d,training accuracy %g" %(i,train_accuracy))

train_step.run(feed_dict=)

'''列印在全體測試集上的準確率

'''print("test accuracy %g" % accuracy.eval(feed_dict=))

兩層卷積網路分類

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input data 讀取資料 mnist input data.read data sets mnist data one hot true x為訓練影象...

PyTorch搭建兩層網路

舉乙個很簡單的例子來熟悉使用pytorch構建和訓練神經網路的整個過程。import torch import torch.nn as nn n,d in,h,d out 64,1000 100,10 隨機建立一些訓練資料 x torch.randn n,d in y torch.randn n,d...

兩層網路 三層網路的理解

對於搞it的同行而言,大部分人都不會直接和網路打交道,因此除非從事網路開發,否則對網路內部機制也不會太關心,但是明白網路資料是怎麼走的,這對每個it工程師應該是很重要的基礎知識。網路資料報如何在網路上遊蕩,長久以來也困擾了我很長時間,現在把這部分內容總結分享一下。說起網路,大家不約而同會想起大學課本...