我想为一个多任务的深度学习任务设计一个神经网络。在Keras中,我们可以使用“序列”或“函数”方法来构建这样的神经网络。在下面,我提供了用于构建网络的代码,使用这两种方法构建了一个具有两个输出的网络:
序列
seq_model = Sequential()
seq_model.add(LSTM(32, input_shape=(10,2)))
seq_model.add(Dense(8))
seq_model.add(Dense(2))
seq_model.summary()
泛函
input1 = Input(shape=(10,2))
lay1 = LSTM(32, input_shape=(10,2))(input1)
lay2 = Dense(8)(lay1)
out1 = Dense(1)(lay2)
out2 = Dense(1)(lay2)
func_model = Model(inputs=input1, outputs=[out1, out2])
func_model.summary()
当我查看两个模型的摘要输出时,每一个都包含相同数量的可训练参数:
到目前为止,这看起来还不错,但是当我绘制两个模型(使用keras.utils.plot_model
)时,我开始怀疑自己,这导致了以下图形:
就我个人而言,我不知道如何解释这些。当使用多任务学习方法时,我希望输出层之前的所有神经元(在我的例子中是8)都连接到,两个输出神经元。对我来说,这清楚地显示在Functional中(其中我有两个Dense(1)
实例),但从序列API来看,这一点并不十分清楚。然而,可训练参数的数量是相同的;这表明序列API --最后一层完全连接到密集输出层中的两个神经元。
有人能向我解释这两个例子之间的区别吗,或者这些例子完全相同,并导致相同的神经网络结构?另外,在这种情况下,哪一种更可取?
提前谢谢你。
发布于 2019-09-24 22:46:02
顺序角API与功能性角化API之间的区别:
顺序API允许您为大多数问题逐层创建模型。它的局限性在于它不允许您创建共享层或具有多个输入或输出的模型。 functional允许您创建具有更大灵活性的模型,因为您可以轻松地定义层连接到的模型,而不仅仅是上一层和下一层。实际上,您可以将层连接到(字面上)任何其他层。因此,建立诸如暹罗网络和剩余网络等复杂网络成为可能。
回答你的问题:
不,这些API是不一样的,层数和相同的数目是正常的。用哪一种?这取决于您想要使用这个网络。你在做什么训练?你希望输出是什么?
我推荐这个链接来充分利用这个概念。
我希望我能帮你更好地理解。
发布于 2019-09-25 04:53:52
这两个模型(理论上)是等价的,因为两个输出节点之间没有任何交互。
只是所需的输出有不同的形状。
[(batch_size,2)]
vs
[(batch_size,),(batch_size,)]
因此,损失将是不同的。
在本例中,总损失是序列模型的平均值,而对于具有两个输出的函数模型(至少是默认损失,如MSE),则进行了总结。
当然,您还可以调整功能模型,使其与顺序模型完全等价:
out1 = Dense(2)(lay2)
#out2 = Dense(1)(lay2)
func_model = Model(inputs=input1, outputs=out1)
也许你也会需要一些激活后,密集的层。
发布于 2021-09-10 01:57:42
这两个网络在功能上是等价的。稠密层的定义是完全连接的,这被认为是最基本和最简单的设计,可以假定为“正常”神经网络没有其他规定。具体的学习参数和行为可能因实现而略有不同。所给出的图形之所以模棱两可,仅仅是因为它没有显示神经元之间的连接(可能以百万计),而是提供了一个具有其名称(Dense
)的连通性的符号表示,在这种情况下,它表示一个完全连接的层。
我预计序贯模型(或使用一个密集层的等效函数模型以两个神经元作为输出)会更快,因为它可以使用简化的优化路径,但我还没有测试这个,我也不知道Tensorflow所执行的编译时优化。
https://stackoverflow.com/questions/58092176
复制