1 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
不,您必須完全匹配相同的輸入形狀。
您的模型代碼(model = Sequential([...行)應(yīng)與您保存的模型完全對(duì)應(yīng),并且您的輸入數(shù)據(jù)(X行y_pred = new_model.predict(X))應(yīng)與保存的模型()中的形狀相同'Fin_weights.h5'。
您唯一能做的就是以某種方式用例如零填充新數(shù)據(jù)。但只有當(dāng)其余值對(duì)應(yīng)相同的特征或信號(hào)時(shí),這才有幫助。
例如,假設(shè)您正在訓(xùn)練 NN 來(lái)識(shí)別形狀 (2, 3) 的灰度圖像,如下所示:
1 2 3
4 5 6
然后您訓(xùn)練了模型并將其保存以供以后使用。之后,您決定將神經(jīng)網(wǎng)絡(luò)用于更小或更大尺寸的圖像,如下所示
1 2
3 4
或這個(gè)
1? 2? 3? 4
5? 6? 7? 8
9 10 11 12
而且您幾乎可以肯定,您的神經(jīng)網(wǎng)絡(luò)仍然會(huì)在不同形狀的輸入上給出良好的結(jié)果。
然后,您只需在右側(cè)填充第一個(gè)不匹配的圖像,并在右側(cè)添加額外的零,如下所示:
1 2 0
3 4 0
或另一種填充方式,在左側(cè)
0 1 2
0 3 4
第二張圖片你剪了一點(diǎn)
1? 2? 3
5? 6? 7
(或從另一邊剪掉)。
只有這樣,您才能將神經(jīng)網(wǎng)絡(luò)應(yīng)用到經(jīng)過(guò)處理的輸入圖像。
與您的情況相同,您必須添加兩個(gè)零。但僅限于編碼輸入信號(hào)或特征的序列幾乎相同的情況。
如果您的預(yù)測(cè)數(shù)據(jù)大小錯(cuò)誤,請(qǐng)執(zhí)行以下操作:
y_pred = new_model.predict(
? ? np.pad(X, ((0, 0), (0, 2)))
)
這會(huì)在右側(cè)填充您的數(shù)據(jù)的兩個(gè)零,盡管您可能希望將其填充在左側(cè)((2, 0)而不是(0, 2))或兩側(cè)((1, 1)而不是(0, 2))。
如果您保存的權(quán)重具有不同的形狀,則模型的代碼會(huì)在模型代碼中執(zhí)行此操作(更改42 --> 44):
model = Sequential([
? ? Dense(units=11, activation='relu', input_shape = (44,), kernel_regularizer=keras.regularizers.l2(0.001)),
? ? Dense(units=1, activation='sigmoid')
])
您可能應(yīng)該執(zhí)行上述兩件事,以匹配您保存的模型/權(quán)重。
如果針對(duì)44數(shù)字輸入訓(xùn)練的神經(jīng)網(wǎng)絡(luò)對(duì)于任何數(shù)據(jù)填充都會(huì)給出完全錯(cuò)誤的結(jié)果42,那么唯一的方法是重新訓(xùn)練神經(jīng)網(wǎng)絡(luò)的42輸入并再次保存模型。
但是你必須考慮到這樣一個(gè)事實(shí),input_shape = (44,)在 keras 庫(kù)中實(shí)際上意味著X輸入的最終數(shù)據(jù)model.predict(X)應(yīng)該是二維形狀(10, 44)(其中 10 是你的神經(jīng)網(wǎng)絡(luò)要識(shí)別的不同對(duì)象的數(shù)量),keras 隱藏第 0 維,即所謂的批量維度。批次(第 0 個(gè))維度實(shí)際上可能會(huì)有所不同,您可以提供 5 個(gè)對(duì)象(即 shape 數(shù)組(5, 44))或 7 個(gè)對(duì)象(形狀 (7, 44))或任何其他數(shù)量的對(duì)象。批處理僅意味著 keras 在一次調(diào)用中并行處理多個(gè)對(duì)象,只是為了快速/高效。但每個(gè)單個(gè)對(duì)象都是形狀的一維子數(shù)組(44,)。您可能誤解了數(shù)據(jù)如何輸入網(wǎng)絡(luò)并表示的一些內(nèi)容。44 不是數(shù)據(jù)集的大小(對(duì)象數(shù)量),而是單個(gè)對(duì)象的特征數(shù)量,例如,如果網(wǎng)絡(luò)識(shí)別/分類一個(gè)人,那么 44 可以表示一個(gè)人的 44 個(gè)特征,例如年齡、性別、身高、體重,出生月份,種族,膚色,每天卡路里,月收入,月支出,工資等總共1個(gè)人類對(duì)象的44個(gè)不同的固定特征。他們可能不會(huì)改變。但是,如果您獲得了一些僅具有42或36特征的其他數(shù)據(jù),而您只需要0精確地將其放置在 中缺少的特征位置44,則在右側(cè)或左側(cè)填充零是不正確的,您必須放置0s 正好位于 中缺失的那些位置44。
但是你的 44 和 42 和 36 可能意味著不同輸入對(duì)象的數(shù)量,每個(gè)對(duì)象都只有1特征。想象一個(gè)任務(wù),當(dāng)你有一個(gè)50只有兩列數(shù)據(jù)的人類數(shù)據(jù)集(表) salary,country然后你可能想要構(gòu)建猜測(cè)country到salary那時(shí)你將擁有的神經(jīng)網(wǎng)絡(luò)input_shape = (1,)(對(duì)應(yīng)于 1 個(gè)數(shù)字的一維數(shù)組 - salary),但絕對(duì)是不是input_shape = (50,)(表中的人數(shù))。input_shape只講述 1 個(gè)物體、1 個(gè)人的形狀。50 是對(duì)象(人類)的數(shù)量,它是 numpy 數(shù)組中用于預(yù)測(cè)的批量(第 0 個(gè))維度,因此您的X數(shù)組model.predict(X)的形狀為(50, 1),但input_shape = (1,)在模型中?;旧?keras 省略(隱藏)第 0 個(gè)批次維度。如果44在您的情況下,實(shí)際上意味著數(shù)據(jù)集大?。▽?duì)象數(shù)量),那么您錯(cuò)誤地訓(xùn)練了 NN,應(yīng)該使用 ,input_shape = (1,)作為44批量維度進(jìn)行重新訓(xùn)練,這44可能會(huì)根據(jù)訓(xùn)練或測(cè)試數(shù)據(jù)集的大小而有所不同。
如果您要重新訓(xùn)練您的網(wǎng)絡(luò),那么整個(gè)訓(xùn)練/評(píng)估過(guò)程的簡(jiǎn)單形式如下:
假設(shè)您有一個(gè) CSV 文件格式的數(shù)據(jù)集
data.csv
。例如,總共有 126 行和 17 列。以某種方式讀入您的數(shù)據(jù),例如通過(guò)np.loadtxt或通過(guò)pd.read_csv或通過(guò)標(biāo)準(zhǔn) python 的csv.reader()。將數(shù)據(jù)轉(zhuǎn)換為數(shù)字(浮點(diǎn)數(shù))。
按行將數(shù)據(jù)隨機(jī)分成兩部分
training
/evaluation
大約相應(yīng)的大小90%
/10%
行,例如 110 行用于訓(xùn)練,16 行用于評(píng)估(總共 126 行)。決定將預(yù)測(cè)數(shù)據(jù)中的哪些列,您可以預(yù)測(cè)任意數(shù)量的列,假設(shè)我們要預(yù)測(cè)兩列,即第 16 列和第 17 列?,F(xiàn)在,您的數(shù)據(jù)列被分為兩部分
X
(15 列,編號(hào)為 1-15)和Y
(2 列,編號(hào)為 16-17)。在網(wǎng)絡(luò)層的代碼中,第一層設(shè)置
input_shape = (15,)
(15 是 中的列數(shù)X
),Dense(2)
最后一層(2 是 中的列數(shù)Y
)。使用model.fit(X, Y, epochs = 1000, ...)方法在訓(xùn)練數(shù)據(jù)集上訓(xùn)練網(wǎng)絡(luò)。
將經(jīng)過(guò)訓(xùn)練的網(wǎng)絡(luò)保存到模型文件
model.save(...)
到net.h5
.通過(guò) 加載您的網(wǎng)絡(luò)
model.load(...)
。通過(guò) 測(cè)試網(wǎng)絡(luò)質(zhì)量
predicted_Y = model.predict(testing_X)
,與 進(jìn)行比較testing_Y
,如果網(wǎng)絡(luò)模型選擇正確,則testing_Y應(yīng)該接近predicted_Y,例如80%
正確(這個(gè)比率稱為準(zhǔn)確性)。為什么我們將數(shù)據(jù)集分成訓(xùn)練/測(cè)試部分。因?yàn)橛?xùn)練階段只看到訓(xùn)練數(shù)據(jù)集子部分。網(wǎng)絡(luò)訓(xùn)練的任務(wù)是很好地記住整個(gè)訓(xùn)練數(shù)據(jù),并通過(guò)找到
X
和之間的一些隱藏依賴關(guān)系來(lái)概括預(yù)測(cè)Y
。因此,如果調(diào)用model.predict(...)
訓(xùn)練數(shù)據(jù),應(yīng)該給出接近的100%
準(zhǔn)確性,因?yàn)榫W(wǎng)絡(luò)會(huì)看到所有這些訓(xùn)練數(shù)據(jù)并記住它。但測(cè)試數(shù)據(jù)它根本看不到,因此需要聰明并真正預(yù)測(cè)通過(guò) X 測(cè)試 Y,因此測(cè)試的準(zhǔn)確性較低,例如80%
。如果測(cè)試結(jié)果的質(zhì)量不好,您必須改進(jìn)網(wǎng)絡(luò)架構(gòu)并從頭開始重新運(yùn)行整個(gè)訓(xùn)練過(guò)程。
如果您需要預(yù)測(cè)部分?jǐn)?shù)據(jù),例如,當(dāng)您的
X
數(shù)據(jù)中只有 15 列中的 12 列時(shí),則用零填充缺失的列值,例如,如果您缺少第 7 列和第 11 列,則將零插入到第 7 列和第 11 位。這樣總列數(shù)又是 15。您的網(wǎng)絡(luò)將僅支持 model.predict() 的輸入,即訓(xùn)練時(shí)使用的列數(shù),即 15,該數(shù)字在 中提供input_shape = (15,)
。
添加回答
舉報(bào)