【问题标题】:output of model.summary() is not as expected tensorflow 2model.summary() 的输出与预期的 tensorflow 2 不同
【发布时间】:2021-01-14 21:18:54
【问题描述】:

我已经定义了一个复杂的深度学习模型,但出于这个问题的目的,我将使用一个简单的模型。

考虑以下几点:

import tensorflow as tf
from tensorflow.keras import layers, models


def simpleMLP(in_size, hidden_sizes, num_classes, dropout_prob=0.5):
    in_x = layers.Input(shape=(in_size,))
    hidden_x = models.Sequential(name="hidden_layers")
    for i, num_h in enumerate(hidden_sizes):
        hidden_x.add(layers.Dense(num_h, input_shape=(in_size,) if i == 0 else []))
        hidden_x.add(layers.Activation('relu'))
        hidden_x.add(layers.Dropout(dropout_prob))
    out_x = layers.Dense(num_classes, activation='softmax', name='baseline')
    return models.Model(inputs=in_x, outputs=out_x(hidden_x(in_x)))

我会以如下方式调用函数:

mdl = simpleMLP(28*28, [500, 300], 10)

现在当我执行mdl.summary() 时,我得到以下信息:

Model: "functional_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 784)]             0         
_________________________________________________________________
hidden_layers (Sequential)   (None, 300)               542800    
_________________________________________________________________
baseline (Dense)             (None, 10)                3010      
=================================================================
Total params: 545,810
Trainable params: 545,810
Non-trainable params: 0
_________________________________________________________________

问题是Sequential块被压缩了,只显示最后一层,但参数的总和。

在我的复杂模型中,我有多个 Sequential 块全部隐藏。

有没有办法让它更冗长?我在模型定义中做错了吗?

编辑

使用pytorch 时,我看不到相同的行为,给出以下示例(取自here):

import torch
import torch.nn as nn


class MyCNNClassifier(nn.Module):
    def __init__(self, in_c, n_classes):
        super().__init__()
        self.conv_block1 = nn.Sequential(
            nn.Conv2d(in_c, 32, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU()
        )

        self.conv_block2 = nn.Sequential(
            nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU()
        )

        self.decoder = nn.Sequential(
            nn.Linear(32 * 28 * 28, 1024),
            nn.Sigmoid(),
            nn.Linear(1024, n_classes)
        )

    def forward(self, x):
        x = self.conv_block1(x)
        x = self.conv_block2(x)

        x = x.view(x.size(0), -1)  # flat

        x = self.decoder(x)

        return x

打印时我得到:

MyCNNClassifier(
  (conv_block1): Sequential(
    (0): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (2): ReLU()
  )
  (conv_block2): Sequential(
    (0): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (2): ReLU()
  )
  (decoder): Sequential(
    (0): Linear(in_features=25088, out_features=1024, bias=True)
    (1): Sigmoid()
    (2): Linear(in_features=1024, out_features=10, bias=True)
  )
)

【问题讨论】:

    标签: python python-3.x keras tensorflow2.0


    【解决方案1】:

    Tensorflow 2.x 中的模型总结没有错。

    import tensorflow as tf
    from tensorflow.keras import layers, models
    
    def simpleMLP(in_size, hidden_sizes, num_classes, dropout_prob=0.5):
        in_x = layers.Input(shape=(in_size,))
        hidden_x = models.Sequential(name="hidden_layers")
        for i, num_h in enumerate(hidden_sizes):
            hidden_x.add(layers.Dense(num_h, input_shape=(in_size,) if i == 0 else []))
            hidden_x.add(layers.Activation('relu'))
            hidden_x.add(layers.Dropout(dropout_prob))
        out_x = layers.Dense(num_classes, activation='softmax', name='baseline')
        return models.Model(inputs=in_x, outputs=out_x(hidden_x(in_x)))
    
    mdl = simpleMLP(28*28, [500, 300], 10)
    mdl.summary()
    

    输出:

    Model: "functional_1"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_1 (InputLayer)         [(None, 784)]             0         
    _________________________________________________________________
    hidden_layers (Sequential)   (None, 300)               542800    
    _________________________________________________________________
    baseline (Dense)             (None, 10)                3010      
    =================================================================
    Total params: 545,810
    Trainable params: 545,810
    Non-trainable params: 0
    _________________________________________________________________
    

    您可以使用get_layer 根据图层的名称或索引检索图层。

    如果同时提供名称和索引,则索引优先。 索引基于水平图遍历的顺序(自下而上)。

    这里获取Sequential层(即mdl中索引为1)的详细信息,你可以试试

    mdl.get_layer(index=1).summary()
    

    输出:

    Model: "hidden_layers"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    dense_2 (Dense)              (None, 500)               392500    
    _________________________________________________________________
    activation_2 (Activation)    (None, 500)               0         
    _________________________________________________________________
    dropout_2 (Dropout)          (None, 500)               0         
    _________________________________________________________________
    dense_3 (Dense)              (None, 300)               150300    
    _________________________________________________________________
    activation_3 (Activation)    (None, 300)               0         
    _________________________________________________________________
    dropout_3 (Dropout)          (None, 300)               0         
    =================================================================
    Total params: 542,800
    Trainable params: 542,800
    Non-trainable params: 0
    _________________________________________________________________
    

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 2019-12-12
      • 2014-02-08
      • 2022-07-06
      • 2019-05-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多