1. 程式人生 > >python3下tensorflow練習(二)

python3下tensorflow練習(二)

MNIST手寫字識別

流程:
1、將要識別的圖片轉為灰度圖,並且轉化為784矩陣(單通道,每個畫素範圍0-255,0為黑色,255為白色,這一點與MNIST中的正好相反)
2、將28*28的矩陣轉換成1維矩陣[[784]](也就是把第2,3,4,5....行矩陣紛紛接入到第一行的後面)
3、用一個1*10的向量代表標籤,也就是這個數字到底是幾,舉個例子e數字1對應的矩陣就是[0,1,0,0,0,0,0,0,0,0]
4、softmax迴歸預測圖片是哪個數字的概率

5、用交叉熵和梯度下降法訓練引數

注意:這裡我建立的是單層神經網路

(1)softmax啟用函式詳解:

softmax直白來說就是將原來輸出是3,1,-3通過softmax函式一作用,就對映成為(0,1)的值,而這些值的累和為1(滿足概率的性質),那麼我們就可以將它理解成概率,在最後選取輸出結點的時候,我們就可以選取概率最大(也就是值對應最大的)結點,作為我們的預測目標!

像這裡的MNIST要把它分成10類,就必須用softmax來進行分類了。  
P(y=0)=p0,P(y=1)=p1,p(y=2)=p2......P(y=9)=p9.這些表示預測為數字i的概率,(跟上面標籤的格式正好對應起來了),它們的和為1,即 ∑(pi)=1。

tensorflow實現了這個函式,我們直接呼叫這個softmax函式即可,原理圖:


(2)交叉熵刻畫了兩個概率分佈之間的距離,它是分類問題中使用比較廣的一種損失函式。給定兩個概率分佈p和q,通過q來表示p的交叉熵為: 

在tensorflow中的函式表示:
   cross_entropy = -tf.reduce_mean(        y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))
    )
    其中y_代表正確結果,y代表預測結果,tf.clip_by_value函式可以將一個張量中的數值限制在一個範圍之內,tf.log完成對張量中所有元素依次求對數
    ,* 實現兩個矩陣元素之間直接相乘(矩陣乘法需要使用tf.matmul函式來完成)。

注意:

交叉熵和最大似然估計的聯絡與區別

引用https://blog.csdn.net/diligent_321/article/details/53115369該文章的解釋

在利用深度學習模型解決有監督問題時,比如分類、迴歸、去噪等,我們一般的思路如下:

     (1)最大似然誤差是從概率的角度,求解出能完美擬合訓練樣例的模型引數theta,使得概率p(y | x, theta)最大化;

     (2)交叉熵損失函式,衡量的是兩個分佈p、q的相似性。在給定集合上兩個分佈p和q的cross entropy定義如下:


                  在機器學習應用中,p一般表示樣例的標籤的真實分佈,在分類問題中,交叉熵的本質就是似然函式的最大化
。證明如下:
  • 記帶標籤的樣例為(x, y), 其中x表示輸入特徵向量,y=[y1, y2, ..., yc]表示真實標籤的one-hot表示,y_=[y_1, y_2, ..., y_c]表示模型輸出的分佈,c表示樣例輸出的類別數,那麼,
           (1)對於二分類問題,p(x)=[1, 0],q(x)=[y_1, y_2],y_1=p(y=1|x)表示模型輸出為真的概率,交叉熵H(p, q)=-(1*y_1+0*y_2)=-y_1,顯然此時交叉熵的最小化等價於似然函式的最大化;           (2)對於多分類問題, 假設p(x)=[0, 0, 0, ..., 1, 0, 0],q(x)=[y_1, y_2, y_3, ..., y_k, y_(k+1), y_(k+2)],即表示真實樣例標籤為第k類,y_k=p(y=k|x)表示模型輸出為第k類的概率,交叉熵H(p, q)=-( 0*y_1+0*y_2+0*y_3+...+1*y_k+0*y_(k+1)+0*y_(k+2) ) = -y_k, 此時同上。
"""
author:jiancgehng
2018.05.04
"""
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt#匯入plt繪圖模組

# number 1 to 10 data提前下下來了再“MNIST”資料夾下
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)#one_hot一種編碼格式0000000100(0-9數字)

建立網路層函式:

def add_layer(inputs, in_size, out_size, activation_function=None,):
    # #biases和Weights並不是純隨機數,一定的初始值跟有利於尋找到最優解
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1,)
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b,)
    return outputs

建立評估模型準確率公式:

"""
    tf.argmax(y_pre,1),tf.argmax(vector, 1):返回的是vector中的最大值的索引號,如果vector是一個向量,那就返回一個值,
    如果是一個矩陣,那就返回一個向量,這個向量的每一個維度都是相對應矩陣行的最大值元素的索引號。
    [[100000000]]輸入,輸出最大數的索引0
    
    tf.equal(A, B)是對比這兩個矩陣或者向量的相等的元素,如果是相等的那就返回True,反正返回False,返回的值的矩陣維度和A是一樣的
    將實際值和預測值進行比較,返回Bool資料型別
    
     tf.cast(x, dtype, name=None) 
     將x的資料格式轉化成dtype.例如,原來x的資料格式是bool, 
     那麼將其轉化成float以後,就能夠將其轉化成0和1的序列。
"""
def compute_accuracy(v_xs, v_ys):
    global prediction#全域性變數
    y_pre = sess.run(prediction, feed_dict={xs: v_xs})#預測值
    correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(v_ys,1))#100個樣本,就是1*100的向量
    accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#將上面的bool型別轉為float,求得矩陣中所有元素的平均值 如:98/100=.98
    result = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys})#run()執行才能有結果
    return result    

以palceholder傳入樣本X值:

"""
    define placeholder for inputs to network
    相當於一個容器,feed_dict()就是呼叫容器的方法
    placeholder一共兩個引數:1.資料型別,tf.float32或者“FLOAT32” 2.出入引數(矩陣)的形狀,第一維None:不限制樣本個數(X),第二維:特徵個數
"""
xs = tf.placeholder(tf.float32, [None, 784]) # 28x28,輸入特徵784個
ys = tf.placeholder(tf.float32, [None, 10])#輸出10個數字

輸出預測值:

# add output layer單層神經網路
#數字1對應的矩陣就是[0,1,0,0,0,0,0,0,0,0],輸出結果為10個矩陣
prediction = add_layer(xs, 784, 10,  activation_function=tf.nn.softmax)#錯誤:其實就是二分類問題,輸出的10個數{0,1};多分類:tf.nn.softmax

計算損失值(準備反向傳播):

"""
    the error between prediction and real data,損失值
    tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
    計算一個張量的維數的平均值。如果還原指數沒有條目,則所有維度都被還原,一個帶有單個元素的張量被返回。
    input_tensor: 張量減少。應該有數字型別。
    reduction_indices: 尺寸減少。如果沒有(預設),則減少所有維度。
    keep_dims: 如果是真的,則保留長度為1的維度。
    name: 操作的名稱
    
    -tf.reduce_sum(ys * tf.log(prediction),reduction_indices=[1])
"""
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),
                                              reduction_indices=[1]))       # loss

選擇優化器(梯度下降)一次訓練:

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)#一次正向傳播+反向傳播,得到模型

開啟會話開始訓練:

sess = tf.Session()
# important step
sess.run(tf.initialize_all_variables())


#plot_images_labels_prediction(mnist.train.images,
#                              mnist.train.labels,prediction,0)
for i in range(1000):
    #讀取批次資料,為了更快的收斂
    #每次讀取1001項批次訓練資料,讀取的訓練資料存放在 batch_xs, batch_ys ,準備訓練使用
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys})#訓練模型
    if i % 50 == 0:
        print(compute_accuracy(
            mnist.test.images, mnist.test.labels))

訓練結果:



相關推薦

python3tensorflow練習

MNIST手寫字識別流程:1、將要識別的圖片轉為灰度圖,並且轉化為784矩陣(單通道,每個畫素範圍0-255,0為黑色,255為白色,這一點與MNIST中的正好相反)2、將28*28的矩陣轉換成1維矩陣[[784]](也就是把第2,3,4,5....行矩陣紛紛接入到第一行的後

python3tensorflow練習

1.瞭解tensorflow基本架構2.用梯度下降的方法訓練處模型3.視覺化樣本資料,視覺化訓練出的模型以及視覺化損失函式""" Created on Wed May 2 09:40:08 2018 @author: jiangcheng """ import tens

python3tensorflow練習之CNN的MNIST識別

1. 資料準備import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data mnist = input_data.read_data_sets("MNIS

linux安裝vsftp

restart put pass con system 關閉 set acc cannot 安裝vsftpd 1、以管理員(root)身份執行以下命令 yum install vsftpd 2、設置開機啟動vsftpd ftp服務 chkconfig vsftpd

Shell練習

odi tool 一次 pan debug load default subject class 習題1:統計內存使用要求:寫一個腳本計算一下linux系統所有進程占用內存大小的和。(提示:使用ps或者top命令)參考答案:#!/bin/bash # date:2018年2

Leetcode代碼練習

sts compare bre 那種 character span 一次 給定 spa 首先,沒有第二題,沒有第二題的原因是,JavaScript中根本就沒有那種數據結構,盡管我在playground裏面調試出了正確的結果,但是也許是因為數據結構問題,最終沒能讓我通過。 所

vmware安裝centos7

虛擬機NAT模式主機ping不通外網一直使用vmware workstation的NAT方式聯網,但是從沒有用虛擬機訪問外網過,今天突然需要使用了,可是就是無法連接。現在記錄下來NAT方式連接外網的過程 首先把關於vmware workstation安裝程序在host創建出來的vm8虛擬網卡功能進行說明 很多

git 在windows的應用 - 遠程倉庫代碼管理

軟件研發 研發管理 克隆遠程git 目錄https://github.com/pcdogyu/git4windows.git克隆下來了生成1.txtscan stage signoff commit2次提交記錄推送到遠程地址完成了還沒來得及去網頁呢,就收到系統提示郵件網頁查看1.txt已經提交上去了對

SQL作業:綜合練習的返評

庫文件 spl val 查找 括號 冰箱 HR 題目 tar 一:作業題目:綜合練習(二) 二:題目要求: 1、創建數據庫CPXS,保存於E盤根目錄下以自己學號+姓第一個字母(阿拉伯數字+大寫字母)方式創建的文件夾中,初始大小5MB,最大20MB,以10%方式增長,日誌文件

PL/SQL 上機練習

tinc ace end from func fun gin spa PE 函數:1. 函數查看字符串中共包含幾個某特殊字符,如‘A**B*CEDF‘中包含幾個‘*’ 2.函數把員工表中不同的工作連接成一個字符串 3.函數計算個人所得稅,工資,薪金所得減3500, 含稅

ProtoBuf練習

.proto fstream using 讀寫 get run pro 長度 返回對象 重復數據類型 protobuf語言的重復字段類型相當於C++的std::list數據類型 工程目錄結構 $ ls proto/ TServer.proto TSession.proto

Python基礎練習筆趣看《伏天氏》全文章節爬取

平臺 空行 ges 會有 好的 clas 追加 ref 版本 大家如果覺得有幫助的話,可以關註我的知乎https://www.zhihu.com/people/hdmi-blog/posts,裏面有寫了一些我學習爬蟲的練習~ 今天我們想要爬取的是筆趣看小說網上的網絡小說,並

Java練習

ins == rime lse new ring 素數 如果能 main 題目:判斷101-200之間有多少個素數,並輸出所有素數。 判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。 public class Test

Redtiger SQL注入練習

第六關: 點選 click me,構造url:user=1',返回user not found。user=1'',同樣。 猜測是數字型注入,構造order by , user=1 order by  X#,得出有5個欄位。 然後,user=0 union select 1,2,3,4,5#,說

Python3從零學習

# -*- coding: utf-8 -*- #數字型別轉換 a = 1.0 print(int(a)) a = 1 print(float(a)) #complex(x) 將x轉換到一個複數,實數部分為 x,虛數部分為 0。 a = 1.1 print(complex(a)) #com

某演算法的板子練習

題目:P3379   樹上LCA,本蒟蒻罕見的一遍A掉的板子 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algor

TensorFlow學習:tf.random_normal() 和 tf.random_unform()

1. tf.random_normal() #正態分佈 tf.random_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None ) Args:

TensorFlow 實戰—— tf train優化演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

專案練習—微博資料結構化

1.ETL概念       ETL,是英文 Extract-Transform-Load 的縮寫,用來描述將資料從來源端經過抽取(extract)、互動轉換(transform)、載入(load)至目的端的過程。 2.專案目標: 本次專案側重於資料的整合(即將檔案中

TensorFlow 學習 張量和基本運算

tensor: 張量 operation:  專門運算的操作節點 graph:  整個程式的結構, 圖 TensorBoard:  視覺化學習 run() :  運算程式的圖、會話 張量的階:     0 階: