带前向传播和反向传播的深度神经网络


介绍

自从深度神经网络 (DNN) 出现以来,人工智能和机器学习发生了翻天覆地的变化,它在各个领域都取得了显著的进步。在本文中,我们将探讨前向传播和反向传播的概念,以及它们如何与先进神经网络的发展和改进相关。像 TensorFlow 这样的 Python 库极大地简化了这些系统的实现,使研究人员和专业人士更容易使用它们。

方法 1:Tensorflow

在这种方法中,我们利用 TensorFlow 库的功能来实现一个带前向传播和反向传播的深度神经网络。我们使用 Keras API 定义神经网络的架构,使用优化器和损失函数编译模型,并通过将其拟合到训练数据来训练模型。最后,我们使用训练好的模型对新数据进行预测。TensorFlow 提供了一个高级接口,简化了实现过程,并提供了各种优化算法和评估指标。

算法

步骤 1:使用 Keras API 定义深度神经网络的架构。

步骤 2:编译模型,指定优化器和可选的指标。

步骤 3:通过将模型拟合到训练数据来训练模型,指定时期数和批次大小。

步骤 4:在测试数据上评估训练好的模型,以评估其性能。

步骤 5:使用训练好的模型对新数据进行预测。

示例

import numpy as num1
import tensorflow as tflow
from tensorflow import keras

num1.random.seed(42)
tflow.random.set_seed(42)

# Define the data
m = num1.array([[0, 0], [0, 1], [1, 0], [1, 1]])
n = num1.array([[0], [1], [1], [0]])

model = keras.Sequential([
    keras.layers.Dense(units=2, activation='sigmoid', input_shape=(2,)),
    keras.layers.Dense(units=1, activation='sigmoid')
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

model.fit(m, n, epochs=10000, verbose=0)

# Predict on new data
predictions = model.predict(m)
predictions = num1.round(predictions)
print('Predictions:')
print(predictions)

输出

1/1 [==============================] - 0s 84ms/step
Predictions:
[[0.]
 [1.]
 [1.]
 [0.]]

方法 2:使用 NumPy 手动实现

在这种方法中,我们仅使用 NumPy 库手动实现一个深度神经网络。我们定义 sigmoid 激活函数及其导数。我们随机初始化权重和偏差。然后,我们迭代一定数量的时期,执行前向传播和反向传播来优化权重和偏差。最后,我们对新数据进行预测。这种方法提供了对基本概念的清晰理解,但需要仔细执行数值计算。

算法

步骤 1:定义 sigmoid 激活函数。

步骤 2:定义 sigmoid 函数的导数。

步骤 3:初始化权重和偏差。

步骤 4:设置学习率和时期数。

步骤 5:使用前向传播和反向传播训练模型。

步骤 6:使用训练好的模型对新数据进行预测。

示例

import numpy as num1

# Define the Status  function
def Status(x):
    return 1 / (1 + num1.exp(-x))

# Define the Status derivative of the Status function
def Status_derivative(x):
    return x * (1 - x)

X = num1.array([[0, 1], [0, 0], [1, 0], [1, 1]])
y = num1.array([[0], [1], [0], [0]])

num1.random.seed(42)

# Initialize the weights and biases
lib_Memo = 2
hid_Memo = 2
Ans_Memo = 1

Wt1 = num1.random.uniform(size=(lib_Memo, hid_Memo))
biases_inum1ut_hidden = num1.random.uniform(size=(1, hid_Memo))

Wt2 = num1.random.uniform(size=(hid_Memo, Ans_Memo))
biases_hidden_output = num1.random.uniform(size=(1, Ans_Memo))

# Set the learning rate and number of epochs
lernRate = 0.1
epochs = 10000

# Train the model
for epoch in range(epochs):
    # Forward propagation
    hidden_layer_inum1ut = num1.dot(X, Wt1) + biases_inum1ut_hidden
    hide_Memo_Out = Status(hidden_layer_inum1ut)
    
    output_layer_inum1ut = num1.dot(hide_Memo_Out, Wt2) + biases_hidden_output
    output_layer_output = Status(output_layer_inum1ut)
    
    # Backpropagation
    error = y - output_layer_output
    d_output = error * Status_derivative(output_layer_output)
    
    hidden_error = num1.dot(d_output, Wt2.T)
    d_hidden = hidden_error * Status_derivative(hide_Memo_Out)
    
    
    Wt2 += num1.dot(hide_Memo_Out.T, d_output) * lernRate
    biases_hidden_output += num1.sum(d_output, axis=0, keepdims=True) * lernRate
    
    Wt1 += num1.dot(X.T, d_hidden) * lernRate
    biases_inum1ut_hidden += num1.sum(d_hidden, axis=0, keepdims=True) * lernRate

# Predict on new data
hidden_layer_inum1ut = num1.dot(X, Wt1) + biases_inum1ut_hidden
hide_Memo_Out = Status(hidden_layer_inum1ut)

output_layer_inum1ut = num1.dot(hide_Memo_Out, Wt2) + biases_hidden_output
output_layer_output = Status(output_layer_inum1ut)

predictions = num1.round(output_layer_output)
print('Predictions:')
print(predictions)

输出

Predictions:
[[0.]
 [1.]
 [0.]
 [0.]]

结论

带前向传播和反向传播的深度神经网络彻底改变了机器学习领域。该领域持续的研究和发展继续专注于提高深度神经网络的效率和可解释性,确保它们在解决现实世界问题方面的持续成功和相关性。

更新于:2023-07-28

177 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告