使用功能性API,是否有办法获取由正确构造的keras代码生成的张量板图?
有什么方法可以在实例化和调用时使用功能方法命名指令块?
我正在尝试获取张量板中结构良好的网络图。
显然,当使用功能性API时,在实例化模型/层时在图中使用 tf.name_scope ,相反,使用 name kwargs一次实例化模型/图层时调用。 此外,tf.name_scope块不会出现在与调用相对应的图形部分中(它们确实出现在实例化部分中)。
我发现在实例化和调用时使用相同名称以及在图形中正确构造层的块的唯一方法是从基类Layer派生自定义层。但这确实是痛苦的/过度的,会使代码在大型模型中不可读,或者对于某些多输入/多输出模型可能不可行。
这是一个带有自动编码器代码的示例。
具有功能性API的示例
from keras import Model
from keras import backend as K
from keras.layers import Input, Dense, ReLU
layers=[1024,512,128,64]
graph = K.tf.Graph()
with graph.as_default():
with K.name_scope('ns_encoder'):
x = Input(shape=(layers[0],))
z = x
for hu in layers[1:]:
with K.name_scope('ns_encblock'):
z = Dense(hu)(z)
z = ReLU()(z)
encoder = Model(inputs=x,outputs=z, name='m_encoder')
with K.name_scope('ns_decoder'):
x = Input(shape=(layers[-1],))
z = x
for hu in layers[:-1][::-1]:
with K.name_scope('ns_decblock'):
z = Dense(hu)(z)
z = ReLU()(z)
decoder = Model(inputs=x,outputs=z, name='m_decoder')
with K.name_scope('ns_ae'):
x = Input(shape=(layers[0],))
z = encoder(x)
xh = decoder(z)
ae = Model(inputs=x,outputs=xh, name='m_ae')
writer = K.tf.summary.FileWriter(logdir='logdir', graph=graph)
writer.flush()
Graph produced by the functional API
同一层re_lu_3正确显示在ns_encoder的一个块内,而不显示在“ ns_ae”的“ m_encoder”中。此外,在编码器模型定义中使用name_scope'ns_encoder',而在“ ns_ae”中将名称kwarg'm_encoder'用于模型功能
具有派生类的示例
from keras import Model
from keras import backend as K
from keras.layers import Input, Dense, ReLU, Layer
layers=[1024,512,128,64]
class Block(Layer):
def __init__(self, hu, **kwargs):
super().__init__(**kwargs)
self.hu = hu
def build(self,input_shape):
self.dense = Dense(self.hu)
self.relu = ReLU()
super().build(input_shape)
def compute_output_shape(self, input_shape):
return self.relu.compute_output_shape(
self.dense.compute_output_shape(input_shape))
def call(self,x):
return self.relu(self.dense(x))
graph = K.tf.Graph()
with graph.as_default():
with K.name_scope('ns_encoder'):
x = Input(shape=(layers[0],))
z = x
for hu in layers[1:]:
with K.name_scope('ns_encblock'):
z = Block(hu)(z)
encoder = Model(inputs=x,outputs=z, name='m_encoder')
with K.name_scope('ns_decoder'):
x = Input(shape=(layers[-1],))
z = x
for hu in layers[:-1][::-1]:
with K.name_scope('ns_decblock'):
z = Block(hu)(z)
decoder = Model(inputs=x,outputs=z, name='m_decoder')
with K.name_scope('ns_ae'):
x = Input(shape=(layers[0],))
z = encoder(x)
xh = decoder(z)
ae = Model(inputs=x,outputs=xh, name='m_ae')
writer = K.tf.summary.FileWriter(logdir='logdir', graph=graph)
writer.flush()
Graph produced by the class derivation
这一次图形结构正确:block_3出现在编码器和全自动编码器上。但是代码确实过分杀伤了,这种范例无法一直应用。