Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 梯度反转层在功能性keras多分类模型中的实现_Python_Tensorflow_Machine Learning_Keras - Fatal编程技术网

Python 梯度反转层在功能性keras多分类模型中的实现

Python 梯度反转层在功能性keras多分类模型中的实现,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,我的问题是关于在keras中使用tensorflow后端将“域自适应”实际实现为功能模型的问题 问题描述: 我有一个由n个变量组成的粒子碰撞样本集合。其中一半是带有特定类别标签的模拟数据(例如“W玻色子”)。另一半是未标记的真实碰撞数据。现在的关键想法是建立一个keras模型,它有两个输出。一个用于分类样本的类别,另一个用于分类域,因此它是模拟数据还是真实数据。问题是,应该对模型进行训练,使领域分类器的性能非常差。这是通过在训练期间从网络的域端翻转传入梯度的符号来实现的。这种技术称为“域自适应”

我的问题是关于在keras中使用tensorflow后端将“域自适应”实际实现为功能模型的问题

问题描述:

我有一个由n个变量组成的粒子碰撞样本集合。其中一半是带有特定类别标签的模拟数据(例如“W玻色子”)。另一半是未标记的真实碰撞数据。现在的关键想法是建立一个keras模型,它有两个输出。一个用于分类样本的类别,另一个用于分类域,因此它是模拟数据还是真实数据。问题是,应该对模型进行训练,使领域分类器的性能非常差。这是通过在训练期间从网络的域端翻转传入梯度的符号来实现的。这种技术称为“域自适应”。该模型预计将被训练以找到域不变特征,或者换句话说,在模拟和真实碰撞数据上执行相同的操作

我正在使用的框架有一个existin functional 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
我正在传递由两个域的数据组成的数据帧。由于我尝试使用“分类交叉熵”或“稀疏分类交叉熵”作为
损失函数
训练类标签
训练域标签
,其中一个热表示或整数表示。我最大的问题是弄清楚未标记数据的类标签应该使用什么,这让我感觉我走错了方向

简言之:

这个实现策略合法吗?假设合法,我应该如何处理未标记数据的类标签?如果它不合法,有什么更好的方法来解决这个问题呢?

任何帮助都将不胜感激:)