keras模型输出形状中的方括号

keras模型输出形状中的方括号,keras,Keras,我最近在查看模型摘要时遇到了这种情况 我想知道,[(无,16)]和(无,16)之间有什么区别?为什么输入层有这样的输入形状 来源:问题在于如何定义输入形状。python中的单个元素元组实际上是一个标量值,如下所示- input_shape0 = 32 input_shape1 = (32) input_shape2 = (32,) print(input_shape0, input_shape1, input_shape2) 由于Keras函数APIInput需要一个作为元组的输入形状,因此

我最近在查看模型摘要时遇到了这种情况

我想知道,
[(无,16)]
(无,16)
之间有什么区别?为什么输入层有这样的输入形状


来源:

问题在于如何定义输入形状。python中的单个元素元组实际上是一个标量值,如下所示-

input_shape0 = 32
input_shape1 = (32)
input_shape2 = (32,)
print(input_shape0, input_shape1, input_shape2)
由于Keras函数API
Input
需要一个作为元组的输入形状,因此必须以
(n,)
的形式传递它,而不是
n

奇怪的是,你会得到一个方括号,因为当我运行完全相同的代码时,我会得到一个错误

TypeError                                 Traceback (most recent call last)
<ipython-input-828-b564be68c80d> in <module>
     33 
     34 if __name__ == '__main__':
---> 35     mlp = MLP((16))
     36     mlp.summary()

<ipython-input-828-b564be68c80d> in __init__(self, input_shape, **kwargs)
      6         super(MLP, self).__init__(**kwargs)
      7         # Add input layer
----> 8         self.input_layer = klayers.Input(input_shape)
      9 
     10         self.dense_1 = klayers.Dense(64, activation='relu')

~/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/input_layer.py in Input(shape, batch_size, name, dtype, sparse, tensor, **kwargs)
    229       dtype=dtype,
    230       sparse=sparse,
--> 231       input_tensor=tensor)
    232   # Return tensor including `_keras_history`.
    233   # Note that in this case train_output and test_output are the same pointer.

~/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/input_layer.py in __init__(self, input_shape, batch_size, dtype, input_tensor, sparse, name, **kwargs)
     89     if input_tensor is None:
     90       if input_shape is not None:
---> 91         batch_input_shape = (batch_size,) + tuple(input_shape)
     92       else:
     93         batch_input_shape = None

TypeError: 'int' object is not iterable

你能不能也为你使用的模型定义添加代码?这是这篇文章的最后一条评论。对于TF2.3和2.4,我仍然得到上面阿克什·塞格尔例子的方括号:“[(无,16)]”:(
TypeError                                 Traceback (most recent call last)
<ipython-input-828-b564be68c80d> in <module>
     33 
     34 if __name__ == '__main__':
---> 35     mlp = MLP((16))
     36     mlp.summary()

<ipython-input-828-b564be68c80d> in __init__(self, input_shape, **kwargs)
      6         super(MLP, self).__init__(**kwargs)
      7         # Add input layer
----> 8         self.input_layer = klayers.Input(input_shape)
      9 
     10         self.dense_1 = klayers.Dense(64, activation='relu')

~/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/input_layer.py in Input(shape, batch_size, name, dtype, sparse, tensor, **kwargs)
    229       dtype=dtype,
    230       sparse=sparse,
--> 231       input_tensor=tensor)
    232   # Return tensor including `_keras_history`.
    233   # Note that in this case train_output and test_output are the same pointer.

~/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/input_layer.py in __init__(self, input_shape, batch_size, dtype, input_tensor, sparse, name, **kwargs)
     89     if input_tensor is None:
     90       if input_shape is not None:
---> 91         batch_input_shape = (batch_size,) + tuple(input_shape)
     92       else:
     93         batch_input_shape = None

TypeError: 'int' object is not iterable
from tensorflow import keras
from tensorflow.keras import layers as klayers

class MLP(keras.Model):
    def __init__(self, input_shape=(32,), **kwargs):
        super(MLP, self).__init__(**kwargs)
        # Add input layer
        self.input_layer = klayers.Input(input_shape)

        self.dense_1 = klayers.Dense(64, activation='relu')
        self.dense_2 = klayers.Dense(10)

        # Get output layer with `call` method
        self.out = self.call(self.input_layer)

        # Reinitial
        super(MLP, self).__init__(
            inputs=self.input_layer,
            outputs=self.out,
            **kwargs)

    def build(self):
        # Initialize the graph
        self._is_graph_network = True
        self._init_graph_network(
            inputs=self.input_layer,
            outputs=self.out
        )

    def call(self, inputs):
        x = self.dense_1(inputs)
        return self.dense_2(x)

if __name__ == '__main__':
    mlp = MLP((16,))
    mlp.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_19 (InputLayer)        (None, 16)                0         
_________________________________________________________________
dense_8 (Dense)              (None, 64)                1088      
_________________________________________________________________
dense_9 (Dense)              (None, 10)                650       
=================================================================
Total params: 1,738
Trainable params: 1,738
Non-trainable params: 0
_________________________________________________________________