Paddle入門體驗

這段時間學習了paddle關於CV方向的一些技巧,首先paddle1.7更新成了動態圖,使用起來和Pytorch的感覺很像了,基本可以馬上遷移過來。然後是相關配套的文檔,真的非常詳細,看着demo配合文檔基本沒啥問題了。

比較nice的感覺是,體驗了paddlehub,可以快速加載預訓練模型,跟PytorchHub的效果一樣。還有paddle一看就是工程實踐出來的框架,還配備了部署和模型壓縮,體驗非常的好!

目前各大公司紛紛開源自己的深度學習框架,而百度是我國最早開始推廣和開源的,積累了很多經驗,所以可以看到未來paddle的使用人數會越來越多。

 

零.語法相關

# 1.把字符串"stage1/train/1.jpg"前面的stage1去掉
str = str.lstrip('stage1').lstrip('/') # lstrip把字符串左邊的空格或者字符刪除

# 2.numpy相關
# 初始化全零np矩陣: a = np.zeros(b.shape, dtype=np.float32)
# np矩陣中不爲零的個數: cnt = np.count_nonzero(a)
# np矩陣中不爲零的數的下標: b = np.nonzero(a)
# 多維矩陣降成一維: a.ravel(), a.flatten() # 第一返回視圖,第二個返回拷貝

# 3.zip用法:zip把可迭代對象的對應元素打包成一個個元組,返回這些元組組成的對象
# 可以節約內存,用list轉換輸出元組,*用法解壓
a = [1,2,3]
b = [4,5,6]
zipped = zip(a,b)
list(zipped)  # list() 轉換爲列表,[(1, 4), (2, 5), (3, 6)]
a1, a2 = zip(*zip(a,b)) # 相當於解壓 

# 4. enumerate(),將可遍歷對象組合爲索引序列
for idx, data enumerate(array):
    # print(idx, data[i])

# 5.展示指定目錄下所有的文件和文件夾
folders = os.listdir(path)

# 6.打開文件並以追加的形式添加
with open('./train_data.list', 'a') as f_train:
    # 'a'打開文件進行追加,如果已經存在,則指針放於末尾,沒有就創建新文件
    # 'r'只讀方式打開
    # 'w'寫入方式打開,如果已經存在,則覆蓋,否則創建新文件
    f_train.write()寫文件

一.命令行相關

# 1.解壓相關訓練數據
unzip -q -o data/data1917/train_new.zip
# 2.刪除無關文件
rm -f */.DS_Store

二.數據預處理

# 1.Json文件的讀取
import json
f = open('/home/aistudio/data/data1917/train.json',encoding='utf-8')
content = json.load(f)

# 2.高質量resize圖片
from PIL import Image
img = img.resize((640,480),Image.ANTIALIAS)

# 3.CV分類型數據:首先把文件路徑和對應的標籤寫到一個文件中,然後寫個數據讀取器
# 定義訓練集和測試集的reader
def data_mapper(sample):
    img, label = sample
    img = Image.open(img)
    img = img.resize((100, 100), Image.ANTIALIAS)
    img = np.array(img).astype('float32')
    img = img.transpose((2, 0, 1))
    img = img/255.0
    return img, label

def data_reader(data_list_path):
    def reader():
        with open(data_list_path, 'r') as f:
            lines = f.readlines()
            for line in lines:
                img, label = line.split('\t')
                yield img, int(label)
    return paddle.reader.xmap_readers(data_mapper, reader, cpu_count(), 512)

# 用於訓練的數據提供器
train_reader = paddle.batch(reader=paddle.reader.shuffle(reader=data_reader('./train_data.list'), buf_size=256), batch_size=32)
# 用於測試的數據提供器
test_reader = paddle.batch(reader=data_reader('./test_data.list'), batch_size=32) 

三.神經網絡的定義(動態圖)

# 1.定義的基本模式
class MyDNN(fluid.dygraph.Layer):
    def __init__(self):
        super(MyDNN,self).__init__()
        self.hidden1 = Linear(100, 100, act='relu')
        self.hidden2 = Linear(3*100*100, 10, act='softmax')
    def forward(self, input):
        x = self.hidden1(input)
        x = fluid.layers.reshape(x, shape=[-1, 3*100*100])
        y = self.hidden4(x)
        return y
# 繼承fluid.dygraph.Layer

四.神經網絡的訓練

# 1.使用CPU和GPU進行訓練
with fluid.dygraph.guard():
with fluid.dygraph.guard(place = fluid.CUDAPlace(0)):

# 2.流程
# 初始化參數:初始化模型,迭代次數,優化函數,進入訓練模式
# 循環訓練:np轉化fluid的變量,計算損失,計算精度,梯度清零
# 保存模型
#用動態圖進行訓練
with fluid.dygraph.guard():
    model=MyDNN() #模型實例化
    model.train() #訓練模式
    opt=fluid.optimizer.SGDOptimizer(learning_rate=0.001, parameter_list=model.parameters())#優化器選用SGD隨機梯度下降,學習率爲0.001.
    epochs_num=20 #迭代次數    
    for pass_num in range(epochs_num):
        for batch_id,data in enumerate(train_reader()):
            
            images=np.array([x[0].reshape(3,100,100) for x in data],np.float32)
            
            labels = np.array([x[1] for x in data]).astype('int64')
            labels = labels[:, np.newaxis] # 把label.shape從[1]轉化到[1,1]
            # print(images.shape)
            image=fluid.dygraph.to_variable(images)
            label=fluid.dygraph.to_variable(labels)
            predict=model(image)#預測
            # print(predict)
            loss=fluid.layers.cross_entropy(predict,label)
            avg_loss=fluid.layers.mean(loss)#獲取loss值
            
            acc=fluid.layers.accuracy(predict,label)#計算精度
            
            if batch_id!=0 and batch_id%50==0:
                print("train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num,batch_id,avg_loss.numpy(),acc.numpy()))
            
            avg_loss.backward()
            opt.minimize(avg_loss)
            model.clear_gradients()
            
    fluid.save_dygraph(model.state_dict(),'MyDNN')#保存模型

五.模型校驗

# 1.流程
# 初始化:讀取保存的模型,進入推理模式
# 校驗:np轉化fluid的變量
# 輸出精度:保存並輸出準確率
with fluid.dygraph.guard():
    accs = []
    model_dict, _ = fluid.load_dygraph('MyDNN')
    model = MyDNN()
    model.load_dict(model_dict) #加載模型參數
    model.eval() #推理模式
    for batch_id,data in enumerate(test_reader()):#測試集
        images=np.array([x[0].reshape(3,100,100) for x in data],np.float32)
        labels = np.array([x[1] for x in data]).astype('int64')
        labels = labels[:, np.newaxis]

        image=fluid.dygraph.to_variable(images)
        label=fluid.dygraph.to_variable(labels)
        
        predict=model(image)       
        acc=fluid.layers.accuracy(predict,label)
        accs.append(acc.numpy()[0])
        avg_acc = np.mean(accs)
    print(avg_acc)

六.模型預測

#讀取預測圖像,進行預測
def load_image(path):
    img = Image.open(path)
    img = img.resize((100, 100), Image.ANTIALIAS)
    img = np.array(img).astype('float32')
    img = img.transpose((2, 0, 1))
    img = img/255.0
    print(img.shape)
    return img

#構建預測動態圖過程
with fluid.dygraph.guard():
    infer_path = '手勢.JPG'
    model=MyDNN()#模型實例化
    model_dict,_=fluid.load_dygraph('MyDNN')
    model.load_dict(model_dict)#加載模型參數
    model.eval()#評估模式
    infer_img = load_image(infer_path)
    infer_img=np.array(infer_img).astype('float32')
    infer_img=infer_img[np.newaxis,:, : ,:]
    infer_img = fluid.dygraph.to_variable(infer_img)
    result=model(infer_img)
    display(Image.open('手勢.JPG'))
    print(np.argmax(result.numpy()))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章