日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TensorFlow基于minist数据集实现手写字识别实战的三个模型

發布時間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TensorFlow基于minist数据集实现手写字识别实战的三个模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

手寫字識別

  • model1:輸入層→全連接→輸出層softmax
  • model2:輸入層→全連接→隱含層→全連接→輸出層softmax
  • model3:輸入層→卷積層1→卷積層2→全連接→dropout層→全連接→輸出層softmax

model1:輸入層→全連接→輸出層softmax


"""作者:Heart Sea功能:實現softmax regression 識別手寫數字Model: 1個輸入層全連接1個輸出層 softmax,取概率值最大的那個1.0:數據集位置與執行文件在同一個文件夾中版本:1.0日期:10/10/2019 """import tensorflow.examples.tutorials.mnist.input_data as input_data mnist = input_data.read_data_sets("D:/software/pycharm/shizhan/softmax/MNIST_data/", one_hot=True)print(mnist.train.images.shape, mnist.train.labels.shape) # 訓練集 print(mnist.test.images.shape, mnist.test.labels.shape) # 測試集 print(mnist.validation.images.shape, mnist.validation.labels.shape) # 驗證集 # (55000, 784) (55000, 10) # (10000, 784) (10000, 10) # (5000, 784) (5000, 10)import tensorflow as tf x = tf.placeholder(tf.float32, [None, 784]) # 創建輸入數據的地方,數據類型float32,數據尺寸[None, 784]。None表示不限條數的輸入,784是每條輸入是一個784維的向量 W = tf.Variable(tf.zeros([784, 10])) # 創建權值參數矩陣,尺寸[784, 10] b = tf.Variable(tf.zeros([10])) # 創建bias參數向量,尺寸[10],python執行結果是一行10列,matlab執行結果是10行10列 y = tf.nn.softmax(tf.matmul(x, W) + b) # 進行Softmax Regression算法,y是預測的概率分布,y的shape為(None, 10) # softmax是tf.nn下面的一個函數,而tf.nn則包含了大量神經網絡的組件。# 訓練模型 # 對多分類問題,經常使用交叉熵作為loss function # softmax的交叉熵公式:對所有樣本的交叉熵損失求和再平均,再負 # 計算交叉熵,判斷模型對真實概率分布估計的準確程度 # y_ * tf.log(y)維度都是[None, 10],因此兩者相乘(不是矩陣相乘),實質是對應行相乘 # 用 tf.reduce_sum 根據 reduction_indices=[1] 按照列,所有元素的總和(10個類別求和), # tf.reduce_mean用來對每個batch數據求均值 y_ = tf.placeholder(tf.float32, [None, 10]) # 定義placeholder,y_是真實的概率分布 cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))# 選擇隨機梯度下降SGD以0.5的學習速率最小化交叉熵 train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) # 上面三行可改寫為下面一行 # tf.global_variables_initiallizer().run()for i in range(1000): # 模型循環訓練1000次,從0開始,999結束batch_xs, batch_ys = mnist.train.next_batch(100) # 隨機抓取訓練數據中的100個批處理數據點sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # 完成模型訓練# 評估模型 # tf.argmax是從一個tensor中尋找最大值的序號,tf.argmax(y,1)求預測數字中概率最大的那一個,tf.argmax(y_,1)求樣本的真實數字類別 # tf.equal 判斷預測的數字類別是否就是正確的類別 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))# 用tf.cast將之前的correct_prediction輸出的bool值轉換為float32,再求平均值 accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})) #輸入數據,計算準確率 # 0.9192

model2:輸入層→全連接→隱含層→全連接→輸出層softmax

"""作者:Heart Sea功能:tessorflow實現多層感知機/多層神經網絡 Multi-Layer Perceptron, MLP加入:減輕過擬合的Dropout, 自適應學習速率的Adagrad, 可解決梯度彌散的激活函數ReLUModel:1個輸入層全連接1個隱含層, 激活ReLU, Dropout全連接1個輸出層, softmax版本:2.0日期:10/10/2019 """# 載入tensorflow加載數據集mnist from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) # 創建默認的InteractiveSession,后面各項操作無須指定session了 sess = tf.InteractiveSession()in_units = 784 # 輸入層節點數 h1_units = 300 # 隱含層節點數# W1,b1為隱含層的權重和偏置 # W2,b2為輸出層的權重和偏置,全部置為0,因為對于sigmoid,在0處最敏感,梯度最大 # 初始化參數W1為截斷的正態分布,標準差為0.1 # 由于使用ReLU,需要使用正態分布給參數加噪聲,來打破完全對稱并且避免0梯度 # 在其他的一些模型中,還需要給偏置賦值小的非零值來避免死亡神經元 W1 = tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1)) b1 = tf.Variable(tf.zeros([h1_units])) W2 = tf.Variable(tf.zeros([h1_units, 10])) b2 = tf.Variable(tf.zeros([10]))# 定義輸入x的placeholder,由于Dropout的比率keep_prob在測試和訓練時不一樣,訓練時小于1,預測時大于1 # keep_prob訓練時小于1,用以制造隨機性,防止過擬合;預測時大于1,即使用全部特征來預測樣本的類別 # 所以也把Dropout的比率keep_prob作為計算圖的輸入,并定義成一個placeholder x = tf.placeholder(tf.float32, [None, in_units]) keep_prob = tf.placeholder(tf.float32) # 保留節點的概率(保留數據而不置0的比例)# 建立隱藏層和輸出層,并且調用Dropout函數處理隱含層輸出數據 # ReLU的優點:單側抑制,相對寬闊的興奮邊界,稀疏激活性 # 隱含層的激活函數用ReLU可以提高訓練速度和模型準確率 hidden1 = tf.nn.relu(tf.matmul(x, W1) + b1) # 隱含層激活函數為ReLU hidden1_drop = tf.nn.dropout(hidden1, keep_prob) # 實現Dropout的功能,即隨機將一部分節點置為0 y = tf.nn.softmax(tf.matmul(hidden1_drop, W2) + b2) # 輸出層,shape和y_一樣,[None, 10]# 定義損失函數cross_entropy,并指定自適應優化器Adagrad優化損失函數 # y_和y是相同的維度[None, 10],兩者相乘,實質求內積,求和按照[1]列求和(一個樣本的所有類別求和),求和后為一維向量,平均后為1個數 y_ = tf.placeholder(tf.float32, [None, 10]) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)tf.global_variables_initializer().run()# 由于加入隱含層,需要更多的訓練迭代來優化模型參數達到一個比較好的效果 # 進行訓練3000個batch,每個batch有100個樣本,一共30萬的樣本,相當于對全數據進行5輪迭代 for i in range(3000):batch_xs, batch_ys = mnist.train.next_batch(100)train_step.run({x: batch_xs, y_: batch_ys, keep_prob: 0.75})# 對模型進行準確性評測,其中加入了keep_prob=1 # tf.cast是將correct_prediction輸出的bool值轉換為float32 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})) # 0.9778

最終我們再測試集上可以達到98%的準確率,相比于Softmax,我們的誤差由8%降到了2%。

多層神經網絡依靠隱藏層,可以組合出高階特征,比如橫線、豎線、圓圈等,之后可以將這個高階特征再組合成數字,實現精確的匹配和分類。隱藏層輸出的高階特征經常是可以復用的,所以每一類的判別、概率輸出都共享這些高階特征,而不是各自連接獨立的高階特征。

我們也可以發現,新增一個隱藏層,并使用了Dropout、Adagrad和ReLU,而代碼并沒有增加很多,這就是TensorFlow的優勢。它的代碼非常簡潔,沒有太多冗余,可以方便的將有用的模塊拼裝在一起。

當然使用全連接的深度神經網絡也是有局限的,即使我們使用很深的網絡、很多隱藏節點、進行很多次迭代,也很難在MNIST數據集上獲得99%以上的準確率。這時就該卷積神經網絡(CNN)出場了。

model3:輸入層→卷積層1→卷積層2→全連接→dropout層→全連接→輸出層softmax

卷積神經網絡CNN
特點:

  • 卷積的權值共享結構,可以大幅減少神經網絡的參數量,防止過擬合的同時又降低了神經網絡的復雜度。
  • CNN訓練的模型對縮放,平移,旋轉等畸變具有不變性,泛化性強。
  • 降低圖像預處理的要求,避免復雜的特征工程
  • 首個可進行多層訓練的網絡結構(全連接不行,因為有參數過多,梯度彌散問題)

CNN一般由多個卷積層構成,卷積層操作:

  • 圖像通過多個不同的卷積核的濾波,并加偏置(bias),提取局部特征,每個卷積核會映射出一個新的2D圖像。
  • 將卷積核的輸出結果,進行非線性的激活函數(ReLU最常用)處理。
  • 對激活函數的結果再進行池化操作,即降采樣,一般采用最大池化方法,保留最顯著的特征,并提升模型的畸變容錯能力。

權值共享解釋:

  • 一個卷積核對應一個新圖像,新圖像的每個像素來自相同的卷積核,這就是權值共享
  • 參數量只和卷積核大小有無,與多少隱含節點和圖片有多大無關。

CNN要點:
局部連接,權值共享,池化層的降采樣(賦予模型輕度形變的容忍性,提高了模型泛化能力)

代碼: 兩個卷積層加一個全連接層構建一個簡單但非常有代表性的卷積神經網絡。

"""作者:Heart Sea功能:基于minist, CNN實現識別手寫數字Model:輸入層, 1D轉換2D卷積層, 卷積, 激活relu, 最大池化卷積層, 卷積, 激活relu, 最大池化全連接, 2D轉換1D, 激活relu隱藏層(Dropout層)全連接, softmax輸出層版本:3.0日期:10/11/2019 """from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) sess = tf.InteractiveSession()# 由于使用ReLU # 需要使用正態分布給參數加噪聲(這里加入截斷的正態分布噪聲),來打破完全對稱并且避免0梯度 # 還需要給偏置賦值小的非零值來避免死亡神經元 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)# 定義卷積層函數,strides代表卷積模板移動的步長,都是1表示劃過圖片每一個點 # padding表示邊界處理方式,SAME讓卷積的輸入和輸出保持同樣的尺寸 # x是輸入,w卷積的參數 def conv2d(x, W):return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')# 定義最大池化函數,ksize參數是濾波器大小,表示2*2的濾波器, # strides設為橫豎兩個方向以2為步長,步長如果為1,得到一個尺寸不變的圖片 def max_pool_2x2(x):return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')# CNN會利用到空間的結構信息,需要將1D轉換成2D # 利用tf.reshape函數對輸入的一維向量還原為28x28的結構,-1代表樣本數量不固定,最后1代表顏色通道數量 # x特征,y_真實的label x = tf.placeholder(tf.float32, [None, 784]) y_ = tf.placeholder(tf.float32, [None, 10]) x_image = tf.reshape(x, [-1, 28, 28, 1])# 定義第一個卷積層,[5, 5, 1, 32]代表 卷積核尺寸為5x5,1個通道,32個不同卷積核 # 對權重、偏置初始化,然后經卷積層和激活函數激活,最后池化操作 # h_pool1尺寸:14*14*32 W_conv1 = weight_variable([5, 5, 1, 32]) b_conv1 = bias_variable([32]) h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) h_pool1 = max_pool_2x2(h_conv1)# 定義第二個卷積層,64是卷積核的數量,提取64種特征 # h_pool2尺寸:7*7*64(經過兩次池化) W_conv2 = weight_variable([5, 5, 32, 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) # 經過兩層池化,邊長變為7*7,所以第二個卷積層輸出的tensor尺寸為7*7*64# 全連接層處理 # h_fc1尺寸:1*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層 # h_fc1尺寸:1*1024 keep_prob = tf.placeholder(tf.float32) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)# 建立Softmax層與Dropout層連接,最后輸出概率 # y_conv尺寸:1*10 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)# 定義損失函數,指定Adam優化器優化 cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1])) 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))tf.global_variables_initializer().run()# 開始訓練,訓練2萬次,mini_batch為50,每100次顯示分類精度 # 評測時,keep_prob設為1,用以實時監測模型性能 for i in range(20000):batch = mnist.train.next_batch(50)if i % 100 == 0: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})) # 99.2%

step 0, training accuracy 0.1
step 100, training accuracy 0.88



這個簡單的卷積神經網絡模型的準確率大約為99.2%,基本可以滿足對手寫數字識別準確率的要求。相比之前的深度神經網絡2%的錯誤率,CNN的錯誤率下降了60%。這其中主要的性能提升都來自更優秀的網絡模型設計,充分說明卷積網絡對圖像特征的提取和抽象能力。依靠卷積核的權值共享,CNN的參數數量并沒有爆炸,降低計算量的同時也減輕了過擬合,整個模型的性能有著較大的提升。

總結

以上是生活随笔為你收集整理的TensorFlow基于minist数据集实现手写字识别实战的三个模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一区二区三区在线播放 | 一区二区三区高清在线 | 欧美黑人又粗又大高潮喷水 | 精品午夜视频 | 欧美成年人在线视频 | 国产免费黄色录像 | 日本羞羞网站 | 国产一区二区免费视频 | 精品国产自 | 国模私拍在线 | 国产伦精品一区二区三区视频网站 | 久久久久久久极品内射 | 国产无 | 欧美自拍亚洲 | 国产精品一区二区性色av | 亚洲精品天堂成人片av在线播放 | 欧洲成人一区二区三区 | 亚洲精品视频在线观看免费 | 可以直接看的毛片 | 亚洲三级免费观看 | 中文av在线播放 | 青草福利视频 | a级黄色片免费看 | 亚洲一区在线不卡 | 潮喷失禁大喷水无码 | 国产精品久久久国产盗摄 | 欧美一区二区三区黄色 | 福利片av | 一区二区欧美在线观看 | 青春草视频在线免费观看 | 绝顶高潮videos合集 | 正在播放欧美 | 性猛交xxxx乱大交孕妇2十 | 男人午夜影院 | 欧美片17c07.com | 日韩电影一区二区三区 | 日本成人在线看 | 免费av看片 | 午夜精品福利一区二区三区蜜桃 | 在线香蕉视频 | 国产精品怡红院 | 欧美日韩国产亚洲一区 | 久久亚洲电影 | 欧美一二区视频 | 毛片日本| 中文人妻av久久人妻18 | 黄色特级网站 | 亚洲第三色 | 特级毛片网站 | 免费无毒av| 成人免费淫片aa视频免费 | 可以免费看的av | 一道本不卡视频 | 尤物网站在线观看 | 精品小视频在线观看 | 色一区二区 | 日本护士做爰视频 | 国产一级在线播放 | 精品三级在线观看 | 亚洲天堂av片 | 欧美人狂配大交3d | 自拍1区 | 伊人久久大香线蕉 | 欧产日产国产精品98 | 色中色在线视频 | 依人99 | 中文字幕日韩三级片 | 天堂在线亚洲 | 自拍偷拍导航 | 999视频| 久久色网站 | 中文日韩av| 欧美二区在线观看 | 人人妻人人澡人人爽久久av | 一级片高清 | 亚洲国产aⅴ成人精品无吗 日韩乱论 | 超碰77| 黄色三级三级 | 黄色网址在线免费播放 | 日本一区二区视频在线播放 | 少妇高潮一区二区三区四区 | 花样视频污 | 2024av| 日本精品免费一区二区三区 | 伦理片一区二区三区 | 国产精品美女久久久久av超清 | 激情综合啪啪 | 神马午夜国产 | 麻豆视频91 | 奇米网7777 | 成人a视频在线观看 | 亚洲av永久一区二区三区蜜桃 | 久久dvd | 日韩精品一区二区三区四区 | 亚洲精品久久久久久久久久久 | 天海翼av | 免费av不卡 | 一个人在线观看www软件 | 中文字幕在线播出 |