有人能解释一下它输出的内容以及为什么这很重要吗?这段代码对我来说似乎毫无意义。那个for
循环应该是用来针对给定数据集优化网络中的神经元的。但它是如何做到这一点的呢?nonlin
函数是做什么用的?这段代码是做什么的?
syn0 = 2 * np.random.random((3, 4)) - 1syn1 = 2 * np.random.random((4, 1)) - 1
回答:
这是一段用于训练神经网络的简单代码:
这是神经元的激活,函数返回激活函数或其导数(这是一个S形函数)。
def nonlin(x, deriv=False): if (deriv == True): return (x * (1 - x)) return 1 / (1 + np.exp(-x))
在这张图片中,你可以看到一个神经元,这个函数在图片中表现为阶跃函数:
https://blog.dbrgn.ch/images/2013/3/26/perceptron.png
这些是训练数据,包含四个具有3个特征的数据点
X = np.array([[1,1,1], [3,3,3], [2,2,2], [2,2,2]])
每个数据的标签(二元分类任务)
y = np.array([[1], [1], [0], [1]])
这段代码初始化神经网络的权重(这是一个具有两层权重的神经网络):
np.random.seed(1)syn0 = 2 * np.random.random((3, 4)) - 1syn1 = 2 * np.random.random((4, 1)) - 1
在这张图片中,权重是vnm和wkn,它们是矩阵(每个连接的值)。
在你的案例中,你有3个输入神经元,4个隐藏神经元和1个输出神经元。每条连接的值存储在syn0
和syn1
中。
这段代码训练神经网络,它传递每个数据,评估误差并使用反向传播更新权重:
for j in xrange(100000): l0 = X l1 = nonlin(np.dot(l0, syn0)) l2 = nonlin(np.dot(l1, syn1)) l2_error = y - l2 if (j % 10000) == 0: print "Error: " + str(np.mean(np.abs(l2_error))) l2_delta = l2_error * nonlin(l2, deriv=True) l1_error = l2_delta.dot(syn1.T) l1_delta = l1_error * nonlin(l1, deriv=True) syn1 += l1.T.dot(l2_delta) syn0 += l0.T.dot(l1_delta)