我想在python或C ++中为以下输入实现反向传播算法
[[11, 15], [22, 17]]
[[8, 11], [23, 19]]
[[9, 14], [25, 22]]
[[6, 9], [17, 13]]
[[2, 6], [29, 25]]
[[4, 8], [24, 20]]
[[11, 15], [27, 24]]
[[8, 11], [31, 26]]
[[3, 8], [25, 21]]
[[11, 15], [26, 22]]
[[15, 19], [22, 17]]
[[7, 11], [17, 13]]
[[19, 24], [14, 10]]
第一个元组是我的输入,第二个元组是我的输出。我通过互联网搜索的反向传播算法的每个实现都使用分类过程(1或0)。
给定的输入/输出集用于为Checkers游戏开发神经网络。我猜它使用了与实现国际象棋相同的技术。
有可能为此开发算法吗?请提供一些执行此操作的指南或实施方法。也可以使用OpenCV函数。
答案 0 :(得分:0)
以下是我将如何进行。
让我们从{-1,1}分类问题的经典问题开始。 f表示您的(神经)网络。 x是属于RxR的输入。 y_obs是属于{-1,1}的输出。
u_j是x和z之间的权重,z是中间输出,j是1到h,u_j是R ^ 2数组。 w是z和y之间的权重,y是最终输出,w是R ^ h数组。
当您为网络提供服务时,您会得到属于R的f(x)= y。训练神经网络包括在网络顶部添加标准E(x,y_obs)并尝试最小化此标准(对于二进制分类问题,可以通过更新网络中的权重来最小化(f(x)-y_obs)^ 2)。 您的预测g(x)在训练结束时由符号(f(x))给出。
因此,为了适应您在互联网上找到的实施问题,创建一个神经网络2 x h x 2,h是隐藏单位的数量。然后,您需要在代码中找到函数标准,并将其替换为合适的标准,例如2d欧几里德范数。在这种情况下,您不需要实现任何预测函数g,您的问题不是分类问题
您可能需要更改反向传播实现的定义以更新新权重。 对于1-dim输出,您可以使用以下渐变来更新w_j,j范围从1到h(隐藏单位数)。
dE / dw_j = dE / dy * dy / dw_j
dE / du_jk = dE / dz_j * dz_j / du_jk
= dE / dy * dy / dz_j * dz_j / du_jk
(u_jk是u_j的第k个分量,k = 1,2)
随着新情况的出现:
y_1和y_2 y的组成部分。 z和y之间的w_1和w_2权重,w_1和w_2是R ^ h数组。
dE / dw_1j = dE / dy_1 * dy_1 / dw_1j
dE / dw_2j = dE / dy_2 * dy_2 / dw_2j
dE / du_jk = dE / dz_j * dz_j / du_jk
= dE / dy_1 * dy_1 / dz_j * dz_j / du_jk + dE / dy_2 * dy_2 / dz_j * dz_j / du_jk
右边的所有衍生品都是由您的网络定义的。
算法的精度对标准非常敏感,可能存在比标准更复杂的解决方案。测试会告诉你!
答案 1 :(得分:0)
您可以使用通用的反向传播算法。有很多来源解释了它的细节(例如它的维基百科页面)。但为了更好的结果,我有一个建议。
最好调节输入和输出。如果您为输入数据的每个组件添加一些常量,并将其平均值超过训练数据移动到0,这将有助于网络更快更好地学习您的模式。