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.

2 ответа

Решение

Как упомянул Франсиско Варгас, 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)

Подходящие вызовы BuildDBN, которые можно найти здесь, важно отметить, что dbn устарел, и вы можете найти его только old_commits. В любом случае, если вы ищете дополнительную информацию, вероятно, стоит проверить эти два из того, что я вижу в вашем фрагменте, что первый параметр DBN а именно [data, 300, 10] должно быть [data.shape[1], 300, 10] на основании документации и исходного кода. Надеюсь это поможет.

Другие вопросы по тегам