2015-08-24 111 views
2

我試圖用從nolearn包進口DBN功能,這裏是我的代碼:nolearn多標籤分類

from nolearn.dbn import DBN 
import numpy as np 
from sklearn import cross_validation 

fileName = 'data.csv' 
fileName_1 = 'label.csv' 

data = np.genfromtxt(fileName, dtype=float, delimiter = ',') 
label = np.genfromtxt(fileName_1, dtype=int, delimiter = ',') 

clf = DBN(
    [data, 300, 10], 
    learn_rates=0.3, 
    learn_rate_decays=0.9, 
    epochs=10, 
    verbose=1, 
    ) 

clf.fit(data,label) 
score = cross_validation.cross_val_score(clf, data, label,scoring='f1', cv=10) 
print score 

由於我的數據有形狀(1231,229)和標籤與形狀( 1231,13),標籤集看起來像([0 0 1 0 1 0 1 0 0 0 1 1 0] ...,[....]),當我運行我的代碼時,我得到了這個錯誤信息:錯誤的輸入形狀(1231,13)。我不知道二題可能發生在這裏:

  1. DBN不支持多標籤分類
  2. 我的標籤是不適合在DBN擬合函數中使用。

回答

5

正如Francisco Vargas所述,nolearn.dbn已棄用,您應該使用nolearn.lasagne代替(如果可以的話)。

如果要在烤寬麪條中進行多標籤分類,則應將參數regression設置爲True,定義驗證分數和自定義損失。

下面是一個例子:

import numpy as np 
import theano.tensor as T 
from lasagne import layers 
from lasagne.updates import nesterov_momentum 
from nolearn.lasagne import NeuralNet 
from nolearn.lasagne import BatchIterator 
from lasagne import nonlinearities 

# custom loss: multi label cross entropy 
def multilabel_objective(predictions, targets): 
    epsilon = np.float32(1.0e-6) 
    one = np.float32(1.0) 
    pred = T.clip(predictions, epsilon, one - epsilon) 
    return -T.sum(targets * T.log(pred) + (one - targets) * T.log(one - pred), axis=1) 


net = NeuralNet(
    # customize "layers" to represent the architecture you want 
    # here I took a dummy architecture 
    layers=[(layers.InputLayer, {"name": 'input', 'shape': (None, 1, 229, 1)}), 

      (layers.DenseLayer, {"name": 'hidden1', 'num_units': 20}), 
      (layers.DenseLayer, {"name": 'output', 'nonlinearity': nonlinearities.sigmoid, 'num_units': 13})], #because you have 13 outputs 

    # optimization method: 
    update=nesterov_momentum, 
    update_learning_rate=5*10**(-3), 
    update_momentum=0.9, 

    max_epochs=500, # we want to train this many epochs 
    verbose=1, 

    #Here are the important parameters for multi labels 
    regression=True, 

    objective_loss_function=multilabel_objective, 
    custom_score=("validation score", lambda x, y: np.mean(np.abs(x - y))) 

    ) 

net.fit(X_train, labels_train) 
+0

謝謝Massias。當我試圖測試您的示例時,我被卡在導入錯誤:無法導入名稱mse。我在網上搜索了這個錯誤,很多人說在烤寬麪條和nolearn上存在一個不兼容的問題。我正在使用不學習0.5。 – Kun

+0

@Fox我也遇到了這個問題,有時版本的theano和烤寬麪條不同意。首先從命令行運行以下命令行:首先'pip install -r https:// raw.githubusercontent.com/Lasagne/Lasagne/master/requirements.txt'然後 'pip install https://github.com/Lasagne /千層麪/存檔/ master.zip';之後,它應該工作 –

+0

我遵循你的指示,仍然有這個問題。我檢查了要求,我的Theano版本有問題嗎?礦是0.7.0。 – Kun

0

飛度調用BuildDBN可以在這裏here要注意一個重要的發現是,大北農已被棄用,你只能找到它old_commits。無論如何,如果你正在尋找額外的信息,它可能是很好的檢查這兩個我從你的代碼段中可以看到的是DBN的第一個參數[data, 300, 10]應該是[data.shape[1], 300, 10]基於文檔和源代碼。希望這可以幫助。

+0

感謝。 DBN是否支持多標籤分類任務?我不知道標籤也出現了問題。 – Kun