使用Python函数实现神经网络
发布时间:2023-05-20 02:39:28
神经网络是一种基于人脑神经系统结构的模型,它由神经元和连接它们的权重组成。神经网络是人工智能的重要分支之一,被广泛应用于计算机视觉、自然语言处理、语音识别等领域。
Python是一种高级编程语言,它简单易学、开发效率高、支持多种操作系统和平台,成为人工智能领域的主要编程语言之一。Python具有丰富的库和工具,包括NumPy、Pandas、Matplotlib、Keras等,可以方便地实现神经网络。
在Python中,使用函数定义神经网络可以简单方便,以下是一个实现两层神经网络的Python函数示例:
import numpy as np
def sigmoid(x):
return 1/(1+np.exp(-x))
def initialize_parameters(layer_dims):
parameters = {}
L = len(layer_dims)
for l in range(1, L):
parameters[f'W{l}'] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01
parameters[f'b{l}'] = np.zeros((layer_dims[l], 1))
return parameters
def forward_propagation(X, parameters):
L = len(parameters) // 2
A = X
for l in range(1, L):
A_prev = A
Z = np.dot(parameters[f'W{l}'], A_prev) + parameters[f'b{l}']
A = sigmoid(Z)
ZL = np.dot(parameters[f'W{L}'], A) + parameters[f'b{L}']
AL = sigmoid(ZL)
return AL
def compute_cost(AL, Y):
m = Y.shape[1]
cost = -1/m * np.sum(Y*np.log(AL) + (1-Y)*np.log(1-AL))
cost = np.squeeze(cost)
return cost
def backward_propagation(AL, Y, cache, parameters):
grads = {}
L = len(parameters) // 2
m = Y.shape[1]
dAL = -(np.divide(Y, AL) - np.divide(1-Y, 1-AL))
dZL = dAL * AL * (1-AL)
grads[f'dW{L}'] = 1/m * np.dot(dZL, cache[f'A{L-1}'].T)
grads[f'db{L}'] = 1/m * np.sum(dZL, axis=1, keepdims=True)
dA = np.dot(parameters[f'W{L}'].T, dZL)
for l in reversed(range(1, L)):
dZ = dA * AL * (1-AL)
grads[f'dW{l}'] = 1/m * np.dot(dZ, cache[f'A{l-1}'].T)
grads[f'db{l}'] = 1/m * np.sum(dZ, axis=1, keepdims=True)
dA = np.dot(parameters[f'W{l}'].T, dZ)
return grads
def update_parameters(parameters, grads, learning_rate):
L = len(parameters) // 2
for l in range(1, L+1):
parameters[f'W{l}'] = parameters[f'W{l}'] - learning_rate * grads[f'dW{l}']
parameters[f'b{l}'] = parameters[f'b{l}'] - learning_rate * grads[f'db{l}']
return parameters
def two_layer_model(X, Y, layer_dims, num_iterations=10000, learning_rate=0.01, print_cost=False):
np.random.seed(1)
costs = []
parameters = initialize_parameters(layer_dims)
for i in range(num_iterations):
AL = forward_propagation(X, parameters)
cost = compute_cost(AL, Y)
grads = backward_propagation(AL, Y, cache, parameters)
parameters = update_parameters(parameters, grads, learning_rate)
if print_cost and i % 1000 == 0:
print(f'Cost after iteration {i}: {cost}')
if i % 100 == 0:
costs.append(cost)
return parameters, costs
在以上代码中,首先定义了一个sigmoid函数,它是神经网络中常用的激活函数之一,可以将输出值转换为0-1之间的概率值。接着定义了initialize_parameters函数,它用于初始化神经网络的权重和偏置项参数,使之符合正态分布。然后定义了forward_propagation函数,通过逐层计算神经网络的前向传播过程,得到输出值。接着定义了compute_cost函数,用于计算神经网络的损失值,这里采用交叉熵损失函数。然后定义了backward_propagation函数,用于计算神经网络的后向传播过程,得到每一层的梯度。最后定义了update_parameters函数,用于更新神经网络的参数值。最终,two_layer_model函数将上述函数结合起来,实现了一个两层神经网络的训练过程。它接收输入数据X和相应的标签Y,神经网络结构由参数layer_dims指定,num_iterations和learning_rate分别表示训练次数和学习率大小,可以通过print_cost参数控制是否输出损失值的变化过程。
