作业(2023年9月13日)

我对全链接神经网络理解

全连接神经网络在我看来就是多层感知器,是一种常见的人工神经网络模型。它包括一个或多个全连接层(我觉得也可以叫密集层或仿射层)和一些非线性激活函数层,用于解决各种机器学习任务,特别是在图像分类、自然语言处理、回归分析等领域中取得了成功。

我分析的其结构为:

  1. 输入层: 接受原始输入数据的层。每个输入特征都与输入层中的一个神经元相对应。

  2. 隐藏层: 这些层位于输入层和输出层之间。每个隐藏层都由多个神经元组成,每个神经元都与上一层的每个神经元相连接。隐藏层的数量和神经元的数量是可以调整的超参数。这些层的存在允许模型捕获输入数据中的复杂关系。

  3. 全连接层: 也称为输出层或密集层,这是网络的最后一层。在分类任务中,通常有与类别数目相等的神经元,每个神经元表示一个类别的得分或概率。

  4. 激活函数: 每个神经元都会应用一个非线性激活函数,如ReLU(Rectified Linear Unit)、Sigmoid或Tanh。这些函数引入了非线性性质,使神经网络能够学习复杂的函数映射。

  5. 前向传播: 数据从输入层经过隐藏层,最终到达输出层。每个神经元计算加权和,并将其输入到激活函数中。

  6. 反向传播: 用于训练神经网络的算法。通过比较网络的预测输出与实际目标值,计算损失函数,并反向传播误差以更新网络中的权重和偏差。

  7. 损失函数: 用于衡量模型输出与实际目标之间的差距,通常使用交叉熵损失(Cross-Entropy Loss)用于分类任务和均方误差(Mean Squared Error)用于回归任务

全连接神经网络在许多任务上表现良好,但对于复杂的问题,可能需要更深、更复杂的网络结构,例如卷积神经网络(CNN)用于图像处理或循环神经网络(RNN)用于序列数据。然而,全连接神经网络仍然是理解神经网络工作原理的基础。

全链接神经网络python代码:

import numpy as np

# 定义激活函数(这里使用Sigmoid函数)
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 定义网络结构
input_size = 2
hidden_size = 4
output_size = 1
learning_rate = 0.01

# 初始化权重和偏置
np.random.seed(0)
weights_input_hidden = np.random.randn(input_size, hidden_size)
bias_input_hidden = np.zeros((1, hidden_size))
weights_hidden_output = np.random.randn(hidden_size, output_size)
bias_hidden_output = np.zeros((1, output_size))

# 训练数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])

# 训练神经网络
for epoch in range(10000):
    # 前向传播
    hidden_input = np.dot(X, weights_input_hidden) + bias_input_hidden
    hidden_output = sigmoid(hidden_input)
    output_input = np.dot(hidden_output, weights_hidden_output) + bias_hidden_output
    predicted_output = sigmoid(output_input)

    # 计算损失函数
    loss = 0.5 * np.sum((predicted_output - y) ** 2)

    # 反向传播
    delta_output = (predicted_output - y) * predicted_output * (1 - predicted_output)
    delta_hidden = np.dot(delta_output, weights_hidden_output.T) * hidden_output * (1 - hidden_output)

    # 更新权重和偏置
    weights_hidden_output -= learning_rate * np.dot(hidden_output.T, delta_output)
    bias_hidden_output -= learning_rate * np.sum(delta_output, axis=0)
    weights_input_hidden -= learning_rate * np.dot(X.T, delta_hidden)
    bias_input_hidden -= learning_rate * np.sum(delta_hidden, axis=0)

    if epoch % 1000 == 0:
        print(f"Epoch {epoch}, Loss: {loss}")

# 在训练集上测试模型
hidden_input = np.dot(X, weights_input_hidden) + bias_input_hidden
hidden_output = sigmoid(hidden_input)
output_input = np.dot(hidden_output, weights_hidden_output) + bias_hidden_output
predicted_output = sigmoid(output_input)

print("Predicted Output:")
print(predicted_output)

以上为使用Python和NumPy库实现的简单全连接神经网络的代码,包括前向传播和反向传播的基本步骤,并使用梯度下降来更新权重和偏置。

全链接神经网络python运行截图:

全链接神经网络数学公式推导:

前向传播:

反向传播:

单个变量的求导

最终可得:

结果是相当整齐且优雅的。

此外,只要将前面数据中的1改为m,即为batch size

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值