手寫(xiě)數(shù)字識(shí)別
說(shuō)到數(shù)字識(shí)別問(wèn)題,這是一個(gè)分類問(wèn)題,也就是我們要探討的邏輯回歸問(wèn)題。邏輯回歸是機(jī)器學(xué)習(xí)算法中非常經(jīng)典的一種算法。
1、線性回歸VS邏輯回歸
線性回歸和邏輯回歸的關(guān)系就是:邏輯回歸是廣義的線性回歸。它們就是一個(gè)東西,只是范圍不同。我在文章《深度學(xué)習(xí)在單線性回歸方程中的應(yīng)用–TensorFlow實(shí)戰(zhàn)詳解》講到的預(yù)測(cè)問(wèn)題實(shí)則是線性回歸,本質(zhì)就是用一堆數(shù)據(jù)集點(diǎn)去模擬出一個(gè)函數(shù),再用這個(gè)函數(shù)進(jìn)行預(yù)測(cè)。邏輯回歸是在這個(gè)基礎(chǔ)上,將得到的函數(shù)放在一個(gè) Sigmoid()
函數(shù)里求出來(lái)得到一堆概率值,這些概率值就是在0和1之間的。這個(gè)時(shí)候我們?cè)谠O(shè)置一個(gè)閾值,通過(guò)比較概率和這個(gè)閾值的關(guān)系,我們就能達(dá)到分類的效果了。
總結(jié)一下就是:
線性回歸解決的是回歸問(wèn)題,邏輯回歸相當(dāng)于是線性回歸的基礎(chǔ)上,來(lái)解決分類問(wèn)題。
線性回歸:
邏輯回歸:
從上面兩個(gè)公式:邏輯回歸可以理解為在線性回歸后加了一個(gè)Sigmoid
函數(shù)。將線性回歸變成一個(gè)0~1輸出的分類問(wèn)題。
Sigmoid函數(shù)
這個(gè)函數(shù)長(zhǎng)成這個(gè)樣子:
線性回歸得到大于0的輸出,邏輯回歸就會(huì)得到0.5 ~ 1的輸出;線性回歸得到小于0的輸出,邏輯回歸就會(huì)得到0 ~ 0.5的輸出;【其實(shí)就是上面把Z>0和Z<0兩種情況討論】
他們的聯(lián)系:線性回歸模型試圖找到一個(gè)線性方程來(lái)擬合數(shù)據(jù),而邏輯回歸模型則試圖找到一個(gè)邏輯函數(shù)來(lái)擬合數(shù)據(jù)。線性回歸解決預(yù)測(cè)問(wèn)題,邏輯回歸解決分類問(wèn)題。
2、邏輯回歸的基本模型-神經(jīng)網(wǎng)絡(luò)模型
許多問(wèn)題的預(yù)測(cè)結(jié)果是一個(gè)在連續(xù)空間的數(shù)值,比如房?jī)r(jià)預(yù)測(cè)問(wèn)題,可以用線性模型來(lái)描 述:
但也有很多場(chǎng)景需要輸出的是概率估算值,例如:
-
根據(jù)郵件內(nèi)容判斷是垃圾郵件的可能性
-
根據(jù)醫(yī)學(xué)影像判斷腫瘤是惡性的可能性
-
手寫(xiě)數(shù)字分別是 0、1、2、3、4、5、6、7、8、9的可能性(概率)
這時(shí)需要將預(yù)測(cè)輸出值控制在 [0,1]區(qū)間內(nèi) 二元分類問(wèn)題的目標(biāo)是正確預(yù)測(cè)兩個(gè)可能的標(biāo)簽中的一個(gè) 。
邏輯回歸(Logistic Regression)可以用于處理這類問(wèn)題
3、多元分類基本模型
為什么要討論多元分類呢?因?yàn)槲覀兩厦嬉肓?strong>邏輯回歸的基本模型,我們把邏輯回歸基本模型拼成如下圖所示就可以得到一個(gè)多元分類模型了:
其實(shí)這個(gè)模型就是一個(gè)全連接神經(jīng)網(wǎng)絡(luò)。
這個(gè)Softmax
的作用就是讓邏輯回歸得到的概率值在0-1之間,且概率值相加之和為1!這個(gè)Softmax
長(zhǎng)成這樣:
4、TensorFlow實(shí)戰(zhàn)解決手寫(xiě)數(shù)字識(shí)別問(wèn)題
我們說(shuō)機(jī)器學(xué)習(xí)呢算法的套路如下:
- 準(zhǔn)備數(shù)據(jù)集
- 構(gòu)建模型
- 訓(xùn)練模型
- 進(jìn)行預(yù)測(cè)
準(zhǔn)備數(shù)據(jù)集
我們現(xiàn)在去哪里搜集數(shù)據(jù)集呢?
MNIST 數(shù)據(jù)集可在 http://yann.lecun.com/exdb/mnist/ 獲取。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
print("TensorFlow2.0版本是:",tf.__version__)
#打印當(dāng)前的數(shù)據(jù)集
mnist=tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
print("Train images_shape:",train_images.shape,"Train label shape:",train_labels.shape)
print("Test images shape:",test_images.shape,"Test label shape:",test_labels.shape)
數(shù)據(jù)集劃分
為了高考取得好成績(jī),你需要 模擬卷 ,押題卷, 真題卷。
其中:
- 模擬卷=訓(xùn)練集
- 押題卷=驗(yàn)證集
- 真題卷=測(cè)試集
這樣分類,才能更好的對(duì)你的大腦進(jìn)行訓(xùn)練,如果不按章法刷題,你上來(lái)就做真題卷,押題卷缺少了系統(tǒng)的訓(xùn)練;如果你不做押題卷,只做模擬卷,那么你缺少了對(duì)真題命題規(guī)律的判斷。這在機(jī)器學(xué)習(xí)中叫做過(guò)擬合或者欠擬合,意思是你的大腦泛化能力不夠好,模型訓(xùn)練的不大好。
我們建立了如下圖的新的工作流程:
total_num=len(train_images)
valid_split=0.2 # 驗(yàn)證集的比例占20%
train_num=int(total_num*(1-valid_split))#訓(xùn)練集的數(shù)目
train_x=train_images[:train_num]#前部分給訓(xùn)練集
train_y=train_labels[:train_num]
valid_x=train_images[train_num:]#后20%給驗(yàn)證集
valid_y=train_labels[train_num:]
test_x=test_images
test_y=test_labels
valid_x.shape
特征數(shù)據(jù)歸一化
特征數(shù)據(jù)歸一化(特征歸一化)是指將數(shù)據(jù)按比例縮放,使之落入一個(gè)小的特定區(qū)間。在某些比較和評(píng)價(jià)的指標(biāo)處理中經(jīng)常會(huì)用到,去除數(shù)據(jù)的單位限制,將其轉(zhuǎn)化為無(wú)量綱的純數(shù)值,便于不同單位或量級(jí)的指標(biāo)能夠進(jìn)行比較和加權(quán)。特征歸一化通常將數(shù)據(jù)映射到[0,1]區(qū)間上,常見(jiàn)的映射范圍有[0,1]和[-1,1]。這樣可以使得不同指標(biāo)之間具有可比性。同時(shí),特征歸一化也可以消除數(shù)據(jù)特征之間的量綱影響。
例如,分析一個(gè)人的身高和體重對(duì)健康的影響 , 如果使用米( m) 和千克( kg )作為單位 , 那么身高特征會(huì)在 1.6 ~ l.8m 的數(shù)值范圍內(nèi) , 體重特征會(huì)在50 ~ 100kg 的范圍內(nèi), 分析出來(lái)的結(jié)果顯然會(huì)傾向于數(shù)值差別比較大的體重特征。 想要得到更為準(zhǔn)確的結(jié)果,就需要進(jìn)行特征歸一化( Normalization )處理,使各指標(biāo)處于同一數(shù)值量級(jí),以便進(jìn)行分析。
歸一化方法
- 線性函數(shù)歸 化( Min-Max Scaling )
它對(duì)原始數(shù)據(jù)進(jìn)行線性變換,使結(jié)果映射到[0, 1 ]的范圍,實(shí)現(xiàn)對(duì)原始數(shù)據(jù)的等比縮放。歸一化公式如下:
- 零均值歸一化( Z-Score Normalization )
它會(huì)將原始數(shù)據(jù)映射到均值為 0、標(biāo)準(zhǔn)差為1 的分布上。 具體來(lái)說(shuō), 假設(shè)原始特征的均值為 μ、標(biāo)準(zhǔn)差為 σ,那么歸一化公式定義為
歸一化場(chǎng)景
當(dāng)然 ,數(shù)據(jù)歸一化并不是萬(wàn)能的。 在實(shí)際應(yīng)用中,通過(guò)梯度下降法求解的模型通常是需要?dú)w一化的 ,包括邏輯回歸、線性回歸、邏輯回歸、支持向量機(jī)、 神經(jīng)網(wǎng)絡(luò)等模型。 但對(duì)于決策樹(shù)模型則并不適用 , 以C4.5 為例,決策樹(shù)在進(jìn)行節(jié)點(diǎn)分裂時(shí)主要依據(jù)數(shù)據(jù)集 D 關(guān)于特征 x 的信息增益比,而信息增益比跟特征是否經(jīng)過(guò)歸一化是無(wú)關(guān)的,因?yàn)闅w一化并不會(huì)改變樣本在特征 x 上的信息增益。
# 把(28,28)的結(jié)構(gòu)拉成一行 784
train_x=train_x.reshape(-1,784)
valid_x=valid_x.reshape(-1,784)
test_x=test_x.reshape(-1,784)
# 特征數(shù)據(jù)歸一化
train_x=tf.cast(train_x/255.0,tf.float32)
valid_x=tf.cast(valid_x/255.0,tf.float32)
test_x=tf.cast(test_x/255.0,tf.float32)
train_x[1]
標(biāo)簽數(shù)據(jù)獨(dú)熱編碼
在機(jī)器學(xué)習(xí)算法中,我們經(jīng)常會(huì)遇到分類特征,例如:人的性別有男女,祖國(guó)有中國(guó),美國(guó),法國(guó)等。這些特征值并不是連續(xù)的,而是離散的,無(wú)序的。通常我們需要對(duì)其進(jìn)行特征數(shù)字化。
考慮以下三個(gè)特征:
[“male”, “female”]
[“from Europe”, “from US”, “from Asia”]
[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]
如果將上述特征用數(shù)字表示,效率會(huì)高很多。例如:
[“male”, “from US”, “uses Internet Explorer”] 表示為[0, 1, 3]
[“female”, “from Asia”, “uses Chrome”]表示為[1, 2, 1]
但是,轉(zhuǎn)化為數(shù)字表示后,上述數(shù)據(jù)不能直接用在我們的分類器中。因?yàn)?,分類器往往默認(rèn)數(shù)據(jù)數(shù)據(jù)是連續(xù)的,并且是有序的。但按上述表示的數(shù)字并不有序的,而是隨機(jī)分配的。
-
One-Hot編碼
One-Hot編碼,又稱為一位有效編碼,主要是采用N位狀態(tài)寄存器來(lái)對(duì)N個(gè)狀態(tài)進(jìn)行編碼,每個(gè)狀態(tài)都由他獨(dú)立的寄存器位,并且在任意時(shí)候只有一位有效。
就拿上面的例子來(lái)說(shuō)吧,性別特征:[“男”,“女”],按照N位狀態(tài)寄存器來(lái)對(duì)N個(gè)狀態(tài)進(jìn)行編碼的原理,咱們處理后應(yīng)該是這樣的(這里只有兩個(gè)特征,所以N=2):
男 => 10
女 => 01
祖國(guó)特征:[“中國(guó)”,"美國(guó),“法國(guó)”](這里N=3):
中國(guó) => 100
美國(guó) => 010
法國(guó) => 001
運(yùn)動(dòng)特征:[“足球”,“籃球”,“羽毛球”,“乒乓球”](這里N=4):
足球 => 1000
籃球 => 0100
羽毛球 => 0010
乒乓球 => 0001
所以,當(dāng)一個(gè)樣本為[“男”,“中國(guó)”,“乒乓球”]的時(shí)候,完整的特征數(shù)字化的結(jié)果為:
[1,0,1,0,0,0,0,0,1]
在回歸,分類,聚類等機(jī)器學(xué)習(xí)算法中,特征之間距離的計(jì)算或相似度的計(jì)算是非常重要的,而我們常用的距離或相似度的計(jì)算都是在歐式空間的相似度計(jì)算,計(jì)算余弦相似性,基于的就是歐式空間。而我們使用one-hot編碼,將離散特征的取值擴(kuò)展到了歐式空間,離散特征的某個(gè)取值就對(duì)應(yīng)歐式空間的某個(gè)點(diǎn)。將離散型特征使用one-hot編碼,確實(shí)會(huì)讓特征之間的距離計(jì)算更加合理。
# 對(duì)標(biāo)簽數(shù)據(jù)進(jìn)行獨(dú)熱編碼
train_y=tf.one_hot(train_y,depth=10)
valid_y=tf.one_hot(valid_y,depth=10)
test_y=tf.one_hot(test_y,depth=10)
train_y
構(gòu)建模型
#構(gòu)建模型
def model(x,w,b):
pred=tf.matmul(x,w)+b
return tf.nn.softmax(pred)
#定義變量
W=tf.Variable(tf.random.normal([784,10],mean=0.0,stddev=1.0,dtype=tf.float32))
B=tf.Variable(tf.zeros([10]),dtype=tf.float32)
損失函數(shù)
我們?cè)诰€性回歸的實(shí)戰(zhàn)中采用的損失函數(shù)是 平方損失函數(shù)。
在邏輯回歸中,我們采用的損失函數(shù)是 對(duì)數(shù)損失函數(shù)。
這個(gè)函數(shù)是一個(gè)凸函數(shù),它的圖象如下:
在多元分類問(wèn)題中,我們通常采用交叉熵?fù)p失函數(shù):
def loss(x,y,w,b):
pred=model(x,w,b)#計(jì)算模型預(yù)測(cè)值和標(biāo)簽值的差異
loss_=tf.keras.losses.categorical_crossentropy(y_true=y,y_pred=pred)# 官方的交叉熵?fù)p失函數(shù)
return tf.reduce_mean(loss_)#求均值,得到均方差
訓(xùn)練超參數(shù)
training_epochs=20#訓(xùn)練輪數(shù)
batch_size=50#單次訓(xùn)練樣本
learning_rate=0.001 #學(xué)習(xí)率
梯度函數(shù)
#計(jì)算樣本數(shù)據(jù)在[x,y]在參數(shù)[w,b]點(diǎn)上的梯度
def grad(x,y,w,b):
with tf.GradientTape() as tape:
loss_=loss(x,y,w,b)
return tape.gradient(loss_,[w,b])#返回梯度向量
Adam優(yōu)化器
#Adam優(yōu)化器
optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate)
常用的優(yōu)化器有:
- SGD
- Adagrad
- RMSprop
- Adam
準(zhǔn)確率
#定義準(zhǔn)確率
def accuary(x,y,w,b):
pred=model(x,w,b)#計(jì)算模型預(yù)測(cè)和標(biāo)簽值的差異
# 檢查預(yù)測(cè)類別tf.argmax(pred,1)與實(shí)際類別tf.argmax(pred,1)的匹配情況
correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
#準(zhǔn)確率
return tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
模型訓(xùn)練
total_step=int(train_num/batch_size)#一輪訓(xùn)練有多少批次
loss_list_train=[]#用于保存訓(xùn)練集loss值的列表
loss_list_valid=[]# 用于保存驗(yàn)證集loss值的列表
acc_list_train=[]# 用于保存訓(xùn)練集Acc的值的列表
acc_list_valid=[]# 用于保存驗(yàn)證集Acc值的列表
for epoch in range(training_epochs):
for step in range(total_step):
xs=train_x[step*batch_size:(step+1)*batch_size]
ys=train_y[step*batch_size:(step+1)*batch_size]
grads=grad(xs,ys,W,B)#計(jì)算梯度
optimizer.apply_gradients(zip(grads,[W,B]))#優(yōu)化器根據(jù)梯度自動(dòng)調(diào)整變量w和b
loss_train=loss(train_x,train_y,W,B).numpy() #計(jì)算當(dāng)前輪訓(xùn)練損失
loss_valid=loss(valid_x,valid_y,W,B).numpy() #計(jì)算當(dāng)前輪損失驗(yàn)證
acc_train=accuary(train_x,train_y,W,B).numpy()
acc_valid=accuary(valid_x,valid_y,W,B).numpy()
loss_list_train.append(loss_train)
loss_list_valid.append(loss_valid)
acc_list_train.append(acc_train)
acc_list_valid.append(acc_valid)
print("epoch={:3d},train_loss={:.4f},train_acc={:.4f},val_loss={:.4f},val_acc={:.4f}".format(
epoch+1,loss_train,acc_train,loss_valid,acc_valid))
顯示訓(xùn)練過(guò)程數(shù)據(jù)
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.plot(loss_list_train,'blue',label='Train Loss')
plt.plot(loss_list_valid,'red',label='Valid Loss')
plt.legend(loc=1)#通過(guò)參數(shù)loc指定圖例位置
plt.xlabel("Epochs")
plt.ylabel("Accuary")
plt.plot(acc_list_train,'blue',label='Train Acc')
plt.plot(acc_list_valid,'red',label='Valid Acc')
plt.legend(loc=1)#通過(guò)參數(shù)loc指定圖例位置
在測(cè)試集完成評(píng)估模型
acc_test=accuary(test_x,test_y,W,B).numpy()
print("Test accuary:",acc_test)
模型預(yù)測(cè)
模型建立完成以后并訓(xùn)練完,現(xiàn)在認(rèn)為準(zhǔn)確度可以接受了,接下來(lái)可以使用這個(gè)模型進(jìn)行預(yù)測(cè)了。
# 定義預(yù)測(cè)函數(shù)
def predict(x,w,b):
pred=model(x,w,b)#計(jì)算預(yù)測(cè)值
result=tf.argmax(pred,1).numpy()
return result
pred_test=predict(test_x,W,B)
pred_test[0]
定義可視化函數(shù)
def plot_images_labels_prediction(images,# 圖象列表
labels,# 標(biāo)簽列表
preds,#預(yù)測(cè)值列表
index=0,#從第index個(gè)開(kāi)始顯示
num=10):#缺省一次顯示10幅
fig=plt.gcf() #獲取當(dāng)前圖表
fig.set_size_inches(10,4) # 1英寸=2.54cm
if num > 10:
num = 10 #最多顯示10個(gè)子圖
for i in range(0,num):
ax=plt.subplot(2,5,i+1)#獲取當(dāng)前要處理的子圖
ax.imshow(np.reshape(images[index],(28,28)),cmap='binary')# 顯示第index個(gè)圖
title="label="+str(labels[index])#構(gòu)建圖上要顯示的title信息
if len(preds)>0:
title+=",predict="+str(preds[index])
ax.set_title(title,fontsize=10)#顯示圖上的title信息
ax.set_xticks([])#不顯示坐標(biāo)
ax.set_yticks([])
index=index+1
plt.show()
預(yù)測(cè)函數(shù)可視化預(yù)測(cè)結(jié)果
#可視化預(yù)測(cè)結(jié)果
plot_images_labels_prediction(test_images,test_labels,pred_test,10,10)
可以調(diào)整訓(xùn)練迭代次數(shù)來(lái)提高迭代的準(zhǔn)確度。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-759779.html
5、完整代碼demo
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
print("TensorFlow2.0版本是:",tf.__version__)
mnist=tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
print("Train images_shape:",train_images.shape,"Train label shape:",train_labels.shape)
print("Test images shape:",test_images.shape,"Test label shape:",test_labels.shape)
print("image data:",train_images[1])
def plot_image(image):
plt.imshow(image.reshape(28,28),cmap='binary')
plt.show()
plot_image(train_images[1])
total_num=len(train_images)
valid_split=0.2 # 驗(yàn)證集的比例占20%
train_num=int(total_num*(1-valid_split))#訓(xùn)練集的數(shù)目
train_x=train_images[:train_num]#前部分給訓(xùn)練集
train_y=train_labels[:train_num]
valid_x=train_images[train_num:]#后20%給驗(yàn)證集
valid_y=train_labels[train_num:]
test_x=test_images
test_y=test_labels
valid_x.shape
# 把(28,28)的結(jié)構(gòu)拉成一行 784
train_x=train_x.reshape(-1,784)
valid_x=valid_x.reshape(-1,784)
test_x=test_x.reshape(-1,784)
# 特征數(shù)據(jù)歸一化
train_x=tf.cast(train_x/255.0,tf.float32)
valid_x=tf.cast(valid_x/255.0,tf.float32)
test_x=tf.cast(test_x/255.0,tf.float32)
train_x[1]
# 對(duì)標(biāo)簽數(shù)據(jù)進(jìn)行獨(dú)熱編碼
train_y=tf.one_hot(train_y,depth=10)
valid_y=tf.one_hot(valid_y,depth=10)
test_y=tf.one_hot(test_y,depth=10)
train_y
#構(gòu)建模型
def model(x,w,b):
pred=tf.matmul(x,w)+b
return tf.nn.softmax(pred)
#定義變量
W=tf.Variable(tf.random.normal([784,10],mean=0.0,stddev=1.0,dtype=tf.float32))
B=tf.Variable(tf.zeros([10]),dtype=tf.float32)
def loss(x,y,w,b):
pred=model(x,w,b)#計(jì)算模型預(yù)測(cè)值和標(biāo)簽值的差異
loss_=tf.keras.losses.categorical_crossentropy(y_true=y,y_pred=pred)
return tf.reduce_mean(loss_)#求均值,得到均方差
training_epochs=20#訓(xùn)練輪數(shù)
batch_size=50#單次訓(xùn)練樣本
learning_rate=0.001 #學(xué)習(xí)率
#計(jì)算樣本數(shù)據(jù)在[x,y]在參數(shù)[w,b]點(diǎn)上的梯度
def grad(x,y,w,b):
with tf.GradientTape() as tape:
loss_=loss(x,y,w,b)
return tape.gradient(loss_,[w,b])#返回梯度向量
#Adam優(yōu)化器
optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate)
#定義準(zhǔn)確率
def accuary(x,y,w,b):
pred=model(x,w,b)#計(jì)算模型預(yù)測(cè)和標(biāo)簽值的差異
# 檢查預(yù)測(cè)類別tf.argmax(pred,1)與實(shí)際類別tf.argmax(pred,1)的匹配情況
correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
#準(zhǔn)確率
return tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
total_step=int(train_num/batch_size)#一輪訓(xùn)練有多少批次
loss_list_train=[]#用于保存訓(xùn)練集loss值的列表
loss_list_valid=[]# 用于保存驗(yàn)證集loss值的列表
acc_list_train=[]# 用于保存訓(xùn)練集Acc的值的列表
acc_list_valid=[]# 用于保存驗(yàn)證集Acc值的列表
for epoch in range(training_epochs):
for step in range(total_step):
xs=train_x[step*batch_size:(step+1)*batch_size]
ys=train_y[step*batch_size:(step+1)*batch_size]
grads=grad(xs,ys,W,B)#計(jì)算梯度
optimizer.apply_gradients(zip(grads,[W,B]))#優(yōu)化器根據(jù)梯度自動(dòng)調(diào)整變量w和b
loss_train=loss(train_x,train_y,W,B).numpy() #計(jì)算當(dāng)前輪訓(xùn)練損失
loss_valid=loss(valid_x,valid_y,W,B).numpy() #計(jì)算當(dāng)前輪損失驗(yàn)證
acc_train=accuary(train_x,train_y,W,B).numpy()
acc_valid=accuary(valid_x,valid_y,W,B).numpy()
loss_list_train.append(loss_train)
loss_list_valid.append(loss_valid)
acc_list_train.append(acc_train)
acc_list_valid.append(acc_valid)
print("epoch={:3d},train_loss={:.4f},train_acc={:.4f},val_loss={:.4f},val_acc={:.4f}".format(
epoch+1,loss_train,acc_train,loss_valid,acc_valid))
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.plot(loss_list_train,'blue',label='Train Loss')
plt.plot(loss_list_valid,'red',label='Valid Loss')
plt.legend(loc=1)#通過(guò)參數(shù)loc指定圖例位置
plt.xlabel("Epochs")
plt.ylabel("Accuary")
plt.plot(acc_list_train,'blue',label='Train Acc')
plt.plot(acc_list_valid,'red',label='Valid Acc')
plt.legend(loc=1)#通過(guò)參數(shù)loc指定圖例位置
acc_test=accuary(test_x,test_y,W,B).numpy()
print("Test accuary:",acc_test)
# 定義預(yù)測(cè)函數(shù)
def predict(x,w,b):
pred=model(x,w,b)#計(jì)算預(yù)測(cè)值
result=tf.argmax(pred,1).numpy()
return result
pred_test=predict(test_x,W,B)
pred_test[0]
def plot_images_labels_prediction(images,# 圖象列表
labels,# 標(biāo)簽列表
preds,#預(yù)測(cè)值列表
index=0,#從第index個(gè)開(kāi)始顯示
num=10):#缺省一次顯示10幅
fig=plt.gcf() #獲取當(dāng)前圖表
fig.set_size_inches(10,4) # 1英寸=2.54cm
if num > 10:
num = 10 #最多顯示10個(gè)子圖
for i in range(0,num):
ax=plt.subplot(2,5,i+1)#獲取當(dāng)前要處理的子圖
ax.imshow(np.reshape(images[index],(28,28)),cmap='binary')# 顯示第index個(gè)圖
title="label="+str(labels[index])#構(gòu)建圖上要顯示的title信息
if len(preds)>0:
title+=",predict="+str(preds[index])
ax.set_title(title,fontsize=10)#顯示圖上的title信息
ax.set_xticks([])#不顯示坐標(biāo)
ax.set_yticks([])
index=index+1
plt.show()
#可視化預(yù)測(cè)結(jié)果
plot_images_labels_prediction(test_images,test_labels,pred_test,10,10)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-759779.html
到了這里,關(guān)于深度學(xué)習(xí)與邏輯回歸模型的融合--TensorFlow多元分類的高級(jí)應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!