resnet18网络图
时间: 2025-05-12 17:39:59 浏览: 21
### ResNet-18 网络架构图及其结构可视化
ResNet-18 是一种经典的残差网络(Residual Network),其核心思想在于通过引入残差连接解决了深层神经网络中的梯度消失问题,从而使得训练更深的网络成为可能。以下是关于 ResNet-18 的网络结构以及如何可视化的详细介绍。
#### 1. ResNet-18 网络结构概述
ResNet-18 属于较浅层的 ResNet 架构之一,由多个堆叠的基础模块(BasicBlock)组成。整个网络主要分为以下几个阶段:
- **输入层**:通常是一个 $7 \times 7$ 的卷积核,步幅为 2,用于降低空间维度并提取初始特征[^1]。
- **池化层**:紧接着输入层的是一个最大池化操作 ($3 \times 3$, stride=2),进一步减少数据量。
- **四个残差块组**:每个组包含两个 BasicBlock 模块,分别对应不同的通道数和下采样策略。
- **全局平均池化层** 和 **全连接层**:最终将特征映射压缩成固定大小,并输出分类结果。
具体层数分布如下表所示:
| Stage | Number of Blocks | Output Channels |
|-------|------------------|-----------------|
| conv1 | - | 64 |
| layer1| 2 (BasicBlocks) | 64 |
| layer2| 2 (BasicBlocks) | 128 |
| layer3| 2 (BasicBlocks) | 256 |
| layer4| 2 (BasicBlocks) | 512 |
#### 2. ResNet-18 网络结构图示例
以下是一张典型的 ResNet-18 网络结构图,展示了各层之间的连接关系以及残差路径的作用:

该图清晰地描绘了每一段残差块内的跳跃连接(skip connection)。这些跳过某些层的设计允许梯度直接回传到更早的层,缓解了传统 CNN 中存在的退化问题。
#### 3. 使用 Python 实现 ResNet-18 并进行结构可视化
为了更好地理解 ResNet-18 的工作原理,可以通过代码构建模型并将其中间层的结果展示出来。下面提供了一个基于 Keras/TensorFlow 的简单实现方式[^2]。
##### 定义 ResNet-18 模型
```python
import tensorflow as tf
from tensorflow.keras import layers, models
class BasicBlock(models.Model):
expansion = 1
def __init__(self, out_channels, strides=1, downsample=None):
super(BasicBlock, self).__init__()
self.conv1 = layers.Conv2D(out_channels, kernel_size=3, strides=strides, padding='same')
self.bn1 = layers.BatchNormalization()
self.relu = layers.ReLU()
self.conv2 = layers.Conv2D(out_channels, kernel_size=3, padding='same')
self.bn2 = layers.BatchNormalization()
self.downsample = downsample
def call(self, x):
identity = x
if self.downsample is not None:
identity = self.downsample(x)
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out += identity
out = self.relu(out)
return out
def make_layer(block, channels, blocks, stride=1):
downsample = None
if stride != 1 or block.expansion * channels != channels:
downsample = models.Sequential([
layers.Conv2D(channels * block.expansion, kernel_size=1, strides=stride),
layers.BatchNormalization()
])
layers_list = []
layers_list.append(block(channels, stride, downsample))
for _ in range(1, blocks):
layers_list.append(block(channels))
return models.Sequential(layers_list)
def ResNet18():
model = models.Sequential([
layers.Conv2D(64, kernel_size=7, strides=2, input_shape=(224, 224, 3), padding='same'),
layers.BatchNormalization(),
layers.ReLU(),
layers.MaxPooling2D(pool_size=3, strides=2, padding='same'),
make_layer(BasicBlock, 64, 2),
make_layer(BasicBlock, 128, 2, stride=2),
make_layer(BasicBlock, 256, 2, stride=2),
make_layer(BasicBlock, 512, 2, stride=2),
layers.GlobalAveragePooling2D(),
layers.Dense(1000, activation='softmax') # Assuming ImageNet classification task.
])
return model
```
##### 可视化中间层特征图
可以借助 `matplotlib` 库绘制不同层次下的激活响应情况[^3]:
```python
import matplotlib.pyplot as plt
import numpy as np
model = ResNet18()
# Load an image and preprocess it accordingly...
img_path = 'example.jpg'
image = tf.keras.preprocessing.image.load_img(img_path, target_size=(224, 224))
input_arr = tf.keras.preprocessing.image.img_to_array(image)
input_arr = np.array([input_arr]) / 255.
activations = [layer.output for layer in model.layers[:10]] # Select first few layers only
activation_model = tf.keras.models.Model(inputs=model.input, outputs=activations)
outputs = activation_model.predict(input_arr)
for i, output in enumerate(outputs):
fig, axarr = plt.subplots(4, 4, figsize=(10, 10)) # Adjust subplot size based on feature maps count
for j in range(min(output.shape[-1], 16)): # Show up to 16 filters per layer
row_idx = int(j / 4); col_idx = j % 4;
axarr[row_idx][col_idx].imshow(output[0, :, :, j])
axarr[row_idx][col_idx].axis('off')
plt.suptitle(f'Layer {i}')
plt.show()
```
上述脚本会逐层显示所选范围内的滤波器输出效果,帮助观察低级边缘检测至高级语义解析的变化过程。
#### 4. Grad-CAM 方法辅助解释模型决策逻辑
如果希望深入探究特定类别预测背后的原因,则可采用 Gradient-weighted Class Activation Mapping 技术,在热力图形式上标注重要区域位置[^4]。
---
###
阅读全文
相关推荐


















