[英]What make it so hard for a neural network to learn a classifier that class of x/256 is x?
我最初要做的是使用神經網絡對一些波浪數據進行分類。 在這個問題中,我的向量約為200,類別數為256。但是,損失永遠不會減少。
那么,我想,浪潮只是標簽嗎? $wave_i(x) = N(i/256.0, (1/10000)^2)$
會標記i
,N代表正態分布。
對於32或64這樣的很小的班級,NN效果很好,並且學習迅速。
但是,當我將其classes = 256
時,學習速度實在令人難以忍受,甚至根本沒有學習。
我使用的模型非常簡單。 我認為這足以記住輸入和輸出之間的關系。 (為什么?當abs(input - const) < eps
時,您可以輕松構造一個輸出1的單元。)
model = Sequential([ Dense(classes, input_dim=200), Activation('sigmoid'), Dense(classes * 2), Activation('sigmoid'), Dense(classes), Activation('softmax'), ])
然后,我將批處理大小為256的數據送入它,每個不同的標簽都出現一次。
結果是,損失達到2.xxxx
,在2500個時期后acc達到0.07
,並且在3000個時期后停止變化。 (約0.09
至0.1
)
我知道更多的變量需要更多的時間來學習。 但是,很明顯,所有單個輸出單元格都應該輕松減少它們之間的關系(我的輸入集非常不同)。
def generator():
while 1:
data = [numpy.random.normal(i/255.0,1/10000.0,225).tolist() for i in range(0, classes)]
labels = to_categorical([i for i in range(0, classes)], classes)
yield (data,labels)
當您正在輸入和輸出之間建立一種非常簡單的關系時,例如您正在探索的關系,那么這可能無法發揮神經網絡的優勢,該神經網絡足夠靈活以適合任何功能,但很少能做到完美。 當您擁有一個簡單的函數時,您可能會發現您會發現來自神經網絡的擬合缺陷,並且除神經網絡之外的其他模型會做得更好。
您可能會做一些事情以獲得更好的適應性(大致按照我嘗試的順序):
嘗試使用其他優化程序。 您沒有說要使用哪個優化器,但是Keras庫提供了一些選擇 。
當針對已標准化的輸入特征進行訓練和預測時,神經網絡可以更好地工作。 一個有效的選擇是平均值0,標准偏差1。在您的情況下,如果在培訓和測試時對每個批次進行預處理,例如: data = (data - 0.5)/0.289
,則可能會有所幫助。
增加隱藏層中神經元的數量,和/或更改激活功能。 您理想的激活函數在這里甚至可能像高斯形狀(因此單個神經元可以立即調整到每個類),但這不是您通常在NN庫中找到的。 也考慮刪除中間層,在softmax *之前的單個隱藏層中僅具有8*classes
神經元。
從生成器中的輸入示例中采樣,而不是每次都從每個類中計算一個。 生成器可能太規則了-我已經看到經典的xor
示例網絡在重復輸入相同的輸入時會以與您的描述類似的方式卡住。
*更簡單的網絡模型如下所示:
model = Sequential([
Dense(classes * 8, input_dim=200),
Activation('sigmoid'),
Dense(classes),
Activation('softmax'),
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.