如何在Keras中获得图层的输出形状? [英] How to get the output shape of a layer in Keras?
问题描述
我在Keras中有以下代码(基本上我正在修改此代码以供使用),并且出现此错误:
I have the following code in Keras (Basically I am modifying this code for my use) and I get this error:
'ValueError:检查目标时出错:预期conv3d_3具有5个维,但数组的形状为(10,4096)'
'ValueError: Error when checking target: expected conv3d_3 to have 5 dimensions, but got array with shape (10, 4096)'
代码:
from keras.models import Sequential
from keras.layers.convolutional import Conv3D
from keras.layers.convolutional_recurrent import ConvLSTM2D
from keras.layers.normalization import BatchNormalization
import numpy as np
import pylab as plt
from keras import layers
# We create a layer which take as input movies of shape
# (n_frames, width, height, channels) and returns a movie
# of identical shape.
model = Sequential()
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
input_shape=(None, 64, 64, 1),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
padding='same', return_sequences=True))
model.add(BatchNormalization())
model.add(Conv3D(filters=1, kernel_size=(3, 3, 3),
activation='sigmoid',
padding='same', data_format='channels_last'))
model.compile(loss='binary_crossentropy', optimizer='adadelta')
我提供的数据采用以下格式:[1、10、64、64、1]. 所以我想知道我在哪里错了,以及如何查看每一层的output_shape.
the data I feed is in the following format: [1, 10, 64, 64, 1]. So I would like to know where I am wrong and also how to see the output_shape of each layer.
推荐答案
您可以通过 layer.output_shape
.
You can get the output shape of a layer by layer.output_shape
.
for layer in model.layers:
print(layer.output_shape)
给你:
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 40)
(None, None, 64, 64, 1)
或者,您可以使用 model.summary
Alternatively you can pretty print the model using model.summary
:
model.summary()
以漂亮的格式为您提供有关每个图层的参数数量和输出形状以及整体模型结构的详细信息:
Gives you the details about the number of parameters and output shapes of each layer and an overall model structure in a pretty format:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv_lst_m2d_1 (ConvLSTM2D) (None, None, 64, 64, 40) 59200
_________________________________________________________________
batch_normalization_1 (Batch (None, None, 64, 64, 40) 160
_________________________________________________________________
conv_lst_m2d_2 (ConvLSTM2D) (None, None, 64, 64, 40) 115360
_________________________________________________________________
batch_normalization_2 (Batch (None, None, 64, 64, 40) 160
_________________________________________________________________
conv_lst_m2d_3 (ConvLSTM2D) (None, None, 64, 64, 40) 115360
_________________________________________________________________
batch_normalization_3 (Batch (None, None, 64, 64, 40) 160
_________________________________________________________________
conv_lst_m2d_4 (ConvLSTM2D) (None, None, 64, 64, 40) 115360
_________________________________________________________________
batch_normalization_4 (Batch (None, None, 64, 64, 40) 160
_________________________________________________________________
conv3d_1 (Conv3D) (None, None, 64, 64, 1) 1081
=================================================================
Total params: 407,001
Trainable params: 406,681
Non-trainable params: 320
_________________________________________________________________
如果只想访问有关特定图层的信息,则可以在构造该图层时使用name
参数,然后像这样调用:
If you want to access information about a specific layer only, you can use name
argument when constructing that layer and then call like this:
...
model.add(ConvLSTM2D(..., name='conv3d_0'))
...
model.get_layer('conv3d_0')
作为参考,它将始终与layer.output_shape
相同,请不要为此实际使用Lambda或自定义图层.但是您可以使用 Lambda
层来回显经过的张量的形状.
For reference sake it will always be same as layer.output_shape
and please don't actually use Lambda or custom layers for this. But you can use Lambda
layer to echo the shape of a passing tensor.
...
def print_tensor_shape(x):
print(x.shape)
return x
model.add(Lambda(print_tensor_shape))
...
或编写一个自定义层,并在call()
上打印张量的形状.
Or write a custom layer and print the shape of the tensor on call()
.
class echo_layer(Layer):
...
def call(self, x):
print(x.shape)
return x
...
model.add(echo_layer())
这篇关于如何在Keras中获得图层的输出形状?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!