一般情況下我們比較關(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è)圖像測試一下
好像沒有想象中那么直觀....僅供參考
全部代碼
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)