1 回答

TA貢獻1853條經驗 獲得超6個贊
那么什么是輸入形狀?
shape:形狀元組(整數),不包括批量大小。例如,shape=(32,) 表示預期輸入將是 32 維向量的批次。這個元組的元素可以是 None;“無”元素表示形狀未知的維度。
這是什么意思?你的輸入層keras.Input(shape=(1024,1))
說,你要輸入 1024 個一維向量向量,所以 1024 個值。正如你所理解的那樣,輸入層中有 1024 個神經元。然而,單個神經元不適用于輸入序列(即線),但可以組合來自前一層神經元的輸入及其權重或輸入的單個值。提供的每個下一個值(從序列開始)只是另一個獨立評估。然而,卷積層是特定類型的神經網絡,它使用過濾器并試圖在提供的數據中尋找模式,期望始終具有相同形狀的數據,例如相同大小的圖像或信號部分。
如果您想提供形狀不一致的數據,您有兩種選擇:
將數據分成多個批次以適合輸入形狀并選擇合理的批次大小以適合您的 RAM,但這可能會導致信息丟失,因為您的數據可能具有連續性,在拆分時會丟失
使用另一種適用于順序數據的神經網絡——循環神經網絡,例如 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
添加回答
舉報