【2022.8.17】
更新一下之前算法
学习速度很重要,训练的输入输出对越多,studyRate就要越小奥,我这里取0.5/训练量的平方
中间节点和输入输出对的量保持一致,可以保证记住映射关系奥
今天知道矩阵运算可以用numpy.dot(a, b),我这里训练量不大,自己写了一个
import math
import randomimport numpydef getDeviation(errOut, corOut):x = 0for i in range(len(errOut)):x += (errOut[i] - corOut[i]) ** 2return x / 2def arrCopy(arr1, arr2, n):if n > 1:for i in range(len(arr1)):arrCopy(arr1[i], arr2[i], n - 1)else:for i in range(len(arr1)):arr1[i] = arr2[i]class backpropagation:def __init__(self, hideLen, studyRate):inLen = len(inputs[0])outLen = len(outputs[0])studyRate /= len(inputs)studyRate /= len(inputs)self.inToHide = numpy.zeros((inLen, hideLen))self.hideToOut = numpy.zeros((hideLen, outLen))self.b = numpy.zeros(hideLen)oldCost = -1upCount = 0for y in range(10000):cost = 0for i in range(len(outputs)):tempHide = neural(inputs[i], self.inToHide, self.b)tempOut = matrixMultiply([tempHide], self.hideToOut)[0]cost += bp(inputs[i], self.inToHide, tempHide, self.hideToOut, tempOut, outputs[i], studyRate, self.b)for i in range(len(outputs)):tempHide = neural(inputs[i], self.inToHide, self.b)tempOut = matrixMultiply([tempHide], self.hideToOut)[0]print(tempOut)print('cost: ' + str(cost))cost /= len(inputs)if oldCost - cost < 0.000001:upCount += 1print('cost > oldCost!!!!!!!!!!')oldCost = costprint('----------------')if cost < 0.0001 or upCount > 100:print("共循环" + str(y) + '次')print('cost进步小于0.000001:' + str(upCount) + '次!!!!!')breakprint("-----------------------------")print(self.inToHide)print(self.hideToOut)print(self.b)print("-----------------------------")def test(self, inp):outs = numpy.ndarray((len(inp), len(inp[0])))for i in range(len(inp)):tempHide = neural(inp[i], self.inToHide, self.b)outs[i] = matrixMultiply([tempHide], self.hideToOut)[0]return outsdef neural(inp, inToHide, inherent):tempHide = matrixMultiply([inp], inToHide)[0]for i in range(len(inherent)):tempHide[i] += inherent[i]# 神经元固有值,也可以优化,暂时不动sigmoid(tempHide)return tempHidedef bp(inp, inToHide, hide, hideToOut, errOut, corOut, studyRate, b):deviation = getDeviation(errOut, corOut)# if deviation < 0.000001:# return deviationd_deviation_o = numpy.zeros(len(corOut))for i in range(len(corOut)):d_deviation_o[i] = errOut[i] - corOut[i]d_ho_h = numpy.zeros(len(hide))for i in range(len(hide)):d_ho_h[i] = hide[i] * (1 - hide[i])d_deviation_h = numpy.zeros(len(hide))for i in range(len(hide)):for j in range(len(corOut)):d_deviation_h[i] += d_deviation_o[j] * hideToOut[i][j] * d_ho_h[j]# 先修正inToHidefor i in range(len(inp)):for j in range(len(hide)):inToHide[i][j] -= d_deviation_h[j] * inp[i] * studyRateb[j] -= d_deviation_h[j] * studyRate# 再修正hideToOutfor i in range(len(hide)):for j in range(len(corOut)):hideToOut[i][j] -= d_deviation_o[j] * hide[i] * studyRatereturn deviationdef matrixMultiply(leftMatrix, rightMatrix):lXLen = len(leftMatrix)lYlen = len(leftMatrix[0])rXLen = len(rightMatrix)rYLen = len(rightMatrix[0])if lYlen != rXLen:return NoneoutMatrix = numpy.zeros((lXLen, rYLen))for i in range(lXLen):for j in range(rYLen):for k in range(lYlen):outMatrix[i][j] += leftMatrix[i][k] * rightMatrix[k][j]return outMatrixdef sigmoid(arr):for i in range(len(arr)):arr[i] = 1 / (1 + math.e ** -arr[i])if __name__ == '__main__':inputs = [[0], [1], [2], [3], [4]]outputs = [[0], [1], [4], [9], [16]]shit = backpropagation(len(inputs), 0.5)print(shit.test([[8]]))'''
正向计算:
h1 = i1*a11 + i2*a21 + b1
ho1 = sigmoid(h1)
o1 = ho1 * b11 + ho2 * b21
o2 = ho1 * b12 + ho2 * b22
deviation = 1/2(O1 - o1)^2 + 1/2(O2 - o2)^2计算偏导数,用于更新权值和固定值:
$(a, b)表示a对b的偏导数
$(deviation, o1) = o1 - O1
$(deviation, o2) = o2 - O2
$(o1, b11) = ho1
$(o2, b11) = ho2
$(o3, b11) = ho3
$(o4, b11) = ho4$(deviation, b11) = $(deviation, o1) * $(o1, b11) = (o1 - O1) * ho1 $(deviation, b12) = (o2 - O2) * ho1 $(deviation, b21) = (o1 - O1) * ho2$(deviation, b22) = (o2 - O2) * ho2
$(o1, ho1) = b11
$(o2, ho1) = b12
$(deviation, ho1) = $(deviation, o1) * $(o1, ho1) + $(deviation, o2) * $(o2, ho1) = (o1 - O1) * b11 + (o2 - O2) * b12
$(deviation, ho2) = $(deviation, o1) * $(o1, ho2) + $(deviation, o2) * $(o2, ho2) = (o1 - O1) * b21 + (o2 - O2) * b22
$(ho1, h1) = ho1 - ho1^2
$(ho2, h2) = ho2 - ho2^2
$(deviation, h1) = [(o1 - O1) * b11 + (o2 - O2) * b12] * (ho1 - ho1^2)
$(deviation, h2) = [(o1 - O1) * b21 + (o2 - O2) * b22] * (ho2 - ho2^2)更新w:
$(h1, a11) = i1$(deviation, a11) = $(deviation, h1) * $(h1, a11) = [(o1 - O1) * b11 + (o2 - O2) * b12] * (ho1 - ho1^2) * i1$(deviation, a21) = [(o1 - O1) * b11 + (o2 - O2) * b12] * (ho1 - ho1^2) * i2$(deviation, a12) = [(o1 - O1) * b21 + (o2 - O2) * b22] * (ho2 - ho2^2) * i1$(deviation, a22) = [(o1 - O1) * b21 + (o2 - O2) * b22] * (ho2 - ho2^2) * i2更新b:
$(deviation, b1) = $(deviation, h) * $(h, b1) = $(deviation, h1)
'''
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
