图片缩略图

简单神经网络

version 1.1 (6.9 MB) by Vahe Tshitoyan
一个全连接的可定制神经网络实例。
4.4
10级

59下载

更新2019年2月10日

来自GitHub

视图版本历史

在GitHub上查看许可证

一个完全连接的神经网络,具有许多定制选项。
基本训练:
modelNN = learnNN(X, y);
预测:
p = predictNN(X_valid, modelNN);
可以使用任意数量的隐藏层、不同的激活函数(目前是tanh或sigm)、自定义正则化参数、验证集等。该代码不使用任何matlab工具箱,因此,如果您没有统计和机器学习工具箱,或如果您有一个旧版本的matlab,它是完美的。我使用共轭梯度算法最小化借来的安德鲁ng机器学习课程。有关更多文档,请参阅github和代码中的注释。

引用作为

瓦赫·齐托扬(2021年)。简单神经网络GitHub (https://github.com/vtshitoyan/simpleNN)。检索

评论和评级(15

多尼Wahyu

g、 a。

柯忠

你能

劳尔

你救了我这学期的期末作业!英雄! !

chengbo朱

雅各Wikner

Zulkifli希

repelem。M没有定义

谢尔盖·波特金

Vahe Tshitoyan

杰西,谢谢你的反馈,我很高兴一切正常。一些注释可能会帮助您进一步使用此代码
1.simpleNN目前仅用于分类,因此它希望y值始终是整数标签,其中每个数字对应一个类。如果您有非整数标签,但仍希望执行分类,我建议您标识所有唯一值(例如1.1、2.3、…68.9等),并为每个值(例如1、2、…69等)指定整数标签。执行分类后,可以映射回原始值。如果您提供非整数值,代码肯定会崩溃,结果肯定不可信。
2.sub2ind将矩阵中的(行、列)索引转换为单个索引,通过该索引可以查询同一元素。例如,如果我的矩阵A是2x2维的,我可以使用(2,2)或(4)查询元素(2,2)-这两者都将返回相同的值。所以sub2ind([2],2,2)将返回4。现在,nnCostFunction.m中sub2ind的用途是将整数标签(1、2、3…)转换为0和1的矩阵。如果选中nnCostFunction.m的第48行,它将创建一个0的矩阵。然后我使用sub2ind在与每行的类标签对应的列值处放置1(培训示例)。在一个简单的例子中,您有两个训练示例(m=2),一个标记为1,另一个标记为2(num_labels=2),这将按如下方式工作。首先得到一个0的2x2矩阵。然后sub2ind([22],1:2,[12])返回[1,4](sub2ind([22],1,1)->1,sub2ind([22],2,2)->4),赋值后返回y_nn=[10;0 1]。我希望这是有帮助的。
Vahe

杰西·里克曼

谢谢!一般来说,一切都很好。但是,我在nnCostFunction.m中调用sub2ind时遇到了一些问题。

第一个问题是sub2ind返回非正整数值。经过一些快速调试后,出现这种情况的原因似乎是我的y数据(通过y'输入到函数)不是严格意义上的整数值。

我遇到的第二个问题是,我的y数据在0-70的范围内。然而,在我的训练集中通常没有70个唯一的y值(我有大约1500个训练点)。当这种情况发生时,我收到以下错误从sub2ind函数"MATLAB:sub2ind:IndexOutOfRange"。

在快速查看sub2ind函数及其帮助页面后,我觉得奇怪的是y'是函数调用的输入之一。对于一个应该为给定大小的向量/数组返回索引值的函数,我觉得奇怪的是,这些向量/数组的内容(在本例中为y)会改变该函数的输出。也许我有点误解了sub2ind的用途(因为我很乐意承认,在使用此代码之前,我从未使用过它)。

在任何情况下,我希望您能够阐明这里发生的事情以及sub2ind命令在本例中的具体实现和使用。提前谢谢!

Vahe Tshitoyan

维克多,谢谢你的反馈,我很高兴代码是有用的。
-谢谢你注意到了,修好了。
-你一定使用了旧版本,我已经修复了这个。我建议您直接从GitHub获取最新代码。

当你完成了交叉验证的实现后,可以在GitHub上发送一个pull请求。我很高兴在评审完代码后将您添加为贡献者。

关于代价函数,我使用交叉熵损失,这是分类问题的标准代价函数。对于回归问题,可以使用二次损失函数。tanh和sigmoid的代价函数是相同的,但是tanh返回(-1,1)范围内的值,为了保持一致性,必须将该值带到(0,1)范围内。因此,略有不同。
我不明白你说的线性误差项是什么意思。梯度对于tanh和sigmoid是不同的,在lib/tanhGradient中定义。m和lib / sigmoidGradient.m。

我希望这对你有帮助。

维克多诉斯潘多克

谢谢你的工作!

几个技巧和一个问题:
- learnNN的描述以错误的方式描述输入的维数(转置)。
-培训混淆矩阵分配验证数据;modelNN。confusion_train = confusion_valid;

我在这个网络上实现了k-fold交叉验证,并基于不断增加的验证错误实现了提前停止标准。
完成后将发布更新。

问题:为什么输出层上的成本函数依赖于激活函数?
为什么不是一个“简单的”二次型呢?对于输出层的梯度计算,似乎使用了一个线性误差项,这似乎很奇怪,因为它不是正定的。虽然训练似乎还可以,但我可能无法正确解释代码。

你能详细说明一下吗?再次感谢!

图拉比哈利玛酒店

杰克H

MATLAB版本兼容性
创建R2015b
与任何版本兼容
平台的兼容性
窗户 马科斯 Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始打猎吧!