2017-04-19 31 views
2

我有這個簡單的模型(5個頻道),我希望它返回第二個Keras組件選擇

import keras 
import numpy as np 
import keras.backend as K 

data = np.random.normal(size = (1000, 5)) 

model = keras.models.Sequential() 
model.add(keras.layers.Dense(10, activation = 'linear',input_shape = (5,))) 
model.add(keras.layers.Dense(1, activation = 'linear')) 

def loss(x, y): 
    return K.mean(K.square(x - y)) 

model.compile('adam', loss) 
model.fit(data, data[:, 1], epochs = 100) 

它的偉大工程,我得到完美的零損耗。

當我稍微調整一下(我在輸出中添加了一個額外的通道),我決定不關心第二個通道。

我改變它是這樣的:

import keras 
import numpy as np 
import keras.backend as K 

data = np.random.normal(size = (1000, 5)) 

model = keras.models.Sequential() 
model.add(keras.layers.Dense(10, activation = 'linear',input_shape = (5,))) 
model.add(keras.layers.Dense(2, activation = 'linear')) 

def loss(x, y): 
    return K.mean(K.square(x - y[:, 0])) 

model.compile('adam', loss) 
model.fit(data, data[:, 1], epochs = 100) 

,現在是不可能的訓練。這對我來說似乎很瘋狂。有誰知道發生了什麼?

PS:這個例子看起來很愚蠢,但對於一個更復雜的問題,我需要計算一個自定義的損失,我將這個問題簡化爲這個簡單的例子。

謝謝您的幫助

回答

1

掙扎後,我終於有了一個位置(和一個可能的解釋)的時間。

這個例子中的問題(唯一的區別)是索引選擇。即使它似乎支持Tensorflow。它行爲不正確。 (Theano Backend下有問題的代碼段失敗)。即使損失計算正確,似乎衍生物是錯誤的。誤導優化器。這就是爲什麼NN不訓練。哈克但完全可行的解決方案,我發現是

tensorflow.matmul(y, [[1.0], [0.0]]) 

更換

y[:, 0] 

我沒有嘗試,但它應該工作正常keras.backend.dot太多,如果你正在尋找多後端東東。小心把浮子,而不是整數,否則它不會檢測。

希望它能幫助別人。