Я пытаюсь превратить учебник mnist.py
в классификацию с несколькими метками, используя CNN. Я очень новичок в этой области, и моя цель - понять архитектуру, формат данных ввода-вывода, чтобы быть более знакомым и решать свои собственные проблемы классификации с несколькими метками.
Из того, что я читал до сих пор, изменения, которые я сделал, следующие:
Измените учебные и тестовые метки на массивы 2d numpy, где первое измерение (строки) соответствует экземплярам, а второе измерение (столбцы) - конкретным меткам, соответствующим каждому экземпляру. Например, mnist, если я хочу преобразовать его в классификацию с 10 несколькими метками, y_train и y_test должны быть такими:
y = np.array([[0, 1, 1, 0, 1, 0, 0, 0, 0, 0], [0, 1, 1, 0, 1, 0, 0, 0, 1, 1],....[1, 1, 1, 0, 1, 0, 0, 0, 0, 1]]);
В сетевом коде мы меняем нелинейность в последнем слое с softmax на сигмоид.
network = lasagne.layers.DenseLayer( lasagne.layers.dropout(network, p=.5), num_units=10, nonlinearity=lasagne.nonlinearities.sigmoid)
num_units
остаются 10, верно? Опять же, это проблема 10-классовой классификации или нет?В переменных theano мы меняем
target_var = T.imatrix('targets')
сT.ivector
. Затем в соответствии с этим сообщением я изменить функции потерь с категориальной кросс-энтропии на бинарную кросс-энтропиюloss = lasagne.objectives.binary_crossentropy(prediction, target_var)
test_loss = lasagne.objectives.binary_crossentropy(test_prediction, target_var)
Я также меняю переменную test_acc, потому что получаю ошибку с несоответствием размера ввода. Судя по предыдущему сообщению, это решение работает
binaryPrediction = test_prediction > .5 test_acc = T.mean(T.eq(binaryPrediction, target_var))
Ну, теперь я не получаю ошибок, но я не совсем уверен, что код правильный. Когда вы выполняете классификацию с несколькими метками, вам нужно определить другие показатели, кроме типичной точности, верно? Какие-либо предложения??