我刚刚创建了我的第一个神经网络,它使用了梯度法和反向传播学习算法。它使用双曲正切作为激活函数。代码经过了良好的单元测试,因此我对网络实际工作充满了希望。然后我决定创建一个集成测试并尝试教我的网来解决一些非常简单的功能。基本上我是在测试体重是否有所提高(只有一个,因为这是一个非常小的网络输入加上一个神经元)。
// Combinations of negative sign for values greater than 1
[TestCase(8, 4)] // FAIL reason 1
[TestCase(-8, 4)] // FAIL reason 1
[TestCase(8, -4)] // FAIL reason 1
[TestCase(-8, -4)] // FAIL reason 1
// Combinations of negative sign for values lesser than 1
[TestCase(.8, .4)] // OK
[TestCase(-.8, .4)] // FAIL reason 2
[TestCase(.8, -.4)] // FAIL reason 2
[TestCase(-.8, -.4)] // OK
// Combinations of negative sign for one value greater than 1 and the other value lesser than 1
[TestCase(-.8, 4)] // FAIL reason 2
[TestCase(8, -.4)] // FAIL reason 2
// Combinations of one value greater than 1 and the other value lesser than 1
[TestCase(.8, 4)] // OK
[TestCase(8, .4)] // FAIL reason 1
public void ShouldImproveLearnDataSetWithNegativeExpectedValues(double expectedOutput, double x)
{
var sut = _netBuilder.Build(1, 1); // one input, only one layer with one output
sut.NetSpeedCoefficient = .9;
for (int i = 0; i < 400; i++)
{
sut.Feed(new[] { x }, new[] { expectedOutput });
}
var postFeedOutput = sut.Ask(new[] { x }).First();
var postFeedDifference = Math.Abs(postFeedOutput - expectedOutput);
postFeedOutput.Should().NotBe(double.NaN);
postFeedDifference.Should().BeLessThan(1e-5);
}
我非常失望,因为大多数测试用例都失败了(只有3个标记为&#39; // OK&#39;通过)。我挖掘了代码,发现了一些有趣的事实。
神经网络是否只能解决0..1输入值和0..1预期输出值的问题,或者我的实现有问题吗?
答案 0 :(得分:2)
您可以从NN获得其他输出。如果您想要离散输出(分类),请使用Softmax Regression。相反,如果您想要连续输出(回归),则必须在输出范围(最小值,最大值)和(0,1)之间创建双射映射。在大多数情况下,地图f:(min,max) - &gt;(0,1),f(x)=(x-min)/(max-min)就足够了。
在其中一个数字为负数的测试用例中,最终权重也应为负数
为什么最终体重也应为负值?
您可以输入任何数字。 (尽管将特征规范化为较小范围是一种很好的做法,通常是将它们设为平均0和标准差1)