很长一段时间以来,我都渴望搭建神经网络,现在终于有机会研究一下了。我想我不太了解神经网络背后的数学原理,所以让我们从教AI做一些简单的事情开始吧。代码原则神经网络并不是一个新概念,最早由WarrenMcCulloch和WalterPitts于1943年提出。我们将构建一个没有隐藏层或感知器的单层神经网络。它由包含训练示例、突触或权重和神经元的输入层以及包含正确答案的输出层组成。神经网络图如下所示:此外,还需要了解一些数学概念,如sigmoid和导数,以了解神经元如何学习。神经元只需要获取输入值并将其乘以突触权重。之后,将所有这些乘法结果相加,用sigmoid函数得到一个0到1之间的输出值。我们期望的理想结果是,在数据集sample中,如果输入的第一位是1,神经网络返回1;如果第一位是0,则返回0。结果显示在输出层。问题集如下图所示:开始编码的先决条件——达到一定程度的概念理解。NumPY安装:pipinstallnumpy安装成功,可以进入编码部分。首先,将NumPy导入Python文件:importnumpyasnptrainneuralnetwork首先,创建一个sigmoid函数:其次,定义训练示例、输入(4×5矩阵)和输出:接下来,通过生成随机值来初始化突触权重,以及将结果排列成一个4×1的矩阵:最后,构建训练模型。使用for循环,所有训练都将在此循环中进行。调用sigmoid函数并将所有输入的总和乘以sigmoid权重。然后Np.dot用于矩阵乘法。过程如下图:输出结果如下图:现在通过计算sigmoid函数的输出与实际输出的差值进行神经网络模型训练。然后可以根据错误的严重程度调整权重。重复此过程多次,比如10,000次。定义sigmoid导数:下面介绍如何计算和调整权重:开始学习,看看学习时长如何影响结果。从100次迭代开始:开始是乐观的——我们的AI已经学会识别模式,但错误率仍然很高。现在进行1000次迭代:事情变得更好,继续进行10000次迭代:100,000次迭代:我们可以继续进行更多的学习迭代,但我们永远无法达到100%的准确度,因为它需要无限次的计算。但即使在最坏的情况下,准确率也能达到99.77%,已经很不错了。最后的代码,我写得很漂亮,按功能分开。除此之外,在文本文件中,我还添加了一个非常复杂的方法来存储权重。这样只需要一次学习,需要用到AI时,只需要导入权重,使用sigmoid函数即可。importnumpyasnpfromtempfileimportTemporaryFiledefsigmoid(x):return1/(1+np.exp(-x))defsigmoid_der(x):returnx*(1-x)deftraining():training_inputs=np.array([[0,0,1,0],[1,1,1,0],[1,0,1,0],[0,1,1,1],[0,1,0,1]])trainign_outputs=np.array([[0,1,1,0,0]]).Tnp.random.seed(1)synaptic_weights=2*np.random.random((4,1))-1foriinrange(50000):inputs=training_inputsoutputs=sigmoid(np.dot(inputs,synaptic_weights))error=trainign_outputs-outputsadjustments=error*sigmoid_der(outputs)synaptic_weights+=np.dot(inputs.T,adjustments)data_file=open("data.txt","w")forrowinsynaptic_weights:np。savetxt(data_file,row)data_file.close()defthinking(inputs):synaptic_weights=np.loadtxt("data.txt").reshape(4,1)outputs=sigmoid(np.dot(inputs,synaptic_weights))print(outputs)returnoutputstraining()thinking(np.array([1,1,0,1]))资料来源:Pixabay我的第一个AI已准备好投入生产。尽管它只能在极小的数据集上识别非常简单的模式,但我们现在可以将其扩展到例如尝试教AI识别图片中的内容。学无止境,精益求精!
