神经网络层
sigmoid
在 Python 中,可以这样做:
import torch
x = torch.tensor([1.0, 2.0, -1.0, 0.0])
x_sigmoid = torch.sigmoid(x)
print(x_sigmoid) # 输出 tensor([0.7311, 0.8808, 0.2689, 0.5000])
torch.sigmoid
会对输入的每个元素进行操作,返回一个与输入形状相同的 tensor,其中每个元素都是对应的 sigmoid 值。
sigmoid 函数将其输入的每个元素映射到 0 和 1 之间。因此,结果数组中的每个值都被归一化到了这个范围内。这个特性使得 sigmoid 函数常用于需要输出概率值或在 0 和 1 之间进行归一化的情况。
Liner层(全连接层)
主要用于改变输出维度
全连接层(Fully Connected Layer,简称 FC 层)是神经网络中的一种基本层,其主要作用是将输入的特征进行线性变换,然后通过一个非线性激活函数(如ReLU)进行处理。全连接层的作用和意义包括:
- 特征变换和组合:全连接层能够将输入特征映射到一个新的空间,通过线性变换和非线性激活函数的组合,使模型能够捕捉到数据中的复杂特征和模式。
- 信息集成:全连接层将输入的所有特征与输出的每一个神经元连接,允许模型在不同特征之间进行信息整合,从而提高模型的表达能力。
- 维度变化:全连接层可以改变输入的特征维度,通常用于将高维特征向低维特征压缩,或者将低维特征向高维特征扩展,为后续的网络层提供合适的输入维度。
- 分类和回归任务:在分类任务中,全连接层的输出通常对应于类别的数量;在回归任务中,全连接层的输出通常是预测值。
以下是一个简单的代码示例,展示了全连接层的基本使用。这个示例使用PyTorch框架定义一个简单的神经网络,并展示输入和输出的变化。
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的神经网络,包含一个全连接层
class SimpleNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size) # 全连接层1
self.relu = nn.ReLU() # ReLU激活函数
self.fc2 = nn.Linear(hidden_size, output_size) # 全连接层2
def forward(self, x):
out = self.fc1(x) # 通过全连接层1
out = self.relu(out) # 通过ReLU激活函数
out = self.fc2(out) # 通过全连接层2
return out
# 示例输入
input_size = 4 # 输入特征维度
hidden_size = 5 # 隐藏层神经元数量
output_size = 3 # 输出维度(例如,3个分类)
batch_size = 2 # 批次大小
# 创建网络实例
model = SimpleNN(input_size, hidden_size, output_size)
# 创建随机输入数据(批次大小为2,特征维度为4)
inputs = torch.randn(batch_size, input_size)
print("输入:")
print(inputs)
# 通过网络进行前向传播
outputs = model(inputs)
print("输出:")
print(outputs)
在这个示例中,网络包含两个全连接层(fc1
和 fc2
)以及一个ReLU激活函数。网络的输入维度为4,隐藏层的神经元数量为5,输出维度为3。以下是输入和输出的示例:
输入:
tensor([[ 0.1234, -0.2345, 0.3456, -0.4567],
[ 0.5678, -0.6789, 0.7890, -0.8901]])
输出:
tensor([[-0.1234, 0.2345, -0.3456],
[ 0.4567, -0.5678, 0.6789]], grad_fn=<AddmmBackward0>)
在实际运行中,具体数值会根据随机初始化的权重和输入数据有所不同。全连接层将输入的特征通过线性变换(矩阵乘法和加法)映射到新的特征空间,然后通过激活函数引入非线性,从而使网络能够学习到复杂的特征表示和模式。