def backward(self, x, d, z1, z2, y): grad = {} W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] # 出力層でのデルタ delta3 = functions.d_softmax_with_loss(d, y) # b3の勾配 grad['b3'] = np.sum(delta3, axis=0) # W3の勾配 grad['W3'] = np.dot(z2.T, delta3) # 活性化関数の導関数 Relu関数 delta2 = np.dot(delta3, W3.T) * functions.d_sigmoid(z2) # b2の勾配 grad['b2'] = np.sum(delta2, axis=0) # W2の勾配 grad['W2'] = np.dot(z1.T, delta2) # 活性化関数の導関数 Relu関数 delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1) # b1の勾配 grad['b1'] = np.sum(delta1, axis=0) # W1の勾配 grad['W1'] = np.dot(x.T, delta1) return grad
def backward(x, d, z1, z2, y): grad = {} W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] ########### 変更箇所 ############## hidden_d_f = functions.d_relu ################################# # 出力層でのデルタ delta3 = functions.d_softmax_with_loss(d, y) # b3の勾配 grad['b3'] = np.sum(delta3, axis=0) # W3の勾配 grad['W3'] = np.dot(z2.T, delta3) # 2層でのデルタ delta2 = np.dot(delta3, W3.T) * hidden_d_f(z2) # b2の勾配 grad['b2'] = np.sum(delta2, axis=0) # W2の勾配 grad['W2'] = np.dot(z1.T, delta2) # 1層でのデルタ delta1 = np.dot(delta2, W2.T) * hidden_d_f(z1) # b1の勾配 grad['b1'] = np.sum(delta1, axis=0) # W1の勾配 grad['W1'] = np.dot(x.T, delta1) return grad
def backward(x, d, z1, y): grad = {} W1, W2 = network['W1'], network['W2'] b1, b2 = network['b1'], network['b2'] # 出力層でのデルタ delta2 = functions.d_softmax_with_loss(d, y) # b2の勾配 grad['b2'] = np.sum(delta2, axis=0) # W2の勾配 grad['W2'] = np.dot(z1.T, delta2) # 1層でのデルタ delta1 = np.dot(delta2, W2.T) * functions.d_relu(z1) # b1の勾配 grad['b1'] = np.sum(delta1, axis=0) # W1の勾配 grad['W1'] = np.dot(x.T, delta1) return grad