一、实验目的
(1)掌握多层神经网络BP算法的基本原理。
(2)掌握多层神经网络BP算法的编程实现。
二、实验内容
1、代码题
编程实现BP神经网络的训练与测试。
python测试代码见附件:classify.py。
请编写nn_model函数、predict等函数及其调用的函数,使得测试代码classify.py可以顺利运行。
(将执行正确的python代码粘贴在此处)
import numpy as np
def initialize_parameters(n_x, n_h, n_y):
W1 = np.random.randn(n_h, n_x) * 0.01
b1 = np.zeros(shape=(n_h, 1))
W2 = np.random.randn(n_y, n_h) * 0.01
b2 = np.zeros(shape=(n_y, 1))
return W1, b1, W2, b2
# 前向传播函数
def forward_propagation(X, W1, b1, W2, b2):
Z1 = np.dot(W1, X) + b1
A1 = np.tanh(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = sigmoid(Z2)
return Z1, A1, Z2, A2
def comput_cost(A2, Y):
m = Y.shape[1]
logprobs = np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2))
cost = -np.sum(logprobs) / m
cost = float(cost)
return cost
# 反向传播函数
def backward_propagaion(W1, b1, W2, b2, Z1, A1, Z2, A2, X, Y):
m = X.shape[1]
dZ2 = A2 - Y
dW2 = (1 / m) * np.dot(dZ2, A1.T)
db2 = (1 / m) * np.sum(dZ2, axis=1)
dA1 = np.dot(W2.T, dZ2)
dZ1 = np.multiply(dA1, 1 - np.power(A1, 2))
dW1 = (1 / m) * np.dot(dZ1, X.T)
db1 = (1 / m) * np.sum(dZ1, axis=1)
return dW1, db1, dW2, db2
def nn_model(X, Y, n_h, num_iterations, print_cost=False):
n_x = X.shape[0]
n_y = Y.shape[0]
W1, b1, W2, b2 = initialize_parameters(n_x, n_h, n_y)
for i in range(num_iterations):
Z1, A1, Z2, A2 = forward_propagation(X, W1, b1, W2, b2)
cost = comput_cost(A2, Y)
dW1, db1, dW2, db2 = backward_propagaion(W1, b1, W2, b2, Z1, A1, Z2, A2, X, Y)
learing_rate = 0.5
W1 = W1 - learing_rate * dW1
b1 = b1 - learing_rate * db1
W2 = W2 - learing_rate * dW2
b2 = b2 - learing_rate * db2
if print_cost:
if i % 1000 == 0:
print("iteration: ", i, "cost: " + str(cost))
return W1, b1, W2, b2
def predict(W1, b1, W2, b2, X):
Z1, A1, Z2, A2 = forward_propagation(X, W1, b1, W2, b2)
predictions = np.round(A2)
return predictions
def sigmoid(x):
s = 1 / (1 + np.exp(-x))
return s
def normalize(Samples):
meanValue = np.mean(Samples, axis=0)
stdValue = np.std(Samples, axis=0)
Samples2 = (Samples - meanValue) / stdValue
return Samples2