2017-03-06 56 views
1

我有一個需要分析模型輸出張量的定製調整器。基本上我不能這樣做。之後設置Keras層的屬性

model = Sequential() 
model.add(Dense(128, name="dense_1", W_regularizer=Custom(0.1))) 
model.add(Dense(nb_classes, name='dense_2')) 
model.compile(loss='mse', optimizer='adam') 
model.fit(..) 

自定義函數需要目標標籤張量的地方,不幸的是這樣的張量尚未實現。

我也嘗試設置這樣的層的屬性:

model.add(Dense(128, name="dense_1")) 
model.get_layer('dense_1').W_regularizer = Custom(0.1) 

當這樣的層get_config()我看到它已經被正確應用,但在訓練中似乎行不通。或者,這種方式不是一種明智的實施方式。

回答

0

要改變這樣的事情,你需要重新編譯模型。這是因爲編譯過程產生的訓練函數在事後被最小化。要更改訓練功能,您需要重新編譯。

只需撥打

model.compile(...) 
更改後

,它應該工作,你期望它的工作方式。

+0

這兩種方式都無法做正確的工作。啊..我正在編輯(等待) –

+0

只是把我目前的發現評論。感謝幫助! –

0

感謝@Thomas,我試圖重新編譯,但如預期不起作用(如下所示第一個)

我嘗試以下方法..
1)直接指定(工作)

#put inf number here for testing 
x = Dense(128,name="dense_1", W_regularizer = l2(1E300)) 
model.add(x) 
... 
model.compile(...) 

2)設定之後屬性和編譯(不工作)使用topology.layer add_weight

x = Dense(128,name="dense_1") 
model.add(x) 
x.W_regularizer = l2(1E300) 
... 
model.compile(...) 

3)(它的工作原理)

x = Dense(128,name="dense_1") 
model.add(x) 
x.W = x.add_weight((x.input_dim, x.output_dim), 
       initializer='zero', 
       name='{}_W'.format(x.name), 
       constraint=x.W_constraint, 
       regularizer=l2(1E300)) 
model.compile(...) 

1)3)我得到了loss: nan這意味着修改成功應用; 3)是我想要的。而第二個則不。但必須有一個聰明的方法來實現。