全连接网络和全卷积网络不一样
以下是对两者的正确解释和代码示例:
1. 全连接网络(Fully Connected Network)
全连接网络使用的是 线性层 (nn.Linear
),也就是我们常说的"全连接层"。它是用于将每一个输入节点与输出节点直接连接的网络结构。
python
import torch
import torch.nn as nn
import torch.nn.functional as F
class FullyConnectedNetwork(nn.Module):
def __init__(self, input_size=128, hidden_size=64, output_size=10):
super(FullyConnectedNetwork, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size) # 全连接层1
self.fc2 = nn.Linear(hidden_size, hidden_size) # 全连接层2
self.fc3 = nn.Linear(hidden_size, output_size) # 全连接层3
def forward(self, x):
x = F.relu(self.fc1(x)) # 激活函数
x = F.relu(self.fc2(x))
x = self.fc3(x) # 输出层
return x
# 测试
model = FullyConnectedNetwork()
input_data = torch.randn(32, 128) # 输入为 (batch_size, 输入特征维度)
output = model(input_data)
print(output.shape) # 输出形状: (32, 10)
这里的 nn.Linear
代表全连接层,每个神经元都与下一层的每个神经元直接相连。
2. 全卷积网络(Fully Convolutional Network)
全卷积网络则使用的是 卷积层 (nn.Conv2d
),适用于图像或空间数据处理,不使用 nn.Linear
。卷积层的好处在于可以捕获空间结构特征,同时能处理任意大小的输入。
以下是一个简单的全卷积网络示例:
python
import torch
import torch.nn as nn
import torch.nn.functional as F
class FullyConvolutionalNetwork(nn.Module):
def __init__(self):
super(FullyConvolutionalNetwork, self).__init__()
self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1) # 卷积层1
self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1) # 卷积层2
self.conv3 = nn.Conv2d(in_channels=32, out_channels=10, kernel_size=3, padding=1) # 卷积层3
def forward(self, x):
x = F.relu(self.conv1(x)) # 激活函数
x = F.relu(self.conv2(x))
x = self.conv3(x) # 输出层
return x
# 测试
model = FullyConvolutionalNetwork()
input_data = torch.randn(32, 3, 64, 64) # 输入为 (batch_size, 通道数, 高, 宽)
output = model(input_data)
print(output.shape) # 输出形状: (32, 10, 64, 64)
在这里,nn.Conv2d
代表卷积层,它通过卷积操作提取空间特征,适合处理图像类的输入数据。
总结
- 全连接网络 :使用
nn.Linear
(线性层),适合用于固定大小的输入,通常用于特征向量或结构化数据。 - 全卷积网络 :使用
nn.Conv2d
(卷积层),适合处理图像和空间数据,可用于任意大小的输入。