2017-10-09 69 views
0

我正在嘗試與Keras進行機器學習。Keras:精度保持爲零

我不是數學家,我只有如何神經網絡,作品的一個基本的瞭解(哈哈明白了嗎?),這樣下去容易在我身上。

這是我當前的代碼:

from keras.utils import plot_model 
from keras.models import Sequential 
from keras.layers import Dense 
from keras import optimizers 
import numpy 

# fix random seed for reproducibility 
numpy.random.seed(7) 

# split into input (X) and output (Y) variables 
X = [] 
Y = [] 
count = 0 

while count < 10000: 
    count += 1 
    X += [count/10000] 
    numpy.random.seed(count) 
    #Y += [numpy.random.randint(1, 101)/100] 
    Y += [(count + 1)/100] 
print(str(X) + ' ' + str(Y)) 

# create model 
model = Sequential() 
model.add(Dense(50, input_dim=1, kernel_initializer = 'uniform', activation='relu')) 
model.add(Dense(50, kernel_initializer = 'uniform', activation='relu')) 
model.add(Dense(1, kernel_initializer = 'uniform', activation='sigmoid')) 

# Compile model 
opt = optimizers.SGD(lr=0.01) 
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy']) 

# Fit the model 
model.fit(X, Y, epochs=150, batch_size=100) 

# evaluate the model 
scores = model.evaluate(X, Y) 
predictions = model.predict(X) 
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 
print (str(predictions)) 
##plot_model(model, to_file='C:/Users/Markus/Desktop/model.png') 

精度保持爲零和預測是1的陣列。我究竟做錯了什麼?

回答

2

從我可以看到你正在試圖解決一個迴歸問題(浮點功能輸出)而不是分類問題(一個炎熱的矢量風格的輸出/輸入投入到類別)。

你乙狀結腸最後一層只會給0和1之間的輸出,這顯然限制了你的神經網絡預測Y值,其上浮更高的期望範圍內的能力。你的神經網絡試圖儘可能接近它,但你是在限制它!輸出層中的Sigmoids適用於單班yes/no輸出,但不是迴歸。

所以,你希望你的最後一層有出輸入的只是總結出一個線性激活。像這樣的東西,而不是sigmoid。 model.add(Dense(1, kernel_initializer='lecun_normal', activation='linear'))

那麼它至少在學習率足夠低的情況下可能會起作用。

谷歌 「keras迴歸」 爲有用的鏈接。

1

看起來你正在試圖做的二元分類,用binary_crossentropy損失函數。但是,類標籤Y是浮標。標籤應該是0或1.因此最大的問題在於您輸入訓練模型的輸入數據。

可以嘗試一些數據,更有意義,例如兩類,其中數據是從兩個不同的正態分佈採樣,並且所述標記是對於每個觀測0或1:

X = np.concatenate([np.random.randn(10000)/2, np.random.randn(10000)/2+1]) 

Y = np.concatenate([np.zeros(10000), np.ones(10000)]) 

該模型應該能夠用這種類型的數據去某個地方。

+0

是否有辦法進行浮點預測? –

+0

是的,你可以。您需要將損失函數更改爲像均方誤差之類的東西。檢查這個:[](https://keras.io/losses/)。此外,你可能想要刪除最後一層中的S形激活... –

+0

好吧,我得到它的工作。但是,損失由於小小的步驟而減少,幾乎沒有。你會推薦什麼樣的網絡來配合最好的參數? –