Keras 由于Python操作而导致的张量板图混乱

Keras 由于Python操作而导致的张量板图混乱,keras,tensorboard,tensorflow2.x,Keras,Tensorboard,Tensorflow2.x,这个问题是关于TensorFlow(和TensorBoard)版本2.2rc3的,但我在2.1中遇到过同样的问题 考虑以下奇怪的代码: 从日期时间导入日期时间 导入tensorflow作为tf 从tensorflow进口keras 输入=keras.layers.Input(形状=(784,)) x1=keras.layers.Dense(32,activation='relu',name='Model/Block1/relu')(输入) x1=keras.layers.Dropout(0.2,

这个问题是关于TensorFlow(和TensorBoard)版本2.2rc3的,但我在2.1中遇到过同样的问题

考虑以下奇怪的代码:

从日期时间导入日期时间
导入tensorflow作为tf
从tensorflow进口keras
输入=keras.layers.Input(形状=(784,))
x1=keras.layers.Dense(32,activation='relu',name='Model/Block1/relu')(输入)
x1=keras.layers.Dropout(0.2,name='Model/Block1/Dropout')(x1)
x1=keras.layers.Dense(10,激活='softmax',名称='Model/Block1/softmax')(x1)
x2=keras.layers.Dense(32,激活='relu',名称='Model/Block2/relu')(输入)
x2=keras.layers.Dropout(0.2,name='Model/Block2/Dropout')(x2)
x2=keras.layers.Dense(10,激活='softmax',名称='Model/Block2/softmax')(x2)
x3=keras.layers.density(32,activation='relu',name='Model/Block3/relu')(输入)
x3=keras.layers.Dropout(0.2,name='Model/Block3/Dropout')(x3)
x3=keras.layers.Dense(10,激活='softmax',名称='Model/Block3/softmax')(x3)
x4=keras.layers.density(32,activation='relu',name='Model/Block4/relu')(输入)
x4=keras.layers.Dropout(0.2,name='Model/Block4/Dropout')(x4)
x4=keras.layers.Dense(10,激活='softmax',名称='Model/Block4/softmax')(x4)
输出=x1+x2+x3+x4
模型=tf.keras.model(输入=输入,输出=输出)
model.summary()
(x_列,y_列),(x_测试,y_测试)=keras.dataset.mnist.load_data()
x_-train=x_-train.重塑(60000784).aType('float32')/255
x_测试=x_测试。重塑(10000784)。aType('float32')/255
model.compile(loss=keras.loss.sparsecategoricalcrossention(from_logits=True),
optimizer=keras.optimizers.RMSprop(),
指标=[‘准确度’])
logdir=“logs/”+datetime.now().strftime(“%Y%m%d-%H%m%S”)
tensorboard\u callback=keras.callbacks.tensorboard(log\u dir=logdir)
模型安装(x_系列、y_系列、,
批次大小=64,
纪元=5,
验证_分割=0.2,
回调=[tensorboard_回调])
运行它并查看在TensorBoard中创建的图形时 .

可以看出,加法操作非常难看

更换线路时

输出=x1+x2+x3+x4
下面的句子:

outputs=keras.layers.add([x1,x2],name='Model/add/add1'))
outputs=keras.layers.add([outputs,x3],name='Model/add/add2'))
outputs=keras.layers.add([outputs,x4],name='Model/add/add3'))
(在第二个屏幕截图中,详细显示了模型以及其中一个内部块)

模型的两种表示形式之间的区别在于,在第二种表示形式中,我们可以命名加法操作并将其分组

我找不到任何方法来命名这些操作,除非使用
keras.layers.add()
。在这个模型中,问题看起来并不那么严重,因为模型很简单,而且很容易用
keras.layers.add()
替换
+
。然而,在更复杂的模型中,这可能成为一个真正的难题。例如,诸如
t[:,start:end]
之类的操作应该转换为对
tf.stridded\u slice()
的复杂调用。因此,我的模型表示非常混乱,有大量神秘的聚集、跨步和concat操作


我想知道是否有一种方法来包装/分组这些操作,以便在TensorBoard中生成更好的图形。

按照Marco Cerliani的提示,
Lambda
层在这里确实非常有用。因此,下面的代码将对
+
进行很好的分组:

outputs = keras.layers.Add()([x1, x2, x3, x4])
outputs=keras.layers.Lambda(Lambda x:x[0]+x[1],name='Model/add/add1')([x1,x2])
输出=keras.layers.Lambda(Lambda x:x[0]+x[1],name='Model/add/add2')([outputs,x2])
输出=keras.layers.Lambda(Lambda x:x[0]+x[1],name='Model/add/add3')([outputs,x2])
或者,如果需要包装步幅,以下代码将对
t[]
进行很好的分组:

x1=keras.layers.Lambda(Lambda x:x[:,0:5],name='Model/stride\u concat/strip1')(x1)#而不是x1=x1[:,0:5]
x2=keras.layers.Lambda(Lambda x:x[:,5:10],name='Model/stride_concat/stride2')(x2)#而不是x2=x2[:,5:10]
输出=keras.layers.concatenate([x1,x2],name='Model/stride\u concat/concat')
这回答了所提出的问题。但实际上,还有一个未解决的问题,在另一个问题中有描述:''