亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

keras model.predict 中的大數據量

keras model.predict 中的大數據量

智慧大石 2023-06-06 17:32:43
我有一個 CNN,我這樣定義:inputs = keras.Input(shape=(1024,1))x=inputs# 1st convolutional blockx = keras.layers.Conv1D(16, kernel_size=(3), name='Conv_1')(x)x = keras.layers.LeakyReLU(0.1)(x)      x = keras.layers.MaxPool1D((2), name='MaxPool_1')(x)x = keras.layers.Flatten(name='Flatten')(x)# Classifierx = keras.layers.Dense(64, name='Dense_1')(x)x = keras.layers.ReLU(name='ReLU_dense_1')(x)x = keras.layers.Dropout(0.2)(x)x = keras.layers.Dense(64, name='Dense_2')(x)x = keras.layers.ReLU(name='ReLU_dense_2')(x)我在一個 google colab 會話中訓練它,然后我打開經過訓練的模型并使用 keras'model.predict(dataarr)來預測結果。問題是我希望能夠使用大量數據來進行預測,但數據保存在 .txt 文件中,這些文件變得非常大(>8GB),因此 google colab 沒有足夠的內存來打開文件并將所有數據讀取到一個數組中。處理這個問題的最佳方法是什么?我正在用 C++ 生成數據,我不是專家,但必須可以在我寫出數據時將其轉換為二進制數據,并在我讀取數據時將其轉換回來。這是一個明智的選擇嗎?或者有沒有辦法讓 keras 批量預測,假設 .txt 文件中的每組 1024 行都獨立于下一組?
查看完整描述

1 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

那么什么是輸入形狀?

shape:形狀元組(整數),不包括批量大小。例如,shape=(32,) 表示預期輸入將是 32 維向量的批次。這個元組的元素可以是 None;“無”元素表示形狀未知的維度。

這是什么意思?你的輸入層keras.Input(shape=(1024,1))說,你要輸入 1024 個一維向量向量,所以 1024 個值。正如你所理解的那樣,輸入層中有 1024 個神經元。然而,單個神經元不適用于輸入序列(即線),但可以組合來自前一層神經元的輸入及其權重或輸入的單個值。提供的每個下一個值(從序列開始)只是另一個獨立評估。然而,卷積層是特定類型的神經網絡,它使用過濾器并試圖在提供的數據中尋找模式,期望始終具有相同形狀的數據,例如相同大小的圖像或信號部分。

如果您想提供形狀不一致的數據,您有兩種選擇:

  1. 將數據分成多個批次以適合輸入形狀并選擇合理的批次大小以適合您的 RAM,但這可能會導致信息丟失,因為您的數據可能具有連續性,在拆分時會丟失

  2. 使用另一種適用于順序數據的神經網絡——循環神經網絡,例如 LSTM。這些網絡將編碼的字符/單詞/值作為單個輸入,并通過網絡處理它并部分記憶數據。LSTM 網絡廣泛用于文本分類,不需要像大多數 NN 那樣輸入靜態大小。如果您使用帶有鍵集的數據,例如自然文本、源代碼等,您還應該考慮通過哈希映射對數據進行編碼(如果還沒有這樣做的話)。您可以節省空間,并且 NN 的工作方式更直觀與數值數據。

作為旁注,如果你沒有非常強大的機器,你根本不想用如此龐大的數據訓練/測試/執行神經網絡(期望你有多個這樣大小的文件),數據訓練的時間復雜度這樣的尺寸太高了,你可能永遠無法得到訓練有素的模型。

編輯?經過OP的進一步解釋:

以上仍然適用,但在這種情況下不適用,將其保留在那里,因為它可能對其他人有幫助。

關于OPs問題,還是應該應用batch loading。RAM 不會變得更大,因此需要將數據集拆分成塊。即一次加載 100 或 1000 行不應該加載那么多 RAM - 你應該嘗試找出你的機器的限制在哪里。您可以使用以下代碼加載行:

with open("log.txt") as infile:

? ? for line in infile:

? ? ? ? do_something_with(line)

該文件將在處理后關閉,垃圾收集器將從內存中釋放行。您可以堆疊行以ndarray將它們處理到predict()方法中。batch_size如果不預測單個樣本,您還需要提供。

編輯 2:

你真正需要在這里做的是一次加載 n 行,完成它的線程。您打開文件并加載 n 個塊,例如我在示例數據中提供了我選擇的 2 個塊,您可以使用您需要的任何數字,例如 1000。

from itertools import zip_longest

import numpy as np


n = 2? # Or whatever chunk size you want

with open("file.txt", 'rb') as f:

? ? for n_lines in zip_longest(*[f]*n, fillvalue=b''):

? ? ? arr = np.char.decode(np.array(n_lines),encoding='utf_8')

? ? ? print(arr)

我在示例文件中使用的數據如下:


1dsds

2sdas

3asdsa

4asdsaad

5asdsaad

6dww

7vcvc

8uku

9kkk1

我選擇了奇數和 2 作為塊大小,所以你可以看到它附加了空數據,函數的輸出如下:


['1dsds\n' '2sdas\n']

['3asdsa\n' '4asdsaad\n']

['5asdsaad\n' '6dww\n']

['7vcvc\n' '8uku\n']

['9kkk1' '']

此代碼一次加載 2 行,然后您可以根據需要刪除換行符[s.replace('\n' , '') for s in arr]


要成功使用返回的數據,請使用yield并迭代此函數:


from itertools import zip_longest

import numpy as np


def batcher(filename: str):

? ? n = 2? # Or whatever chunk size you want

? ? with open(filename, 'rb') as f:

? ? ? ? for n_lines in zip_longest(*[f]*n, fillvalue=b''):

? ? ? ? ? #decode the loaded byte arrays to strings?

? ? ? ? ? arr = np.char.decode(np.array(n_lines),encoding='utf_8')

? ? ? ? ? yield arr.astype(np.float)

for batch_i, arr in enumerate(batcher("file.txt")):

? ? out = model.predict(arr.reshape( your_shape_comes_here ))

? ? #do what you need with the predictions


查看完整回答
反對 回復 2023-06-06
  • 1 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號