最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

tensorflow下的圖片標(biāo)準(zhǔn)化函數(shù)per_image_standardization用法

 更新時(shí)間:2020年06月30日 14:19:52   作者:仙界天堂  
這篇文章主要介紹了tensorflow下的圖片標(biāo)準(zhǔn)化函數(shù)per_image_standardization用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

實(shí)驗(yàn)環(huán)境:windows 7,anaconda 3(Python 3.5),tensorflow(gpu/cpu)

函數(shù)介紹:標(biāo)準(zhǔn)化處理可以使得不同的特征具有相同的尺度(Scale)。

這樣,在使用梯度下降法學(xué)習(xí)參數(shù)的時(shí)候,不同特征對(duì)參數(shù)的影響程度就一樣了。

tf.image.per_image_standardization(image),此函數(shù)的運(yùn)算過(guò)程是將整幅圖片標(biāo)準(zhǔn)化(不是歸一化),加速神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。

主要有如下操作,(x - mean) / adjusted_stddev,其中x為圖片的RGB三通道像素值,mean分別為三通道像素的均值,adjusted_stddev = max(stddev, 1.0/sqrt(image.NumElements()))。

stddev為三通道像素的標(biāo)準(zhǔn)差,image.NumElements()計(jì)算的是三通道各自的像素個(gè)數(shù)。

實(shí)驗(yàn)代碼:

import tensorflow as tf
import matplotlib.image as img
import matplotlib.pyplot as plt
import numpy as np
sess = tf.InteractiveSession()
image = img.imread('D:/Documents/Pictures/logo7.jpg')
shape = tf.shape(image).eval()
h,w = shape[0],shape[1]
standardization_image = tf.image.per_image_standardization(image)#標(biāo)準(zhǔn)化

fig = plt.figure()
fig1 = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('orginal image')
ax.imshow(image)
ax1 = fig1.add_subplot(311)
ax1.set_title('original hist')
ax1.hist(sess.run(tf.reshape(image,[h*w,-1])))
ax1 = fig1.add_subplot(313)
ax1.set_title('standardization hist')
ax1.hist(sess.run(tf.reshape(standardization_image,[h*w,-1])))
plt.ion()
plt.show()

實(shí)驗(yàn)結(jié)果:

兩幅hist圖分別是原圖和標(biāo)準(zhǔn)化后的RGB的像素值分布圖,可以看到只是將圖片的像素值大小限定到一個(gè)范圍,但是像素值的分布為改變。

補(bǔ)充知識(shí):tensorflow運(yùn)行單張圖像與加載模型時(shí)注意的問(wèn)題

關(guān)于模型的保存加載:

在做實(shí)驗(yàn)的情況下,一般使用save函數(shù)與restore函數(shù)就足夠用,該剛發(fā)只加載模型的參數(shù)而不加載模型,這意味著

當(dāng)前的程序要能找到模型的結(jié)構(gòu)

saver = tf.train.Saver()#聲明saver用來(lái)保存模型
with tf.Session() as sess:
 for i in range(train_step):
 #.....訓(xùn)練操作
 if i%100 == 0 && i!= 0:#每間隔訓(xùn)練100次存儲(chǔ)一個(gè)模型,默認(rèn)最多能存5個(gè),如果超過(guò)5個(gè)先將序號(hào)小的覆蓋掉
  saver.save(sess,str(i)+"_"+'model.ckpt',global_step=i)

得到的文件如下:

在一個(gè)文件夾中,會(huì)有一個(gè)checkpoint文件,以及一系列不同訓(xùn)練階段的模型文件,如下圖

ckeckpoint文件可以放在編輯器里面打開看,里面記錄的是每個(gè)階段保存模型的信息,同時(shí)也是記錄最近訓(xùn)練的檢查點(diǎn)

ckpt文件是模型參數(shù),index文件一般用不到(我也查到是啥-_-|||)

在讀取模型時(shí),聲明一個(gè)saver調(diào)用restore函數(shù)即可,我看很多博客里面寫的都是添加最近檢查點(diǎn)的模型,這樣添加的模型都是最后一次訓(xùn)練的結(jié)果,想要加載固定的模型,直接把模型參數(shù)名稱的字符串寫到參數(shù)里就行了,如下段程序

saver = tf.train.Saver()
with tf.Session() as sess:
 saver.restore(sess, "step_1497batch_64model.ckpt-1497")#加載對(duì)應(yīng)的參數(shù)

這樣就把參數(shù)加載到Session當(dāng)中,如果有數(shù)據(jù),就可以直接塞進(jìn)來(lái)進(jìn)行計(jì)算了

運(yùn)行單張圖片:

運(yùn)行單張圖像的方法的流程大致如下,首先使用opencv或者Image或者使用numpy將圖像讀進(jìn)來(lái),保存成numpy的array的格式

接下來(lái)可以對(duì)圖像使用opencv進(jìn)行預(yù)處理。然后將處理后的array使用feed_dict的方式輸入到tensorflow的placeholder中,這里注意兩點(diǎn),不要單獨(dú)的使用下面的方法將tensor轉(zhuǎn)換成numpy再進(jìn)行處理,除非是想查看一下圖像輸出,否則在驗(yàn)證階段,強(qiáng)烈不要求這樣做,盡量使用feed_dict,原因后面說(shuō)明

numpy_img = sess.run(tensor_img)#將tensor轉(zhuǎn)換成numpy

這里注意一點(diǎn),如果你的圖像是1通道的圖像,即灰度圖,那么你得到的numpy是一個(gè)二維矩陣,將使用opencv讀入的圖像輸出shape會(huì)得到如(424,512)這樣的形狀,分別表示行和列,但是在模型當(dāng)中通常要要有batch和通道數(shù),所以需要將圖像使用python opencv庫(kù)中的reshape函數(shù)轉(zhuǎn)換成四維的矩陣,如

cv_img = cv_img.reshape(1,cv_img.shape[0],cv_img.shape[1],1)#cv_img是使用Opencv讀進(jìn)來(lái)的圖片

用來(lái)輸入到網(wǎng)絡(luò)中的placeholder設(shè)置為如下,即可進(jìn)行輸入了

img_raw = tf.placeholder(dtype=tf.float32, shape=[1,512, 424, 1], name='input')

測(cè)試:

如果使用的是自己的數(shù)據(jù)集,通常是制作成tfrecords,在訓(xùn)練和測(cè)試的過(guò)程中,需要讀取tfrecords文件,這里注意,千萬(wàn)不要把讀取tfrecords文件的函數(shù)放到循環(huán)當(dāng)中,而是把這個(gè)文件放到外面,否則你訓(xùn)練或者測(cè)試的數(shù)據(jù)都是同一批,Loss會(huì)固定在一個(gè)值!

這是因?yàn)閠frecords在讀取的過(guò)程中是將圖像信息加入到一個(gè)隊(duì)列中進(jìn)行讀取,不要當(dāng)成普通的函數(shù)調(diào)用,要按照tensorflow的思路,將它看成一個(gè)節(jié)點(diǎn)!

def read_data(tfrecords_file, batch_size, image_size):#讀取tfrecords文件
 filename_queue = tf.train.string_input_producer([tfrecords_file])
 reader = tf.TFRecordReader()
 _, serialized_example = reader.read(filename_queue)
 
 img_features = tf.parse_single_example(
  serialized_example,
 features={
 'label': tf.FixedLenFeature([], tf.int64),
 'image_raw': tf.FixedLenFeature([], tf.string),
  })
 image = tf.decode_raw(img_features['image_raw'], tf.float32)
 min_after_dequeue = 1000
 image = tf.reshape(image, [image_size, image_size,1])
 image = tf.image.resize_images(image, (32,32),method=3)#縮放成32×32
 image = tf.image.per_image_standardization(image)#圖像標(biāo)準(zhǔn)化
 label = tf.cast(img_features['label'], tf.int32)  
 capacity = min_after_dequeue + 3 * batch_size  
 image_batch, label_batch = tf.train.shuffle_batch([image, label],
       min_after_dequeue = min_after_dequeue)
 return image_batch, tf.one_hot(label_batch,6)#返回的標(biāo)簽經(jīng)過(guò)one_hot編碼

#將得到的圖像數(shù)據(jù)與標(biāo)簽都是tensor哦,不能輸出的!
read_image_batch,read_label_batch = read_data('train_data\\tfrecord\\TrainC6_95972.tfrecords',batch_size,120)

回到在運(yùn)行單張圖片的那個(gè)問(wèn)題,直接對(duì)某個(gè)tensor進(jìn)行sess.run()會(huì)得到圖計(jì)算后的類型,也就是咱們python中常見的類型。

使用sess.run(feed_dict={…})得到的計(jì)算結(jié)果和直接使用sess.run有什么不同呢?

可以使用一個(gè)循環(huán)實(shí)驗(yàn)一下,在循環(huán)中不停的調(diào)用sess.run()相當(dāng)于每次都向圖中添加節(jié)點(diǎn),而使用sess.run(feed_dict={})是向圖中開始的位置添加數(shù)據(jù)!

結(jié)果會(huì)發(fā)現(xiàn),直接使用sess.run()的運(yùn)行會(huì)越來(lái)越慢,使用sess.run(feed_dict={})會(huì)運(yùn)行的飛快!

為什么要提這個(gè)呢?

在上面的read_data中有這么三行函數(shù)

image = tf.reshape(image, [image_size, image_size,1])#與opencv的reshape結(jié)果一樣
image = tf.image.resize_images(image, (32,32),method=3)#縮放成32×32,與opencv的resize結(jié)果一樣,插值方法要選擇三次立方插值
image = tf.image.per_image_standardization(image)#圖像標(biāo)準(zhǔn)化

如果想要在將訓(xùn)練好的模型作為網(wǎng)絡(luò)節(jié)點(diǎn)添加到系統(tǒng)中,得到的數(shù)據(jù)必須是經(jīng)過(guò)與訓(xùn)練數(shù)據(jù)經(jīng)過(guò)相同處理的圖像,也就是必須要對(duì)原始圖像經(jīng)過(guò)上面的處理。如果使用其他的庫(kù)容易造成結(jié)果對(duì)不上,最好使用與訓(xùn)練數(shù)據(jù)處理時(shí)相同的函數(shù)。

如果使用將上面的函數(shù)當(dāng)成普通的函數(shù)使用,得到的是一個(gè)tensor,沒(méi)有辦法進(jìn)行其他的圖像預(yù)處理,需要先將tensor變成numpy類型,問(wèn)題來(lái)了,想要變成numpy類型,就得調(diào)用sess.run(),如果模型作為接口死循環(huán),那么就會(huì)一直使用sess.run,效率會(huì)越來(lái)越慢,最后卡死!

原因在于你沒(méi)有將tensorflow中的函數(shù)當(dāng)成節(jié)點(diǎn)調(diào)用,而是將其當(dāng)成普通的函數(shù)調(diào)用了!

解決辦法就是按部就班的來(lái),將得到的numpy數(shù)據(jù)先提前處理好,然后使用sess.run(feed_dict)輸入到placeholder中,按照?qǐng)D的順序一步一步運(yùn)行即可!

如下面程序

with tf.name_scope('inputs'):
 img_raw = tf.placeholder(dtype=tf.float32, shape=[1,120, 120, 1], name='input')#輸入數(shù)據(jù)
 keep_prob = tf.placeholder(tf.float32,name='keep_prob')

with tf.name_scope('preprocess'):#圖中的預(yù)處理函數(shù),當(dāng)成節(jié)點(diǎn)順序調(diào)用
 img_120 = tf.reshape(img_raw, [120, 120,1])
 img_norm = tf.cast(img_120, "float32") / 256
 img_32 = tf.image.resize_images(img_norm, (32,32),method=3)
 img_std = tf.image.per_image_standardization(img_32)
 img = tf.reshape(img_std, [1,32, 32,1])

with tf.name_scope('output'):#圖像塞到網(wǎng)絡(luò)中
 output = MyNet(img,keep_prob,n_cls)

ans = tf.argmax(tf.nn.softmax(output),1)#計(jì)算模型得到的結(jié)果

init = tf.global_variables_initializer()

saver = tf.train.Saver()


if __name__ == '__main__':

 with tf.Session() as sess:

 sess.run(init)
 saver.restore(sess, "step_1497batch_64model.ckpt-1497")#效果更好
 index = 0
 path = "buffer\\"
 
 while True:
  f = path + str(index)+'.jpg'#從0.jpg、1.jpg、2.jpg.....一直讀
  if os.path.exists(f):
  cv_img = cv.imread(f,0)
  cv_img = OneImgPrepro(cv_img)
  cv_img = cv_img.reshape(1,cv_img.shape[0],cv_img.shape[1],1)#需要reshape成placeholder可接收型
  clas = ans.eval(feed_dict={img_raw:cv_img,keep_prob:1})#feed的速度快!

  print(clas)#輸出分類
  
  index += 1

以上這篇tensorflow下的圖片標(biāo)準(zhǔn)化函數(shù)per_image_standardization用法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Pytorch基礎(chǔ)教程之torchserve模型部署解析

    Pytorch基礎(chǔ)教程之torchserve模型部署解析

    torchserve是基于netty網(wǎng)絡(luò)框架實(shí)現(xiàn)的,底層使用EpollServerSocketChannel服務(wù)進(jìn)行網(wǎng)絡(luò)通信,通過(guò)epoll多路復(fù)用技術(shù)實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)連接處理,這篇文章主要介紹了Pytorch基礎(chǔ)教程之torchserve模型部署和推理,需要的朋友可以參考下
    2023-07-07
  • PyInstaller將Python腳本打包為.exe可執(zhí)行文件的步驟詳解

    PyInstaller將Python腳本打包為.exe可執(zhí)行文件的步驟詳解

    Python是一門強(qiáng)大而靈活的編程語(yǔ)言,為了方便共享和部署,我們可以將 Python 腳本打包為可執(zhí)行文件(.exe),這樣其他用戶就無(wú)需安裝 Python環(huán)境,直接運(yùn)行可執(zhí)行文件即可,本文將介紹如何使用PyInstaller 工具實(shí)現(xiàn)這一目標(biāo),需要的朋友可以參考下
    2023-12-12
  • 利用Python檢測(cè)URL狀態(tài)

    利用Python檢測(cè)URL狀態(tài)

    最近小編接到這樣的需求,Python檢測(cè)URL狀態(tài),并追加保存200的URL。接下來(lái)通過(guò)實(shí)例代碼給大家分析講解,需要的朋友跟隨小編一起看看吧
    2019-07-07
  • Python中的通函數(shù)numpy.ufunc詳解

    Python中的通函數(shù)numpy.ufunc詳解

    這篇文章主要介紹了什么是通函數(shù)numpy.ufunc,簡(jiǎn)單說(shuō)就是numpy的函數(shù),因?yàn)閚umpy針對(duì)的是數(shù)組張量,因此,幾乎每一個(gè)函數(shù)都是ufunc。本文針對(duì)ufunc的屬性進(jìn)行研究,需要的朋友可以參考下
    2023-04-04
  • python腳本生成caffe train_list.txt的方法

    python腳本生成caffe train_list.txt的方法

    下面小編就為大家分享一篇python腳本生成caffe train_list.txt的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python requests獲取網(wǎng)頁(yè)常用方法解析

    Python requests獲取網(wǎng)頁(yè)常用方法解析

    這篇文章主要介紹了Python requests獲取網(wǎng)頁(yè)常用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 聊聊python中not 與 is None的區(qū)別

    聊聊python中not 與 is None的區(qū)別

    這篇文章主要介紹了在python中not 與 is None的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • OpenCV學(xué)習(xí)之圖像的分割與修復(fù)詳解

    OpenCV學(xué)習(xí)之圖像的分割與修復(fù)詳解

    圖像分割本質(zhì)就是將前景目標(biāo)從背景中分離出來(lái)。在當(dāng)前的實(shí)際項(xiàng)目中,應(yīng)用傳統(tǒng)分割的并不多,大多是采用深度學(xué)習(xí)的方法以達(dá)到更好的效果。本文將詳細(xì)介紹一下OpenCV中的圖像分割與修復(fù),需要的可以參考一下
    2022-01-01
  • python 轉(zhuǎn)換 Javascript %u 字符串為python unicode的代碼

    python 轉(zhuǎn)換 Javascript %u 字符串為python unicode的代碼

    這篇文章主要介紹了python 轉(zhuǎn)換 Javascript %u 字符串為python unicode的代碼,需要的朋友可以參考下
    2016-09-09
  • pycharm進(jìn)行Git關(guān)聯(lián)和取消方式

    pycharm進(jìn)行Git關(guān)聯(lián)和取消方式

    這篇文章主要介紹了pycharm進(jìn)行Git關(guān)聯(lián)和取消方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論

平遥县| 庄浪县| 新野县| 大洼县| 广饶县| 二连浩特市| 镇原县| 桃源县| 突泉县| 青冈县| 潼南县| 小金县| 驻马店市| 靖安县| 兴海县| 兴安县| 崇阳县| 彭山县| 南郑县| 建湖县| 沭阳县| 建阳市| 芒康县| 扶余县| 七台河市| 武功县| 哈尔滨市| 吴江市| 襄樊市| 本溪| 庐江县| 泰州市| 咸丰县| 东阿县| 凯里市| 永德县| 宜宾县| 左权县| 贵溪市| 永宁县| 博爱县|