谷歌colab運行paddlepaddle之手寫數字識別


之前在colab上成功安裝好了paddlepaddle,現在記錄下手寫數字識別,按照百度官網的代碼,先記錄下來以后再看。

#導入需要的包
import numpy as np
import paddle as paddle
import paddle.fluid as fluid
from PIL import Image
import matplotlib.pyplot as plt
import os
BUF_SIZE=512
BATCH_SIZE=128
#用於訓練的數據提供器,每次從緩存中隨機讀取批次大小的數據
train_reader = paddle.batch(
    paddle.reader.shuffle(paddle.dataset.mnist.train(),
                          buf_size=BUF_SIZE),
    batch_size=BATCH_SIZE)
#用於訓練的數據提供器,每次從緩存中隨機讀取批次大小的數據
test_reader = paddle.batch(
    paddle.reader.shuffle(paddle.dataset.mnist.test(),
                          buf_size=BUF_SIZE),
    batch_size=BATCH_SIZE)
    
#用於打印,查看mnist數據
train_data=paddle.dataset.mnist.train();
sampledata=next(train_data())
print(sampledata)
# 定義多層感知器 
def multilayer_perceptron(input): 
    # 第一個全連接層,激活函數為ReLU 
    hidden1 = fluid.layers.fc(input=input, size=100, act='relu') 
    # 第二個全連接層,激活函數為ReLU 
    hidden2 = fluid.layers.fc(input=hidden1, size=100, act='relu') 
    # 以softmax為激活函數的全連接輸出層,輸出層的大小必須為數字的個數10 
    prediction = fluid.layers.fc(input=hidden2, size=10, act='softmax') 
    return prediction 
# 輸入的原始圖像數據,大小為1*28*28
image = fluid.layers.data(name='image', shape=[1, 28, 28], dtype='float32')#單通道,28*28像素值
# 標簽,名稱為label,對應輸入圖片的類別標簽
label = fluid.layers.data(name='label', shape=[1], dtype='int64')          #圖片標簽
# 獲取分類器
predict = multilayer_perceptron(image)
#使用交叉熵損失函數,描述真實樣本標簽和預測概率之間的差值
cost = fluid.layers.cross_entropy(input=predict, label=label)  
# 使用類交叉熵函數計算predict和label之間的損失函數
avg_cost = fluid.layers.mean(cost)
# 計算分類准確率
acc = fluid.layers.accuracy(input=predict, label=label)
#使用Adam算法進行優化, learning_rate 是學習率(它的大小與網絡的訓練收斂速度有關系)
optimizer = fluid.optimizer.AdamOptimizer(learning_rate=0.001)  
opts = optimizer.minimize(avg_cost)
# 定義使用CPU還是GPU,使用CPU時use_cuda = False,使用GPU時use_cuda = True
use_cuda = True
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
# 獲取測試程序
test_program = fluid.default_main_program().clone(for_test=True)
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
feeder = fluid.DataFeeder(place=place, feed_list=[image, label])
all_train_iter=0
all_train_iters=[]
all_train_costs=[]
all_train_accs=[]

def draw_train_process(title,iters,costs,accs,label_cost,lable_acc):
    plt.title(title, fontsize=24)
    plt.xlabel("iter", fontsize=20)
    plt.ylabel("cost/acc", fontsize=20)
    plt.plot(iters, costs,color='red',label=label_cost) 
    plt.plot(iters, accs,color='green',label=lable_acc) 
    plt.legend()
    plt.grid()
    plt.show()
EPOCH_NUM=2
model_save_dir = "/content/drive/My Drive/pdpd/hand.inference.model"
for pass_id in range(EPOCH_NUM):
    # 進行訓練
    for batch_id, data in enumerate(train_reader()):                         #遍歷train_reader
        train_cost, train_acc = exe.run(program=fluid.default_main_program(),#運行主程序
                                        feed=feeder.feed(data),              #給模型喂入數據
                                        fetch_list=[avg_cost, acc])          #fetch 誤差、准確率  
        
        all_train_iter=all_train_iter+BATCH_SIZE
        all_train_iters.append(all_train_iter)
        
        all_train_costs.append(train_cost[0])
        all_train_accs.append(train_acc[0])
        
        # 每200個batch打印一次信息  誤差、准確率
        if batch_id % 200 == 0:
            print('Pass:%d, Batch:%d, Cost:%0.5f, Accuracy:%0.5f' %
                  (pass_id, batch_id, train_cost[0], train_acc[0]))

    # 進行測試
    test_accs = []
    test_costs = []
    #每訓練一輪 進行一次測試
    for batch_id, data in enumerate(test_reader()):                         #遍歷test_reader
        test_cost, test_acc = exe.run(program=test_program, #執行訓練程序
                                      feed=feeder.feed(data),               #喂入數據
                                      fetch_list=[avg_cost, acc])           #fetch 誤差、准確率
        test_accs.append(test_acc[0])                                       #每個batch的准確率
        test_costs.append(test_cost[0])                                     #每個batch的誤差
        
       
    # 求測試結果的平均值
    test_cost = (sum(test_costs) / len(test_costs))                         #每輪的平均誤差
    test_acc = (sum(test_accs) / len(test_accs))                            #每輪的平均准確率
    print('Test:%d, Cost:%0.5f, Accuracy:%0.5f' % (pass_id, test_cost, test_acc))
    
    #保存模型
    # 如果保存路徑不存在就創建
if not os.path.exists(model_save_dir):
    os.makedirs(model_save_dir)
print ('save models to %s' % (model_save_dir))
fluid.io.save_inference_model(model_save_dir,   #保存推理model的路徑
                                  ['image'],    #推理(inference)需要 feed 的數據
                                  [predict],    #保存推理(inference)結果的 Variables
                                  exe)             #executor 保存 inference model

print('訓練模型保存完成!')
draw_train_process("training",all_train_iters,all_train_costs,all_train_accs,"trainning cost","trainning acc")
Pass:0, Batch:0, Cost:2.68999, Accuracy:0.09375
Pass:0, Batch:200, Cost:0.39746, Accuracy:0.87500
Pass:0, Batch:400, Cost:0.18917, Accuracy:0.95312
Test:0, Cost:0.22934, Accuracy:0.93167
Pass:1, Batch:0, Cost:0.24291, Accuracy:0.92969
Pass:1, Batch:200, Cost:0.21380, Accuracy:0.95312
Pass:1, Batch:400, Cost:0.17054, Accuracy:0.95312
Test:1, Cost:0.16143, Accuracy:0.94887
save models to /content/drive/My Drive/pdpd/hand.inference.model
訓練模型保存完成!

def load_image(file):
    im = Image.open(file).convert('L')                        #將RGB轉化為灰度圖像,L代表灰度圖像,像素值在0~255之間
    im = im.resize((28, 28), Image.ANTIALIAS)                 #resize image with high-quality 圖像大小為28*28
    im = np.array(im).reshape(1, 1, 28, 28).astype(np.float32)#返回新形狀的數組,把它變成一個 numpy 數組以匹配數據饋送格式。
    # print(im)
    im = im / 255.0 * 2.0 - 1.0                               #歸一化到【-1~1】之間
    return im
infer_path='/content/drive/My Drive/pdpd/digit.jpg'
img = Image.open(infer_path)
plt.imshow(img)   #根據數組繪制圖像
plt.show()        #顯示圖像

infer_exe = fluid.Executor(place)
inference_scope = fluid.core.Scope()
# 加載數據並開始預測
with fluid.scope_guard(inference_scope):
    #獲取訓練好的模型
    #從指定目錄中加載 推理model(inference model)
    [inference_program,                                            #推理Program
     feed_target_names,                                            #是一個str列表,它包含需要在推理 Program 中提供數據的變量的名稱。 
     fetch_targets] = fluid.io.load_inference_model(model_save_dir,#fetch_targets:是一個 Variable 列表,從中我們可以得到推斷結果。model_save_dir:模型保存的路徑
                                                    infer_exe)     #infer_exe: 運行 inference model的 executor
    img = load_image(infer_path)

    results = infer_exe.run(program=inference_program,               #運行推測程序
                   feed={feed_target_names[0]: img},           #喂入要預測的img
                   fetch_list=fetch_targets)                   #得到推測結果,  
    # 獲取概率最大的label
    lab = np.argsort(results)                                  #argsort函數返回的是result數組值從小到大的索引值
    #print(lab)
    print("該圖片的預測結果的label為: %d" % lab[0][0][-1])     #-1代表讀取數組中倒數第一列  

該圖片的預測結果的label為: 5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM