【发布时间】:2019-12-05 10:55:54
【问题描述】:
我尝试在这里实现网络架构:Architecture of the network I try to implement (from Zhenyu et.al. 2019) using Keras framework with Tensorflow backend。
该网络是一个类似连体的网络,具有共享层 Conv1、Conv2、Conv3。目的是在 2 个不同的输入之间调整域,但这目前不是问题,我在此之前被卡住了。问题是我面临无法实现模型的问题。
所以我目前定义的模型如下:
为两个输入(源、目标)定义输入层:
source_domain_input = keras.layers.Input(shape=(None, None, 160, 1),name="SourceDomainInput")
target_domain_input = keras.layers.Input(shape=(None, None, 160, 1),name="TargetDomainInput")
然后我定义了共享层部分(Conv1、Conv2 和 Conv3)——为了缩短示例,我删除了池化层:
model_shared_part = keras.models.Sequential()
model_shared_part.add(keras.layers.TimeDistributed(keras.layers.Conv1D(filters=16,
kernel_size=3,
activation='relu'),
input_shape=(None, None, 160, 1)))
model_shared_part.add(keras.layers.TimeDistributed(keras.layers.Conv1D(filters=32,
kernel_size=3,
activation='relu')))
model_shared_part.add(keras.layers.TimeDistributed(keras.layers.Conv1D(filters=64,
kernel_size=3,
activation='relu')))
然后我将输入连接到共享层以成为连体(并行)结构:
featureOutput_conv3_target = model_shared_part(target_domain_input)
featureOutput_conv3_source = model_shared_part(source_domain_input)
然后我将剩余的层添加到源部分(图像中的上部分支)以缩短示例我只添加了一些层而不是全部:
model_source_single_part = keras.models.Sequential()
model_source_single_part.add(keras.layers.TimeDistributed(keras.layers.Conv1D(filters=64,
kernel_size=3,
activation='relu'),
)
)
model_source_single_part.add(keras.layers.TimeDistributed(keras.layers.MaxPooling1D(pool_size=2)
)
)
model_source_single_part.add(keras.layers.TimeDistributed(keras.layers.Flatten()
)
)
model_source_single_part.add(keras.layers.LSTM(units=60)
)
model_source_single_part.add(keras.layers.Dense(100,
activation='relu')
)
model_source_single_part.add(keras.layers.Dense(units=4,
activation='softmax'
)
)
final_source_layer = model_source_single_part(featureOutput_conv3_source)
然后我将创建的架构合并到最终模型中:
dwcDAN_model = keras.models.Model(inputs=[source_domain_input,
target_domain_input],
outputs = final_source_layer
)
# Model compilation
dwcDAN_model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
但是模型图给出了以下内容:
我所期望的是,名为sequential_2 的顺序模型是共享层部分,它连接到两个输入。但它只连接到源输入。
如何在上面的实现中找到错误?
【问题讨论】:
-
你想用
featureOutput_conv3_target做什么?在连体网络中,计算提取的源和目标特征向量之间的距离或相似度(使用欧几里得距离等度量)。但是,您刚刚从目标中提取了特征,但以后没有使用。我猜你想在featureOutput_conv3_target和featureOutput_conv3_source之间执行一些操作(例如相似性测量),然后你可能希望将该融合功能传递给model_source_single_part(fused_feature)而不是model_source_single_part(featureOutput_conv3_source)。 -
亲爱的@bit01 感谢您的回复。我的目标如下。我想计算两层的特征输出之间的最大平均差异。因此,我正在寻找一种计算 MMD 并计算相对于 MMD 值的最终损失的方法。因此,不仅使用来自 softmax 分类器的预测交叉熵进行优化,而且还使用了 MMD 值。有了这个,我的目标是减少域差异。你能帮帮我吗?
-
请分享参考论文链接。