下面我将从 核心方法、进阶方法、查看训练过程中的参数 以及 一个完整的示例 四个方面,为你详细讲解如何查看 TensorFlow 参数。

(图片来源网络,侵删)
核心方法:使用 model.summary()
这是最常用、最直接的方法,适用于绝大多数由 Keras API 构建的模型,它会打印出一个模型各层的详细信息,包括输出形状、参数数量和总参数量。
如何使用:
在你定义并构建好模型后,直接调用 .summary() 方法即可。
import tensorflow as tf
# 1. 定义一个简单的 Sequential 模型
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 2. 调用 summary() 方法查看参数
model.summary()
输出示例:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 128) 100480
dense_1 (Dense) (None, 64) 8256
dense_2 (Dense) (None, 10) 650
=================================================================
Total params: 109,386
Trainable params: 109,386
Non-trainable params: 0
_________________________________________________________________
输出解读:
- Layer (type): 层的名称和类型(如
Dense,Conv2D)。 - Output Shape: 该层的输出张量的形状。
None通常代表批处理大小。 - Param #: 该层的参数数量。
- Dense 层参数计算:
输入节点数 * 输出节点数 + 偏置项数量。- 第一层
Dense:(784 * 128) + 128 = 100480 - 第二层
Dense:(128 * 64) + 64 = 8256 - 第三层
Dense:(64 * 10) + 10 = 650
- 第一层
- Dense 层参数计算:
- Total params: 模型中所有参数的总和。
- Trainable params: 在训练过程中会通过梯度更新进行优化的参数数量。
- Non-trainable params: 不会被训练的参数数量,在使用
BatchNormalization层时,其移动平均和方差参数默认是不可训练的,在使用预训练模型(如tf.keras.applications.VGG16)进行迁移学习并冻结底层时,这些参数也会变为不可训练。
进阶方法:使用 model.get_weights()
如果你想获取每一层具体的参数值(即权重和偏置),而不仅仅是它们的数量,可以使用 get_weights() 方法。
如何使用:
该方法返回一个列表,列表中的每个元素对应一个层的参数,对于 Dense 层,通常是 [权重矩阵, 偏置向量]。
# 接续上面的模型
# 获取所有层的权重
all_weights = model.get_weights()
# 打印第一层(Dense)的权重和偏置
layer_weights = all_weights[0]
layer_biases = all_weights[1]
print(f"第一层权重矩阵的形状: {layer_weights.shape}")
print(f"第一层偏置向量的形状: {layer_biases.shape}")
# 你可以进一步查看具体的数值(通常不建议打印所有,因为数据量很大)
# print("\n第一层权重矩阵 (前5行, 前5列):")
# print(layer_weights[:5, :5])
输出示例:
第一层权重矩阵的形状: (784, 128)
第一层偏置向量的形状: (128,)
这个方法非常适合:
- 检查权重初始化:查看权重是否按预期初始化(是否很小)。
- 模型分析:对权重进行统计分析(如计算均值、标准差)。
- 模型转换/部署:在某些情况下,你可能需要提取权重并将其用于其他框架。
查看训练过程中的参数
在训练模型时,你可能想监控参数是如何变化的,这通常通过回调函数来实现。
如何使用:
tf.keras.callbacks.TensorBoard 回调可以记录模型的所有权重和偏置,你可以在 TensorBoard 中进行可视化。
# 定义一个 TensorBoard 回调
log_dir = "logs/fit/"
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir=log_dir, histogram_freq=1)
# 编译并训练模型,传入回调
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 假设我们有 (x_train, y_train) 数据
# model.fit(x_train, y_train, epochs=5, callbacks=[tensorboard_callback])
如何查看:
- 在终端运行命令:
tensorboard --logdir logs/fit - 打开浏览器访问提供的 URL(通常是
http://localhost:6006)。 - 在 TensorBoard 界面中,导航到 "Projector" 或 "Distributions/Histograms" 标签页,你就可以看到每一层参数的分布直方图,并可以随着训练的进行观察其变化。
完整示例:查看一个 CNN 模型的参数
下面是一个更完整的例子,展示如何为一个卷积神经网络 查看参数。
import tensorflow as tf
# 1. 定义一个 CNN 模型
model = tf.keras.models.Sequential([
# Convolutional Layer 1
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D((2, 2)),
# Convolutional Layer 2
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
# Flatten and Dense Layers
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 2. 调用 summary() 查看参数
model.summary()
# 3. (可选) 计算总参数量的另一种方式
total_params = model.count_params()
print(f"\n通过 count_params() 方法计算的总参数量: {total_params}")
CNN 模型输出解读:
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 26, 26, 32) 320
max_pooling2d (MaxPooling2D (None, 13, 13, 32) 0
)
conv2d_1 (Conv2D) (None, 11, 11, 64) 18496
max_pooling2d_1 (MaxPooling (None, 5, 5, 64) 0
2D)
flatten (Flatten) (None, 1600) 0
dense_3 (Dense) (None, 128) 204928
dense_4 (Dense) (None, 10) 1290
=================================================================
Total params: 225,034
Trainable params: 225,034
Non-trainable params: 0
_________________________________________________________________
CNN 参数计算说明:
Conv2D层参数:- 参数数量 =
(输入通道数 * 卷积核高度 * 卷积核宽度 + 1) * 输出滤波器数量 +1是指偏置项。- 第一层
Conv2D:(1 * 3 * 3 + 1) * 32 = 320 - 第二层
Conv2D:(32 * 3 * 3 + 1) * 64 = 18496
- 参数数量 =
MaxPooling2D和Flatten层: 这两种层不包含任何可训练的参数,Param #为 0。Dense层: 计算方式与之前相同,注意Flatten层将(5, 5, 64)的输出展平为5*5*64 = 1600个节点。
| 方法 | 用途 | 优点 | 缺点 |
|---|---|---|---|
model.summary() |
快速查看模型结构和总参数量 | 最常用,信息清晰,一目了然 | 无法查看具体参数值 |
model.get_weights() |
获取每一层具体的权重和偏置值 | 可以对参数进行详细分析和操作 | 返回的是张量列表,不直观,数据量大 |
model.count_params() |
仅获取模型总参数数量 | 简单直接,只返回一个数字 | 信息量最少,不提供分层信息 |
TensorBoard 回调 |
可视化训练过程中参数的变化 | 可视化效果好,便于监控训练动态 | 需要额外步骤启动 TensorBoard |
对于日常开发和调试,model.summary() 是你的首选工具,当你需要深入分析或调试时,再结合 get_weights() 和 TensorBoard 使用。
