Python 如何打印Tensorflow V2 keras模型的所有激活形状(比summary()更详细)?
我花了很多时间研究Tensorflow v.0和v.1,现在我正在尝试Tensorflow v.2 keras模型Python 如何打印Tensorflow V2 keras模型的所有激活形状(比summary()更详细)?,python,tensorflow,keras,tensorflow2.0,tf.keras,Python,Tensorflow,Keras,Tensorflow2.0,Tf.keras,我花了很多时间研究Tensorflow v.0和v.1,现在我正在尝试Tensorflow v.2 keras模型model.summary()看起来简单方便,但缺少细节 这里有一个玩具的例子。假设我定义自定义层和模型如下(一个函数式API样式和一个子类syle) 请看下面。我想在自定义层中查看基本层,但.summary()仅显示浅层信息(仅显示直接子层) 玩具自定义层(层只是玩具定义): 将tensorflow导入为tf 从tensorflow进口keras 从tensorflow.keras
model.summary()
看起来简单方便,但缺少细节
这里有一个玩具的例子。假设我定义自定义层和模型如下(一个函数式API样式和一个子类syle)
请看下面。我想在自定义层中查看基本层,但.summary()
仅显示浅层信息(仅显示直接子层)
玩具自定义层(层只是玩具定义):
将tensorflow导入为tf
从tensorflow进口keras
从tensorflow.keras.layers导入(稠密、Conv2D、批次标准化)
LayerA类(tf.keras.layers.Layer):
定义初始值(自身、数值输出,**kwargs):
超级(LayerA,self)。\uuuuu初始值(**kwargs)
self.num\u输出=num\u输出
self.dense1=密集(64)
self.dense2=密集(128)
self.dense3=密集(num_输出)
self.bn=批量标准化(可训练=真)
def调用(自我、输入、训练=真):
x=自密度1(输入)
x=自我.bn(x,培训=培训)
x=自密度1(输入)
x=自我.bn(x,培训=培训)
x=自密度1(输入)
x=自我.bn(x,培训=培训)
返回x
类别LayerB(tf.keras.layers.Layer):
定义初始值(自身、数值输出,**kwargs):
超级(LayerB,self)。\uuuuu初始值(**kwargs)
self.num\u输出=num\u输出
self.densed=稠密(64)
self.bn=批量标准化(可训练=真)
def调用(自我、输入、训练=真):
x=自密实(输入)
x=自我.bn(x,培训=培训)
返回x
带有功能API的模型定义:
inputs=tf.keras.Input(shape=(28),name='Input')
x=LayerA(7,name='layer_a')(输入)
x=LayerB(13,name='layer_b')(x)
x=tf.reduce_max(x,1)
model_func=keras.model(输入=输入,输出=x,name='model')
模型函数摘要()
#结果:
#层(类型)输出形状参数
# =================================================================
#输入(InputLayer)[(无,28)]0
# _________________________________________________________________
#a层(LayerA)(无,64)2112
#b层(b层)(无,64层)4416
#tf_op_layer_Max_1(TensorFlo[(无),)]0
# =================================================================
#总参数:6528
#可培训参数:6272
#不可培训参数:256
模型定义子类化:
A类模型(tf.keras.Model):
定义初始化(自):
超级(ModelA,self)。\uuuu init\uuuuu()
self.block_1=LayerA(7,name='layer_a')
self.block_2=LayerB(13,name='layer_b')
def呼叫(自我,输入):
x=自块_1(输入)
x=自块2(x)
x=tf.reduce_max(x,1)
返回x
model_subclass=ModelA()
y=模型_子类(输入)
模型_子类摘要()
###结果:
#层(类型)输出形状参数
# =================================================================
#a层(LayerA)(无,64)2112
#b层(b层)(无,64层)4416
# =================================================================
#总参数:6528
#可培训参数:6016
#不可训练参数:512
如何打印模型中Conv
和Dense
层的所有激活形状?例如
layer_a/dense_1 (None, ...)
layer_a/dense_2 (None, ...)
layer_b/dense_1 (None, ...)
layer_b/maybe-even-deeper-layer/conv2d_1 (None, ...)
... etc ...
在Tensorflow v.0或v.1中,我将执行以下操作:
for n in tf.get_default_graph().as_graph_def().node:
print(n.name, n.shape)
当我有keras模型时,有没有办法打印更多细节?摘要不会自动执行此操作,因此您必须进行调整 例如,您可以创建经常性摘要:
def full_summary(layer):
#check if this layer has layers
if hasattr(layer, 'layers'):
print('summary for ' + layer.name)
layer.summary()
print('\n\n')
for l in layer.layers:
full_summary(l)
将其用作:
full_summary(my_model)
我只知道你可以把
LayerA
和LayerB
作为子模型,然后你可以使用像model\u func.get\u layer('layer\u a').summary()
,但可能不是你想要的。有.summary()吗
keras层的方法?不确定,但您始终可以将这些自定义层转换为模型
。每个模型
都是层
。