詳解Python手寫數(shù)字識(shí)別模型的構(gòu)建與使用
一:手寫數(shù)字模型構(gòu)建與保存
1 加載數(shù)據(jù)集
# 1加載數(shù)據(jù) digits_data = load_digits()
可以先簡(jiǎn)單查看下 手寫數(shù)字集,如下可以隱約看出數(shù)字為8
plt.imshow(digits_data.images[8]) plt.show()
2 特征數(shù)據(jù) 標(biāo)簽數(shù)據(jù)
# 數(shù)據(jù)劃分 x_data = digits_data.data y_data = digits_data.target
3 訓(xùn)練集 測(cè)試集
# 訓(xùn)練集 + 測(cè)試集 x_test = x_data[:40] y_test = y_data[:40] x_train = x_data[40:] y_train = y_data[40:] # 概率問題 y_train_2 = np.zeros(shape=(len(y_train), 10))
4 數(shù)據(jù)流圖 輸入層
input_size = digits_data.data.shape[1] # 輸入的列數(shù) # 數(shù)據(jù)流圖的構(gòu)建 # x:輸入64個(gè)特征值--像素 x = tf.placeholder(np.float32, shape=[None, input_size]) # y:識(shí)別的數(shù)字 有幾個(gè)類別[0-9] y = tf.placeholder(np.float32, shape=[None, 10])
5 隱藏層
5.1 第一層
# 第一層隱藏層 # 參數(shù)1 輸入維度 參數(shù)2:輸出維度(神經(jīng)元個(gè)數(shù)) 標(biāo)準(zhǔn)差是0.1的正態(tài)分布 w1 = tf.Variable(tf.random_normal([input_size, 80], stddev=0.1)) # b的個(gè)數(shù)就是隱藏層神經(jīng)元的個(gè)數(shù) b1 = tf.Variable(tf.constant(0.01), [80]) # 第一層計(jì)算 one = tf.matmul(x, w1) + b1 # 激活函數(shù) 和0比 大于0則激活 op1 = tf.nn.relu(one)
5.2 第二層
# 第二層隱藏層 上一層輸出為下一層輸入 # 參數(shù)1 輸入維度 參數(shù)2:輸出維度(神經(jīng)元個(gè)數(shù)) 標(biāo)準(zhǔn)差是0.1的正態(tài)分布 w2 = tf.Variable(tf.random_normal([80, 10], stddev=0.1)) # b的個(gè)數(shù)就是隱藏層神經(jīng)元的個(gè)數(shù) b2 = tf.Variable(tf.constant(0.01), [10]) # 第一層計(jì)算 two = tf.matmul(op1, w2) + b2 # 激活函數(shù) 和0比 大于0則激活 op2 = tf.nn.relu(two)
6 損失函數(shù)
# 構(gòu)建損失函數(shù) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=op2))
7 梯度下降算法
# 梯度下降算法 Optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.005).minimize(loss)
8 輸出損失值
# 變量初始化 init = tf.global_variables_initializer() data_size = digits_data.data.shape[0] # 開啟會(huì)話 with tf.Session() as sess: sess.run(init) # 訓(xùn)練次數(shù) for i in range(500): # 數(shù)據(jù)分組 start = (i * 100) % data_size end = min(start + 100, data_size) batch_x = x_train[start:end] batch_y = y_train_2[start:end] sess.run(Optimizer, feed_dict={x: batch_x, y: batch_y}) # 輸出損失值 train_loss = sess.run(loss, feed_dict={x: batch_x, y: batch_y}) print(train_loss)
9 模型 保存與使用
obj = tf.train.Saver() # 模型保存 obj.save(sess, 'model-digits.ckpt')
10 完整源碼分享
import tensorflow as tf from sklearn.datasets import load_digits import matplotlib.pyplot as plt import numpy as np import pandas as pd # 1加載數(shù)據(jù) digits_data = load_digits() # 查看數(shù)據(jù) # print(digits_data) # 查看數(shù)據(jù)基本特征 (1797, 64) 64:8*8像素點(diǎn) # print(digits_data.data.shape) # plt.imshow(digits_data.images[8]) # plt.show() # 數(shù)據(jù)劃分 x_data = digits_data.data y_data = digits_data.target # 訓(xùn)練集 + 測(cè)試集 x_test = x_data[:40] y_test = y_data[:40] x_train = x_data[40:] y_train = y_data[40:] # 概率問題 y_train_2 = np.zeros(shape=(len(y_train), 10)) # 對(duì)應(yīng)的分類 當(dāng)前行對(duì)應(yīng)列變成1 for index, row in enumerate(y_train_2): # 當(dāng)前行 對(duì)應(yīng)的數(shù)字對(duì)應(yīng)列 row[int(y_train[index])] = 1 # print(y_train_2[0]) input_size = digits_data.data.shape[1] # 輸入的列數(shù) # 數(shù)據(jù)流圖的構(gòu)建 # x:輸入64個(gè)特征值--像素 x = tf.placeholder(np.float32, shape=[None, input_size]) # y:識(shí)別的數(shù)字 有幾個(gè)類別[0-9] y = tf.placeholder(np.float32, shape=[None, 10]) # 第一層隱藏層 # 參數(shù)1 輸入維度 參數(shù)2:輸出維度(神經(jīng)元個(gè)數(shù)) 標(biāo)準(zhǔn)差是0.1的正態(tài)分布 w1 = tf.Variable(tf.random_normal([input_size, 80], stddev=0.1)) # b的個(gè)數(shù)就是隱藏層神經(jīng)元的個(gè)數(shù) b1 = tf.Variable(tf.constant(0.01), [80]) # 第一層計(jì)算 one = tf.matmul(x, w1) + b1 # 激活函數(shù) 和0比 大于0則激活 op1 = tf.nn.relu(one) # 第二層隱藏層 上一層輸出為下一層輸入 # 參數(shù)1 輸入維度 參數(shù)2:輸出維度(神經(jīng)元個(gè)數(shù)) 標(biāo)準(zhǔn)差是0.1的正態(tài)分布 w2 = tf.Variable(tf.random_normal([80, 10], stddev=0.1)) # b的個(gè)數(shù)就是隱藏層神經(jīng)元的個(gè)數(shù) b2 = tf.Variable(tf.constant(0.01), [10]) # 第一層計(jì)算 two = tf.matmul(op1, w2) + b2 # 激活函數(shù) 和0比 大于0則激活 op2 = tf.nn.relu(two) # 構(gòu)建損失函數(shù) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=op2)) # 梯度下降算法 優(yōu)化器 learning_rate學(xué)習(xí)率(步長(zhǎng)) Optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.005).minimize(loss) # 變量初始化 init = tf.global_variables_initializer() data_size = digits_data.data.shape[0] # 開啟會(huì)話 with tf.Session() as sess: sess.run(init) # 訓(xùn)練次數(shù) for i in range(500): # 數(shù)據(jù)分組 start = (i * 100) % data_size end = min(start + 100, data_size) batch_x = x_train[start:end] batch_y = y_train_2[start:end] sess.run(Optimizer, feed_dict={x: batch_x, y: batch_y}) # 輸出損失值 train_loss = sess.run(loss, feed_dict={x: batch_x, y: batch_y}) print(train_loss) obj = tf.train.Saver() # 模型保存 obj.save(sess, 'modelSave/model-digits.ckpt')
損失值在0.303左右,如下圖所示
二:手寫數(shù)字模型使用與測(cè)試
對(duì)上一步創(chuàng)建的模型,使用測(cè)試
import tensorflow as tf from sklearn.datasets import load_digits import matplotlib.pyplot as plt import numpy as np import pandas as pd # 1加載數(shù)據(jù) digits_data = load_digits() # 數(shù)據(jù)劃分 x_data = digits_data.data y_data = digits_data.target # 訓(xùn)練集 + 測(cè)試集 x_test = x_data[:40] y_test = y_data[:40] x_train = x_data[40:] y_train = y_data[40:] # 概率問題 y_train_2 = np.zeros(shape=(len(y_train), 10)) # 對(duì)應(yīng)的分類 當(dāng)前行對(duì)應(yīng)列變成1 for index, row in enumerate(y_train_2): # 當(dāng)前行 對(duì)應(yīng)的數(shù)字對(duì)應(yīng)列 row[int(y_train[index])] = 1 # 網(wǎng)絡(luò)搭建 num_class = 10 # 數(shù)字0-9 hidden_num = 80 # 神經(jīng)元個(gè)數(shù) input_size = digits_data.data.shape[1] # 輸入的列數(shù) # 數(shù)據(jù)流圖的構(gòu)建 # x:輸入64個(gè)特征值--像素 x = tf.placeholder(np.float32, shape=[None, 64]) # y:識(shí)別的數(shù)字 有幾個(gè)類別[0-9] y = tf.placeholder(np.float32, shape=[None, 10]) # 第一層隱藏層 # 參數(shù)1 輸入維度 參數(shù)2:輸出維度(神經(jīng)元個(gè)數(shù)) 標(biāo)準(zhǔn)差是0.1的正態(tài)分布 w1 = tf.Variable(tf.random_normal([input_size, 80], stddev=0.1)) # b的個(gè)數(shù)就是隱藏層神經(jīng)元的個(gè)數(shù) b1 = tf.Variable(tf.constant(0.01), [80]) # 第一層計(jì)算 one = tf.matmul(x, w1) + b1 # 激活函數(shù) 和0比 大于0則激活 op1 = tf.nn.relu(one) # 第二層隱藏層 上一層輸出為下一層輸入 # 參數(shù)1 輸入維度 參數(shù)2:輸出維度(神經(jīng)元個(gè)數(shù)) 標(biāo)準(zhǔn)差是0.1的正態(tài)分布 w2 = tf.Variable(tf.random_normal([80, 10], stddev=0.1)) # b的個(gè)數(shù)就是隱藏層神經(jīng)元的個(gè)數(shù) b2 = tf.Variable(tf.constant(0.01), [10]) # 第一層計(jì)算 two = tf.matmul(op1, w2) + b2 # 激活函數(shù) 和0比 大于0則激活 op2 = tf.nn.relu(two) # 變量初始化 init = tf.global_variables_initializer() train_count = 500 batch_size = 100 data_size = x_train.shape[0] pre_max_index = tf.argmax(op2, 1) plt.imshow(digits_data.images[13]) # 3 plt.show() with tf.Session() as sess: sess.run(init) # 使用網(wǎng)絡(luò) obj = tf.train.Saver() obj.restore(sess, 'modelSave/model-digits.ckpt') print(sess.run(op2, feed_dict={x: [x_test[13], x_test[14]]})) print(sess.run(pre_max_index, feed_dict={x: [x_test[13], x_test[14]]}))
想要測(cè)試的數(shù)據(jù),如下圖所示
使用模型測(cè)試出來的結(jié)果,如下圖所示,模型基本能夠使用
到此這篇關(guān)于詳解Python手寫數(shù)字識(shí)別模型的構(gòu)建與使用的文章就介紹到這了,更多相關(guān)Python手寫數(shù)字識(shí)別模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python網(wǎng)絡(luò)爬蟲項(xiàng)目:內(nèi)容提取器的定義
本篇文章主要介紹了Python網(wǎng)絡(luò)爬蟲項(xiàng)目,這能有效的節(jié)省程序員的時(shí)間,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10Python Flask前端自動(dòng)登錄功能實(shí)現(xiàn)詳解
這篇文章主要介紹了Python Flask前端自動(dòng)登錄功能實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10編寫同時(shí)兼容Python2.x與Python3.x版本的代碼的幾個(gè)示例
這篇文章主要介紹了編寫同時(shí)兼容Python2.x與Python3.x版本的代碼的幾個(gè)示例,在Python2.7.x的更新中由于采用了某些Python3中的代碼編寫特性、使得在有些原本不同之處編寫兼容性代碼成為可能,需要的朋友可以參考下2015-03-03pytorch使用nn.Moudle實(shí)現(xiàn)邏輯回歸
這篇文章主要為大家詳細(xì)介紹了pytorch使用nn.Moudle實(shí)現(xiàn)邏輯回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07