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

python生成器generator:深度學(xué)習(xí)讀取batch圖片的操作

 更新時(shí)間:2021年05月21日 08:35:47   作者:Rookiekk  
這篇文章主要介紹了python生成器generator:深度學(xué)習(xí)讀取batch圖片的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在深度學(xué)習(xí)中訓(xùn)練模型的過程中讀取圖片數(shù)據(jù),如果將圖片數(shù)據(jù)全部讀入內(nèi)存是不現(xiàn)實(shí)的,所以有必要使用生成器來讀取數(shù)據(jù)。

通過列表生成式,我們可以直接創(chuàng)建一個(gè)列表。但是,受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個(gè)包含100萬個(gè)元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個(gè)元素,那后面絕大多數(shù)元素占用的空間都白白浪費(fèi)了。

所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環(huán)的過程中不斷推算出后續(xù)的元素呢?這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator。

創(chuàng)建generator有多種方法,第一種方法很簡單

只要把一個(gè)列表生成式的[]改成(),就創(chuàng)建了一個(gè)generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

list中的元素可以直接打印出來 ,generator要一個(gè)一個(gè)打印出來,

可以通過next()函數(shù)獲得generator的下一個(gè)返回值:

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16

generator保存的是算法,每次調(diào)用next(g),就計(jì)算出g的下一個(gè)元素的值,直到計(jì)算到最后一個(gè)元素,沒有更多的元素時(shí),拋出StopIteration的錯(cuò)誤。

上面這種不斷調(diào)用next(g)實(shí)在是太變態(tài)了

正確的方法是使用for循環(huán),因?yàn)間enerator也是可迭代對象:

>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)

著名的斐波拉契數(shù)列(Fibonacci),除第一個(gè)和第二個(gè)數(shù)外,任意一個(gè)數(shù)都可由前兩個(gè)數(shù)相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

斐波拉契數(shù)列用列表生成式寫不出來

但是,用函數(shù)把它打印出來卻很容易:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'

仔細(xì)觀察,可以看出,fib函數(shù)實(shí)際上是定義了斐波拉契數(shù)列的推算規(guī)則,可以從第一個(gè)元素開始,推算出后續(xù)任意的元素,這種邏輯其實(shí)非常類似generator。

也就是說,上面的函數(shù)和generator僅一步之遙。要把fib函數(shù)變成generator,只需要把print(b)改為yield b就可以了:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

這就是定義generator的另一種方法。如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)generator:

>>> f = fib(6)
>>> f
<generator object fib at 0x104feaaa0>

這里,最難理解的就是generator和函數(shù)的執(zhí)行流程不一樣。函數(shù)是順序執(zhí)行,遇到return語句或者最后一行函數(shù)語句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時(shí)從上次返回的yield語句處繼續(xù)執(zhí)行。

在循環(huán)過程中不斷調(diào)用yield,就會不斷中斷。當(dāng)然要給循環(huán)設(shè)置一個(gè)條件來退出循環(huán),不然就會產(chǎn)生一個(gè)無限數(shù)列出來。

同樣的,把函數(shù)改成generator后,我們基本上從來不會用next()來獲取下一個(gè)返回值,而是直接使用for循環(huán)來迭代:

>>> for n in fib(6):
...     print(n)
...

最后在讀取圖片的實(shí)際應(yīng)用中的代碼如下:

def train_data(train_file,batch_size,resize_shape):
    datas, labels = read_data(train_file)
    num_batch = len(datas)//batch_size
    for i in range(num_batch):
        imgs = []
        train_datas = datas[batch_size*i:batch_size*(i+1)]
        train_lables = labels[batch_size*i:batch_size*(i+1)]
        for img_path in train_datas:
            img = cv2.imread(img_path)
            img = cv2.resize(img,resize_shape)
            img = img/255 #歸一化處理
            imgs.append(img)
        yield np.array(imgs),np.array(train_lables)

補(bǔ)充:深度學(xué)習(xí)算法--fit_generator()函數(shù)使用

如果我們數(shù)據(jù)量很大,那么是不可能將所有數(shù)據(jù)載入內(nèi)存的,必將導(dǎo)致內(nèi)存泄漏,

這時(shí)候我們可以用fit_generator函數(shù)來進(jìn)行訓(xùn)練

from keras.datasets import imdb
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras import layers
import numpy as np
import random
from sklearn.metrics import f1_score, accuracy_score

max_features = 100
maxlen = 50
batch_size = 320
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
x_train = pad_sequences(x_train, maxlen=maxlen)
x_test = pad_sequences(x_test, maxlen=maxlen)

def generator():
    while 1:
        row = np.random.randint(0, len(x_train), size=batch_size)
        x = np.zeros((batch_size, x_train.shape[-1]))
        y = np.zeros((batch_size,))
        x = x_train[row]
        y = y_train[row]
        yield x, y

# generator()
model = Sequential()
model.add(layers.Embedding(max_features, 32, input_length=maxlen))
model.add(layers.GRU(64, return_sequences=True))
model.add(layers.GRU(32))
# model.add(layers.Flatten())
# model.add(layers.Dense(32,activation='relu'))

model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
print(model.summary())

# history = model.fit(x_train, y_train, epochs=1,batch_size=32, validation_split=0.2)
# Keras中的fit()函數(shù)傳入的x_train和y_train是被完整的加載進(jìn)內(nèi)存的,當(dāng)然用起來很方便,但是如果我們數(shù)據(jù)量很大,
# 那么是不可能將所有數(shù)據(jù)載入內(nèi)存的,必將導(dǎo)致內(nèi)存泄漏,這時(shí)候我們可以用fit_generator函數(shù)來進(jìn)行訓(xùn)練。
# fit_generator函數(shù)必須傳入一個(gè)生成器,我們的訓(xùn)練數(shù)據(jù)也是通過生成器產(chǎn)生的
history = model.fit_generator(generator(), epochs=1, steps_per_epoch=len(x_train) // (batch_size))

print(model.evaluate(x_test, y_test))
y = model.predict_classes(x_test)
print(accuracy_score(y_test, y))

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Python開發(fā)Office文檔圖片提取器

    基于Python開發(fā)Office文檔圖片提取器

    這篇文章主要為大家詳細(xì)介紹了一個(gè)基于PyQt5開發(fā)的桌面應(yīng)用,可以實(shí)現(xiàn)Office文檔圖片提取功能,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2025-01-01
  • Django操作session 的方法

    Django操作session 的方法

    這篇文章主要介紹了Django操作session 的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python3基礎(chǔ)之list列表實(shí)例解析

    Python3基礎(chǔ)之list列表實(shí)例解析

    這篇文章主要介紹了Python3的list列表用法,這是Python3數(shù)據(jù)類型中非常常見的應(yīng)用,需要的朋友可以參考下
    2014-08-08
  • Python中print()函數(shù)使用實(shí)例詳解

    Python中print()函數(shù)使用實(shí)例詳解

    Python的print()函數(shù)可以打印輸出,常用來將內(nèi)容打印到控制臺,print()是python中最常見的一個(gè)函數(shù),本文就通過一些實(shí)例來給大家講講如何使用print()函數(shù),需要的朋友可以參考下
    2023-07-07
  • Pytest測試報(bào)告工具Allure的高級用法

    Pytest測試報(bào)告工具Allure的高級用法

    這篇文章介紹了Pytest測試報(bào)告工具Allure的高級用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Python實(shí)現(xiàn)一個(gè)簡單的QQ截圖

    Python實(shí)現(xiàn)一個(gè)簡單的QQ截圖

    大家好,本篇文章主要講的是Python實(shí)現(xiàn)一個(gè)簡單的QQ截圖,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下的相關(guān)資料
    2022-02-02
  • 中秋快到了利用python畫個(gè)月亮和月餅

    中秋快到了利用python畫個(gè)月亮和月餅

    眼看中秋又快到了,今天小編就利用python畫出月亮和月餅,感興趣的小伙伴一定要收藏起來送給遠(yuǎn)方的朋友呀
    2021-09-09
  • Python中CSV文件(逗號分割)實(shí)戰(zhàn)操作指南

    Python中CSV文件(逗號分割)實(shí)戰(zhàn)操作指南

    CSV文件默認(rèn)以英文逗號做為列分隔符,換行符作為行分隔符,下面這篇文章主要給大家介紹了關(guān)于Python中CSV文件(逗號分割)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 對Python中內(nèi)置異常層次結(jié)構(gòu)詳解

    對Python中內(nèi)置異常層次結(jié)構(gòu)詳解

    今天小編就為大家分享一篇對Python中內(nèi)置異常層次結(jié)構(gòu)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python注釋、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、偽“選擇結(jié)構(gòu)”用法實(shí)例分析

    Python注釋、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、偽“選擇結(jié)構(gòu)”用法實(shí)例分析

    這篇文章主要介紹了Python注釋、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、偽“選擇結(jié)構(gòu)”用法,結(jié)合實(shí)例形式分析了Python注釋、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、偽“選擇結(jié)構(gòu)”相關(guān)功能、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01

最新評論

水富县| 湟中县| 两当县| 信宜市| 根河市| 胶州市| 南漳县| 光山县| 郓城县| 江北区| 攀枝花市| 红桥区| 凌源市| 察哈| 澎湖县| 天峨县| 顺昌县| 莆田市| 河津市| 陕西省| 金门县| 台湾省| 新津县| 香河县| 淅川县| 莎车县| 寿宁县| 白水县| 泰州市| 师宗县| 新巴尔虎右旗| 扶余县| 永新县| 宜川县| 青冈县| 秀山| 福安市| 大余县| 武汉市| 赫章县| 林芝县|