如何查看TensorFlow模型参数?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 参数 正文

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

查看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
  • 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])

如何查看:

  1. 在终端运行命令:tensorboard --logdir logs/fit
  2. 打开浏览器访问提供的 URL(通常是 http://localhost:6006)。
  3. 在 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
  • MaxPooling2DFlatten: 这两种层不包含任何可训练的参数,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 使用。

-- 展开阅读全文 --
头像
macmini2025拆机教程
« 上一篇 今天
JavaScript参数e是什么,有什么用?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]