Use 0 to numClasses - 1, not 1 to numClasses.

This commit is contained in:
Ryan Curtin
2020-07-21 18:28:45 -04:00
parent ca9999f783
commit 6c21b8ca4e
6 changed files with 63 additions and 55 deletions
@@ -35,11 +35,10 @@ NegativeLogLikelihood<InputDataType, OutputDataType>::Forward(
ElemType output = 0;
for (size_t i = 0; i < input.n_cols; ++i)
{
size_t currentTarget = target(i) - 1;
Log::Assert(currentTarget >= 0 && currentTarget < input.n_rows,
Log::Assert(target(i) >= 0 && target(i) < input.n_rows,
"Target class out of range.");
output -= input(currentTarget, i);
output -= input(target(i), i);
}
return output;
@@ -55,11 +54,10 @@ void NegativeLogLikelihood<InputDataType, OutputDataType>::Backward(
output = arma::zeros<OutputType>(input.n_rows, input.n_cols);
for (size_t i = 0; i < input.n_cols; ++i)
{
size_t currentTarget = target(i) - 1;
Log::Assert(currentTarget >= 0 && currentTarget < input.n_rows,
Log::Assert(target(i) >= 0 && target(i) < input.n_rows,
"Target class out of range.");
output(currentTarget, i) = -1;
output(target(i), i) = -1;
}
}
+25 -25
View File
@@ -90,7 +90,7 @@ BOOST_AUTO_TEST_CASE(GradientAddLayerTest)
GradientFunction()
{
input = arma::randu(10, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -422,7 +422,7 @@ BOOST_AUTO_TEST_CASE(GradientLinearLayerTest)
GradientFunction()
{
input = arma::randu(10, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -498,7 +498,7 @@ BOOST_AUTO_TEST_CASE(GradientNoisyLinearLayerTest)
GradientFunction()
{
input = arma::randu(10, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -602,7 +602,7 @@ BOOST_AUTO_TEST_CASE(GradientLinearNoBiasLayerTest)
GradientFunction()
{
input = arma::randu(10, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -648,7 +648,7 @@ BOOST_AUTO_TEST_CASE(JacobianNegativeLogLikelihoodLayerTest)
init.Initialize(input, inputElements, 1);
arma::mat target(1, 1);
target(0) = math::RandInt(1, inputElements - 1);
target(0) = math::RandInt(0, inputElements - 2);
double error = JacobianPerformanceTest(module, input, target);
BOOST_REQUIRE_LE(error, 1e-5);
@@ -704,7 +704,7 @@ BOOST_AUTO_TEST_CASE(GradientFlexibleReLULayerTest)
GradientFunction()
{
input = arma::randu(2, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, RandomInitialization>(
NegativeLogLikelihood<>(), RandomInitialization(0.1, 0.5));
@@ -883,7 +883,7 @@ BOOST_AUTO_TEST_CASE(LSTMRrhoTest)
{
const size_t rho = 5;
arma::cube input = arma::randu(1, 1, 5);
arma::cube target = arma::ones(1, 1, 5);
arma::cube target = arma::zeros(1, 1, 5);
RandomInitialization init(0.5, 0.5);
// Create model with user defined rho parameter.
@@ -924,7 +924,7 @@ BOOST_AUTO_TEST_CASE(GradientLSTMLayerTest)
GradientFunction()
{
input = arma::randu(1, 1, 5);
target.ones(1, 1, 5);
target.zeros(1, 1, 5);
const size_t rho = 5;
model = new RNN<NegativeLogLikelihood<> >(rho);
@@ -988,7 +988,7 @@ BOOST_AUTO_TEST_CASE(FastLSTMRrhoTest)
{
const size_t rho = 5;
arma::cube input = arma::randu(1, 1, 5);
arma::cube target = arma::ones(1, 1, 5);
arma::cube target = arma::zeros(1, 1, 5);
RandomInitialization init(0.5, 0.5);
// Create model with user defined rho parameter.
@@ -1029,7 +1029,7 @@ BOOST_AUTO_TEST_CASE(GradientFastLSTMLayerTest)
GradientFunction()
{
input = arma::randu(1, 1, 5);
target = arma::ones(1, 1, 5);
target = arma::zeros(1, 1, 5);
const size_t rho = 5;
model = new RNN<NegativeLogLikelihood<> >(rho);
@@ -1298,7 +1298,7 @@ BOOST_AUTO_TEST_CASE(GradientGRULayerTest)
GradientFunction()
{
input = arma::randu(1, 1, 5);
target = arma::ones(1, 1, 5);
target = arma::zeros(1, 1, 5);
const size_t rho = 5;
model = new RNN<NegativeLogLikelihood<> >(rho);
@@ -1537,7 +1537,7 @@ BOOST_AUTO_TEST_CASE(GradientConcatLayerTest)
GradientFunction()
{
input = arma::randu(10, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -1606,7 +1606,7 @@ BOOST_AUTO_TEST_CASE(GradientConcatenateLayerTest)
GradientFunction()
{
input = arma::randu(10, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -1961,7 +1961,7 @@ BOOST_AUTO_TEST_CASE(GradientBatchNormTest)
{
input = arma::randn(32, 2048);
arma::mat target;
target.ones(1, 2048);
target.zeros(1, 2048);
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -2037,7 +2037,7 @@ BOOST_AUTO_TEST_CASE(GradientVirtualBatchNormTest)
input = arma::randn(5, 256);
arma::mat referenceBatch = arma::mat(input.memptr(), input.n_rows, 16);
arma::mat target;
target.ones(1, 256);
target.zeros(1, 256);
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -2099,7 +2099,7 @@ BOOST_AUTO_TEST_CASE(MiniBatchDiscriminationTest)
{
input = arma::randn(5, 4);
arma::mat target;
target.ones(1, 4);
target.zeros(1, 4);
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -2278,7 +2278,7 @@ BOOST_AUTO_TEST_CASE(GradientTransposedConvolutionLayerTest)
GradientFunction()
{
input = arma::linspace<arma::colvec>(0, 35, 36);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, RandomInitialization>();
model->Predictors() = input;
@@ -2395,7 +2395,7 @@ BOOST_AUTO_TEST_CASE(GradientAtrousConvolutionLayerTest)
GradientFunction()
{
input = arma::linspace<arma::colvec>(0, 35, 36);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, RandomInitialization>();
model->Predictors() = input;
@@ -2578,7 +2578,7 @@ BOOST_AUTO_TEST_CASE(GradientLayerNormTest)
{
input = arma::randn(10, 256);
arma::mat target;
target.ones(1, 256);
target.zeros(1, 256);
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -2899,7 +2899,7 @@ BOOST_AUTO_TEST_CASE(GradientReparametrizationLayerTest)
GradientFunction()
{
input = arma::randu(10, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -2943,7 +2943,7 @@ BOOST_AUTO_TEST_CASE(GradientReparametrizationLayerBetaTest)
GradientFunction()
{
input = arma::randu(10, 2);
target = arma::mat("1 1");
target = arma::mat("0 0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -3099,7 +3099,7 @@ BOOST_AUTO_TEST_CASE(GradientHighwayLayerTest)
GradientFunction()
{
input = arma::randu(5, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -3151,7 +3151,7 @@ BOOST_AUTO_TEST_CASE(GradientSequentialLayerTest)
GradientFunction()
{
input = arma::randu(10, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -3202,7 +3202,7 @@ BOOST_AUTO_TEST_CASE(GradientWeightNormLayerTest)
GradientFunction()
{
input = arma::randu(10, 1);
target = arma::mat("1");
target = arma::mat("0");
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
@@ -4037,7 +4037,7 @@ BOOST_AUTO_TEST_CASE(GradientBatchNormWithMiniBatchesTest)
{
input = arma::randn(16, 1024);
arma::mat target;
target.ones(1, 1024);
target.zeros(1, 1024);
model = new FFN<NegativeLogLikelihood<>, NguyenWidrowInitialization>();
model->Predictors() = input;
+2 -2
View File
@@ -92,7 +92,7 @@ BOOST_AUTO_TEST_CASE(RNNCallbackTest)
{
const size_t rho = 5;
arma::cube input = arma::randu(1, 1, 5);
arma::cube target = arma::ones(1, 1, 5);
arma::cube target = arma::zeros(1, 1, 5);
RandomInitialization init(0.5, 0.5);
// Create model with user defined rho parameter.
@@ -118,7 +118,7 @@ BOOST_AUTO_TEST_CASE(RNNWithOptimizerCallbackTest)
{
const size_t rho = 5;
arma::cube input = arma::randu(1, 1, 5);
arma::cube target = arma::ones(1, 1, 5);
arma::cube target = arma::zeros(1, 1, 5);
RandomInitialization init(0.5, 0.5);
// Create model with user defined rho parameter.
@@ -47,13 +47,13 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkTest)
{
if (i < nPoints / 2)
{
// Assign label "1" to all samples with digit = 4
Y(i) = 1;
// Assign label "0" to all samples with digit = 4
Y(i) = 0;
}
else
{
// Assign label "2" to all samples with digit = 9
Y(i) = 2;
// Assign label "1" to all samples with digit = 9
Y(i) = 1;
}
}
@@ -111,7 +111,7 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkTest)
for (size_t i = 0; i < predictionTemp.n_cols; ++i)
{
prediction(i) = arma::as_scalar(arma::find(
arma::max(predictionTemp.col(i)) == predictionTemp.col(i), 1)) + 1;
arma::max(predictionTemp.col(i)) == predictionTemp.col(i), 1));
}
size_t correct = arma::accu(prediction == Y);
+20 -10
View File
@@ -52,7 +52,7 @@ void TestNetwork(ModelType& model,
for (size_t i = 0; i < predictionTemp.n_cols; ++i)
{
prediction(i) = arma::as_scalar(arma::find(
arma::max(predictionTemp.col(i)) == predictionTemp.col(i), 1)) + 1;
arma::max(predictionTemp.col(i)) == predictionTemp.col(i), 1));
}
size_t correct = arma::accu(prediction == testLabels);
@@ -71,12 +71,14 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkTest)
arma::mat trainLabels = trainData.row(trainData.n_rows - 1);
trainData.shed_row(trainData.n_rows - 1);
trainLabels -= 1; // Labels should be from 0 to numClasses - 1.
arma::mat testData;
data::Load("thyroid_test.csv", testData, true);
arma::mat testLabels = testData.row(testData.n_rows - 1);
testData.shed_row(testData.n_rows - 1);
testLabels -= 1; // Labels should be from 0 to numClasses - 1.
/*
* Construct a feed forward network with trainData.n_rows input nodes,
@@ -120,7 +122,6 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkTest)
arma::mat labels = arma::zeros(1, dataset.n_cols);
labels.submat(0, labels.n_cols / 2, 0, labels.n_cols - 1).fill(1);
labels += 1;
FFN<NegativeLogLikelihood<> > model1;
model1.Add<Linear<> >(dataset.n_rows, 10);
@@ -142,7 +143,6 @@ BOOST_AUTO_TEST_CASE(ForwardBackwardTest)
arma::mat labels = arma::zeros(1, dataset.n_cols);
labels.submat(0, labels.n_cols / 2, 0, labels.n_cols - 1).fill(1);
labels += 1;
FFN<NegativeLogLikelihood<> > model;
model.Add<Linear<> >(dataset.n_rows, 50);
@@ -189,7 +189,7 @@ BOOST_AUTO_TEST_CASE(ForwardBackwardTest)
for (size_t i = 0; i < currentResuls.n_cols; ++i)
{
prediction(i) = arma::as_scalar(arma::find(
arma::max(currentResuls.col(i)) == currentResuls.col(i), 1)) + 1;
arma::max(currentResuls.col(i)) == currentResuls.col(i), 1));
}
size_t correct = arma::accu(prediction == currentLabels);
@@ -218,12 +218,14 @@ BOOST_AUTO_TEST_CASE(DropoutNetworkTest)
arma::mat trainLabels = trainData.row(trainData.n_rows - 1);
trainData.shed_row(trainData.n_rows - 1);
trainLabels -= 1; // Labels should be from 0 to numClasses - 1.
arma::mat testData;
data::Load("thyroid_test.csv", testData, true);
arma::mat testLabels = testData.row(testData.n_rows - 1);
testData.shed_row(testData.n_rows - 1);
testLabels -= 1; // Labels should be from 0 to numClasses - 1.
/*
* Construct a feed forward network with trainData.n_rows input nodes,
@@ -269,7 +271,6 @@ BOOST_AUTO_TEST_CASE(DropoutNetworkTest)
arma::mat labels = arma::zeros(1, dataset.n_cols);
labels.submat(0, labels.n_cols / 2, 0, labels.n_cols - 1).fill(1);
labels += 1;
FFN<NegativeLogLikelihood<> > model1;
model1.Add<Linear<> >(dataset.n_rows, 10);
@@ -295,7 +296,6 @@ BOOST_AUTO_TEST_CASE(HighwayNetworkTest)
arma::mat labels = arma::zeros(1, dataset.n_cols);
labels.submat(0, labels.n_cols / 2, 0, labels.n_cols - 1).fill(1);
labels += 1;
FFN<NegativeLogLikelihood<> > model;
model.Add<Linear<> >(dataset.n_rows, 10);
@@ -319,12 +319,14 @@ BOOST_AUTO_TEST_CASE(DropConnectNetworkTest)
arma::mat trainLabels = trainData.row(trainData.n_rows - 1);
trainData.shed_row(trainData.n_rows - 1);
trainLabels -= 1; // The range should be between 0 and numClasses - 1.
arma::mat testData;
data::Load("thyroid_test.csv", testData, true);
arma::mat testLabels = testData.row(testData.n_rows - 1);
testData.shed_row(testData.n_rows - 1);
testLabels -= 1; // The range should be between 0 and numClasses - 1.
/*
* Construct a feed forward network with trainData.n_rows input nodes,
@@ -370,7 +372,6 @@ BOOST_AUTO_TEST_CASE(DropConnectNetworkTest)
arma::mat labels = arma::zeros(1, dataset.n_cols);
labels.submat(0, labels.n_cols / 2, 0, labels.n_cols - 1).fill(1);
labels += 1;
FFN<NegativeLogLikelihood<> > model1;
model1.Add<Linear<> >(dataset.n_rows, 10);
@@ -408,12 +409,14 @@ BOOST_AUTO_TEST_CASE(SerializationTest)
arma::mat trainLabels = trainData.row(trainData.n_rows - 1);
trainData.shed_row(trainData.n_rows - 1);
trainLabels -= 1; // The labels should be between 0 and numClasses - 1.
arma::mat testData;
data::Load("thyroid_test.csv", testData, true);
arma::mat testLabels = testData.row(testData.n_rows - 1);
testData.shed_row(testData.n_rows - 1);
testLabels -= 1; // The labels should be between 0 and numClasses - 1.
// Vanilla neural net with logistic activation function.
// Because 92% of the patients are not hyperthyroid the neural
@@ -457,12 +460,14 @@ BOOST_AUTO_TEST_CASE(CustomLayerTest)
arma::mat trainLabels = trainData.row(trainData.n_rows - 1);
trainData.shed_row(trainData.n_rows - 1);
trainLabels -= 1; // The labels should be between 0 and numClasses - 1.
arma::mat testData;
data::Load("thyroid_test.csv", testData, true);
arma::mat testLabels = testData.row(testData.n_rows - 1);
testData.shed_row(testData.n_rows - 1);
testLabels -= 1; // The labels should be between 0 and numClasses - 1.
FFN<NegativeLogLikelihood<>, RandomInitialization, CustomLayer<> > model;
model.Add<Linear<> >(trainData.n_rows, 8);
@@ -536,12 +541,14 @@ BOOST_AUTO_TEST_CASE(FFNTrainReturnObjective)
arma::mat trainLabels = trainData.row(trainData.n_rows - 1);
trainData.shed_row(trainData.n_rows - 1);
trainLabels -= 1; // The labels should be between 0 and numClasses.
arma::mat testData;
data::Load("thyroid_test.csv", testData, true);
arma::mat testLabels = testData.row(testData.n_rows - 1);
testData.shed_row(testData.n_rows - 1);
testLabels -= 1; // The labels should be between 0 and numClasses.
// Vanilla neural net with logistic activation function.
// Because 92% of the patients are not hyperthyroid the neural
@@ -606,12 +613,14 @@ BOOST_AUTO_TEST_CASE(OptimizerTest)
arma::mat trainLabels = trainData.row(trainData.n_rows - 1);
trainData.shed_row(trainData.n_rows - 1);
trainLabels -= 1; // The labels should be between 0 and numClasses.
arma::mat testData;
data::Load("thyroid_test.csv", testData, true);
arma::mat testLabels = testData.row(testData.n_rows - 1);
testData.shed_row(testData.n_rows - 1);
testLabels -= 1; // The labels should be between 0 and numClasses.
FFN<NegativeLogLikelihood<>, RandomInitialization, CustomLayer<> > model;
model.Add<Linear<> >(trainData.n_rows, 8);
@@ -634,11 +643,12 @@ BOOST_AUTO_TEST_CASE(RBFNetworkTest)
arma::mat trainLabels = trainData.row(trainData.n_rows - 1);
trainData.shed_row(trainData.n_rows - 1);
trainLabels -= 1; // The labels should be between 0 and numClasses.
arma::mat trainLabels1 = arma::zeros(3, trainData.n_cols);
for (size_t i = 0; i < trainData.n_cols; i++)
{
trainLabels1.col(i).row((trainLabels(i) - 1)) = 1;
trainLabels1.col(i).row(trainLabels(i)) = 1;
}
arma::mat testData;
@@ -646,6 +656,7 @@ BOOST_AUTO_TEST_CASE(RBFNetworkTest)
arma::mat testLabels = testData.row(testData.n_rows - 1);
testData.shed_row(testData.n_rows - 1);
testLabels -= 1; // The labels should be between 0 and numClasses.
/*
* Construct a feed forward network with trainData.n_rows input nodes,
@@ -681,7 +692,7 @@ BOOST_AUTO_TEST_CASE(RBFNetworkTest)
}
arma::mat labels = arma::zeros(1, dataset.n_cols);
labels.submat(0, labels.n_cols / 2, 0, labels.n_cols - 1).fill(1);
labels.submat(0, labels.n_cols / 2, 0, labels.n_cols - 1).fill(0);
arma::mat labels1 = arma::zeros(2, dataset.n_cols);
@@ -689,7 +700,6 @@ BOOST_AUTO_TEST_CASE(RBFNetworkTest)
{
labels1.col(i).row(labels(i)) = 1;
}
labels += 1;
arma::mat centroids1;
arma::Row<size_t> assignments;
+7 -7
View File
@@ -93,7 +93,7 @@ BOOST_AUTO_TEST_CASE(SequenceClassificationBRNNTest)
for (size_t i = 0; i < labelsTemp.n_cols; ++i)
{
const int value = arma::as_scalar(arma::find(
arma::max(labelsTemp.col(i)) == labelsTemp.col(i), 1)) + 1;
arma::max(labelsTemp.col(i)) == labelsTemp.col(i), 1));
labels.tube(0, i).fill(value);
}
@@ -168,7 +168,7 @@ BOOST_AUTO_TEST_CASE(SequenceClassificationTest)
for (size_t i = 0; i < labelsTemp.n_cols; ++i)
{
const int value = arma::as_scalar(arma::find(
arma::max(labelsTemp.col(i)) == labelsTemp.col(i), 1)) + 1;
arma::max(labelsTemp.col(i)) == labelsTemp.col(i), 1));
labels.tube(0, i).fill(value);
}
@@ -212,10 +212,10 @@ BOOST_AUTO_TEST_CASE(SequenceClassificationTest)
{
const int predictionValue = arma::as_scalar(arma::find(
arma::max(prediction.slice(rho - 1).col(i)) ==
prediction.slice(rho - 1).col(i), 1) + 1);
prediction.slice(rho - 1).col(i), 1));
const int targetValue = arma::as_scalar(arma::find(
arma::max(labelsTemp.col(i)) == labelsTemp.col(i), 1)) + 1;
arma::max(labelsTemp.col(i)) == labelsTemp.col(i), 1));
if (predictionValue == targetValue)
{
@@ -1452,15 +1452,15 @@ BOOST_AUTO_TEST_CASE(LargeRhoValueRnnTest)
{
const auto strLen = strlen(line);
// Responses for NegativeLogLikelihood should be
// non-one-hot-encoded class IDs (from 1 to num_classes).
// non-one-hot-encoded class IDs (from 0 to num_classes - 1).
MatType result(1, 1, strLen, arma::fill::zeros);
// The response is the *next* letter in the sequence.
for (size_t i = 0; i < strLen - 1; ++i)
{
result.at(0, 0, i) = static_cast<arma::uword>(line[i + 1]) + 1.0;
result.at(0, 0, i) = static_cast<arma::uword>(line[i + 1]);
}
// The final response is empty, so we set it to class 0.
result.at(0, 0, strLen - 1) = 1.0;
result.at(0, 0, strLen - 1) = 0.0;
return result;
};