PaddlePaddle 極簡入門實(shí)踐八:獲取網(wǎng)絡(luò)中池化\卷積的圖像

一般情況下我們比較關(guān)心數(shù)據(jù)在經(jīng)過神經(jīng)網(wǎng)絡(luò)之后輸出的數(shù)據(jù)
那么在神經(jīng)網(wǎng)絡(luò)中的數(shù)據(jù)是什么樣子的呢晌块?

使用實(shí)驗(yàn)代碼來自http://www.reibang.com/p/df98fcc832ed

流程簡介

1、修改原神經(jīng)網(wǎng)絡(luò)分類器代碼結(jié)構(gòu)

def convolutional_neural_network(img):
    """
    定義卷積神經(jīng)網(wǎng)絡(luò)分類器:
        輸入的二維圖像笛辟,經(jīng)過兩個(gè)卷積-池化層膜楷,使用以softmax為激活函數(shù)的全連接層作為輸出層

    Return:
        predict -- 分類的結(jié)果
    """
    # 第一個(gè)卷積-池化層
    # 使用20個(gè)5*5的濾波器滋恬,池化大小為2浅乔,池化步長為2,激活函數(shù)為Relu
    conv_pool_0 = fluid.nets.simple_img_conv_pool(
        input=img,
        filter_size=5,
        num_filters=20,
        pool_size=2,
        pool_stride=2,
        act="relu")
    conv_pool_1 = fluid.layers.batch_norm(conv_pool_0)
    # 第二個(gè)卷積-池化層
    # 使用50個(gè)5*5的濾波器庶橱,池化大小為2贮勃,池化步長為2,激活函數(shù)為Relu
    conv_pool_2 = fluid.nets.simple_img_conv_pool(
        input=conv_pool_1,
        filter_size=5,
        num_filters=50,
        pool_size=2,
        pool_stride=2,
        act="relu")
    # 以softmax為激活函數(shù)的全連接輸出層苏章,輸出層的大小必須為數(shù)字的個(gè)數(shù)10
    prediction = fluid.layers.fc(input=conv_pool_2, size=10, act='softmax')
    return prediction, conv_pool_0

依舊是從PaddlePaddle-Book中拿來的
傳送門:https://github.com/PaddlePaddle/book
此處對返回值以及部分變量名進(jìn)行了修改,最重要的是多返回一個(gè)數(shù)據(jù)conv_pool_0,這個(gè)是第一次池化層的數(shù)據(jù)奏瞬。
我們可以拿這個(gè)池化層數(shù)據(jù)作為要輸出的目標(biāo)圖像
當(dāng)然枫绅,網(wǎng)絡(luò)的獲取也要從net= convolutional_neural_network(x)更改為net, conv0 = convolutional_neural_network(x),畢竟返回值變成了兩個(gè)硼端。此處的conv0將會在訓(xùn)練時(shí)放在fetch_list

2并淋、在訓(xùn)練中獲取池化層數(shù)據(jù)

#訓(xùn)練進(jìn)程
for batch_id, data in enumerate(batch_reader()):
        outs = exe.run(
            feed=feeder.feed(data),
            fetch_list=[label, avg_cost, conv0])

fetch_list=[label, avg_cost, conv0])中加入了conv0
conv0的值將會保存在out[2]中

3、對獲取的數(shù)據(jù)進(jìn)行處理

因?yàn)榻?jīng)過池化層后的數(shù)據(jù)并不是0-255范圍珍昨,但RGB圖像的顏色卻是0-255范圍县耽,如果直接拿去當(dāng)作圖片處理會報(bào)錯(cuò)的句喷。
為了盡可能保證能看得出圖像具體輪廓還得能顯示圖像,所以要對圖像的顏色進(jìn)行拉伸至0-255范圍兔毙。
首先轉(zhuǎn)成numpy類型int數(shù)據(jù)
pic0 = (outs[2][i][0] * 255).astype(int) # 取第一張圖片第一個(gè)組的濾波器過濾數(shù)據(jù)
接下來對顏色范圍拉伸處理

# 求最值
picMax = np.max(pic0) 
picMin = np.min(pic0)

# 獲取顏色拉伸后圖像
pic1 = pic0 // (picMax - picMin) * 255  # 整除會向下取整

最后將數(shù)據(jù)轉(zhuǎn)換成Pillow可以處理的格式

#轉(zhuǎn)換為PIL對象
pic = Image.fromarray(pic1.reshape(pic1.shape[-2], pic1.shape[-1]).astype('uint8'))
#展示圖像
pic.show()

輸出3個(gè)圖像測試一下


1

2

3

好像沒有想象中那么直觀....僅供參考

全部代碼

import paddle.fluid as fluid
import paddle
import numpy as np
from PIL import Image
import os

# 指定路徑
params_dirname = "./test02.inference.model"
print("訓(xùn)練后文件夾路徑" + params_dirname)
# 參數(shù)初始化
place = fluid.CUDAPlace(0)
# place=fluid.CPUPlace()
exe = fluid.Executor(place)

# 加載數(shù)據(jù)
datatype = 'float32'
with open(path + "data/ocrData.txt", 'rt') as f:
    a = f.read()


def dataReader():
    def redaer():
        for i in range(1, 1501):
            im = Image.open(path + "data/" + str(i) + ".jpg").convert('L')
            im = np.array(im).reshape(1, 30, 15).astype(np.float32)
            im = im / 255.0
            '''
            img = paddle.dataset.image.load_image(path + "data/" + str(i+1) + ".jpg")'''
            labelInfo = a[i - 1]
            yield im, labelInfo

    return redaer


def testReader():
    def redaer():
        for i in range(1501, 1951):
            im = Image.open(path + "data/" + str(i) + ".jpg").convert('L')
            im = np.array(im).reshape(1, 30, 15).astype(np.float32)
            im = im / 255.0 * 2.0 - 1.0
            '''
            img = paddle.dataset.image.load_image(path + "data/" + str(i+1) + ".jpg")
            img=np.transpose(img, (2, 0, 1))'''
            labelInfo = a[i - 1]
            yield im, labelInfo

    return redaer


# 定義網(wǎng)絡(luò)
x = fluid.layers.data(name="x", shape=[1, 30, 15], dtype=datatype)
label = fluid.layers.data(name='label', shape=[1], dtype='int64')


def convolutional_neural_network(img):
    """
    定義卷積神經(jīng)網(wǎng)絡(luò)分類器:
        輸入的二維圖像唾琼,經(jīng)過兩個(gè)卷積-池化層,使用以softmax為激活函數(shù)的全連接層作為輸出層

    Return:
        predict -- 分類的結(jié)果
    """
    # 第一個(gè)卷積-池化層
    # 使用20個(gè)5*5的濾波器澎剥,池化大小為2锡溯,池化步長為2,激活函數(shù)為Relu
    conv_pool_0 = fluid.nets.simple_img_conv_pool(
        input=img,
        filter_size=5,
        num_filters=20,
        pool_size=2,
        pool_stride=2,
        act="relu")
    conv_pool_1 = fluid.layers.batch_norm(conv_pool_0)
    # 第二個(gè)卷積-池化層
    # 使用50個(gè)5*5的濾波器哑姚,池化大小為2祭饭,池化步長為2,激活函數(shù)為Relu
    conv_pool_2 = fluid.nets.simple_img_conv_pool(
        input=conv_pool_1,
        filter_size=5,
        num_filters=50,
        pool_size=2,
        pool_stride=2,
        act="relu")
    # 以softmax為激活函數(shù)的全連接輸出層叙量,輸出層的大小必須為數(shù)字的個(gè)數(shù)10
    prediction = fluid.layers.fc(input=conv_pool_2, size=10, act='softmax')
    return prediction, conv_pool_0


net, conv0 = convolutional_neural_network(x)  # 官方的CNN
# 定義損失函數(shù)
cost = fluid.layers.cross_entropy(input=net, label=label)
avg_cost = fluid.layers.mean(cost)
acc = fluid.layers.accuracy(input=net, label=label, k=1)
# 定義優(yōu)化方法
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.01)
sgd_optimizer.minimize(avg_cost)
# 數(shù)據(jù)傳入設(shè)置
batch_reader = paddle.batch(reader=dataReader(), batch_size=1024)
testb_reader = paddle.batch(reader=testReader(), batch_size=1024)
feeder = fluid.DataFeeder(place=place, feed_list=[x, label])
prog = fluid.default_startup_program()
exe.run(prog)

trainNum = 30
for i in range(trainNum):
    for batch_id, data in enumerate(batch_reader()):
        outs = exe.run(
            feed=feeder.feed(data),
            fetch_list=[label, avg_cost, conv0])  # feed為數(shù)據(jù)表 輸入數(shù)據(jù)和標(biāo)簽數(shù)據(jù)

        # 打印輸出面板
        trainTag.add_record(i, outs[1])
        # print(str(i + 1) + "次訓(xùn)練后損失值為:" + str(outs[1]))


        if i == 0:#只輸出一次
            for ii in range(5):
                # 獲取圖像
                pic0 = (outs[2][ii][0] * 255).astype(int)  # 取第一張圖片第一個(gè)組的濾波器過濾數(shù)據(jù)
                picMax = np.max(pic0)  # 求最值
                picMin = np.min(pic0)
                # 獲取顏色拉伸后圖像
                pic1 = pic0 // (picMax - picMin) * 255  # 整除會向下取整
                '''
                #Debug
                picMax = np.max(pic)  # 求最值
                picMin = np.min(pic)
                print(str(picMax)+"-"+ str(picMin))
                '''
                # 將濾波器過慮數(shù)據(jù)轉(zhuǎn)成PIL
                pic = Image.fromarray(pic1.reshape(pic1.shape[-2], pic1.shape[-1]).astype('uint8'))



    for batch_id, data in enumerate(testb_reader()):
        test_acc, test_cost = exe.run(
            feed=feeder.feed(data),
            fetch_list=[label, avg_cost])  # feed為數(shù)據(jù)表 輸入數(shù)據(jù)和標(biāo)簽數(shù)據(jù)
        test_costs = []
        test_costs.append(test_cost[0])
        testcost = (sum(test_costs) / len(test_costs))
        testTag.add_record(i, testcost)
        # print("預(yù)測損失為:", testcost, "\n")
    pross = float(i) / trainNum
    print("當(dāng)前訓(xùn)練進(jìn)度百分比為:" + str(pross * 100)[:3].strip(".") + "%")

# 保存預(yù)測模型
path = params_dirname


def del_file(path):
    for i in os.listdir(path):
        path_file = os.path.join(path, i)
        if os.path.isfile(path_file):
            os.remove(path_file)
        else:
            del_file(path_file)


fluid.io.save_inference_model(params_dirname, ['x'], [net], exe)

print(params_dirname)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倡蝙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绞佩,更是在濱河造成了極大的恐慌寺鸥,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件征炼,死亡現(xiàn)場離奇詭異析既,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谆奥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門眼坏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酸些,你說我怎么就攤上這事宰译。” “怎么了魄懂?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵沿侈,是天一觀的道長。 經(jīng)常有香客問我市栗,道長缀拭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任填帽,我火速辦了婚禮蛛淋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篡腌。我一直安慰自己褐荷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布嘹悼。 她就那樣靜靜地躺著叛甫,像睡著了一般层宫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上其监,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天萌腿,我揣著相機(jī)與錄音,去河邊找鬼棠赛。 笑死哮奇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的睛约。 我是一名探鬼主播鼎俘,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辩涝!你這毒婦竟也來了贸伐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤怔揩,失蹤者是張志新(化名)和其女友劉穎捉邢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體商膊,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伏伐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晕拆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藐翎。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖实幕,靈堂內(nèi)的尸體忽然破棺而出吝镣,到底是詐尸還是另有隱情,我是刑警寧澤昆庇,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布末贾,位于F島的核電站,受9級特大地震影響整吆,放射性物質(zhì)發(fā)生泄漏拱撵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一表蝙、第九天 我趴在偏房一處隱蔽的房頂上張望裕膀。 院中可真熱鬧,春花似錦勇哗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抄谐。三九已至,卻和暖如春扰法,著一層夾襖步出監(jiān)牢的瞬間蛹含,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工塞颁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浦箱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓祠锣,卻偏偏與公主長得像酷窥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子伴网,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361