Python 梯度反转层在功能性keras多分类模型中的实现
我的问题是关于在keras中使用tensorflow后端将“域自适应”实际实现为功能模型的问题 问题描述: 我有一个由n个变量组成的粒子碰撞样本集合。其中一半是带有特定类别标签的模拟数据(例如“W玻色子”)。另一半是未标记的真实碰撞数据。现在的关键想法是建立一个keras模型,它有两个输出。一个用于分类样本的类别,另一个用于分类域,因此它是模拟数据还是真实数据。问题是,应该对模型进行训练,使领域分类器的性能非常差。这是通过在训练期间从网络的域端翻转传入梯度的符号来实现的。这种技术称为“域自适应”。该模型预计将被训练以找到域不变特征,或者换句话说,在模拟和真实碰撞数据上执行相同的操作 我正在使用的框架有一个existin functional keras模型,我想用上述领域分类器扩展该模型。这是我提出的一个原型:Python 梯度反转层在功能性keras多分类模型中的实现,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,我的问题是关于在keras中使用tensorflow后端将“域自适应”实际实现为功能模型的问题 问题描述: 我有一个由n个变量组成的粒子碰撞样本集合。其中一半是带有特定类别标签的模拟数据(例如“W玻色子”)。另一半是未标记的真实碰撞数据。现在的关键想法是建立一个keras模型,它有两个输出。一个用于分类样本的类别,另一个用于分类域,因此它是模拟数据还是真实数据。问题是,应该对模型进行训练,使领域分类器的性能非常差。这是通过在训练期间从网络的域端翻转传入梯度的符号来实现的。这种技术称为“域自适应”
# common layers
inputs = keras.Input(shape=(n_variables, ))
X = layers.Dense(units=50, activation="relu")(inputs)
# domain end
flip_layer = flipGradientTF.GradientReversal(hp_lambda=0.3)(X)
X_domain = layers.Dense(units=50, activation="relu")(flip_layer)
domain_out = layers.Dense(units=2, activation="softmax", name="domain_out")(X_domain)
# class end
X_class = layers.Dense(units=50, activation="relu")(X)
class_out = layers.Dense(units=n_classes, activation="softmax", name="class_out")(X_class)
flipGradientTF
的代码取自
此外,还需要编写和培训模型:
model = keras.Model(inputs=inputs, outputs=[class_out, domain_out])
model.compile(optimizer="adam", loss=loss_function, metrics="accuracy")
# train model
model.fit(
x = train_data,
y = [train_class_labels, train_domain_labels],
batch_size = 200,
epochs = 200,
sample_weight = {"class_out": class_weights, "domain_out": None}
)
对于train_data
我正在传递由两个域的数据组成的数据帧。由于我尝试使用“分类交叉熵”或“稀疏分类交叉熵”作为损失函数
,训练类标签
和训练域标签
,其中一个热表示或整数表示。我最大的问题是弄清楚未标记数据的类标签应该使用什么,这让我感觉我走错了方向
简言之:
这个实现策略合法吗?假设合法,我应该如何处理未标记数据的类标签?如果它不合法,有什么更好的方法来解决这个问题呢?
任何帮助都将不胜感激:)