我考虑的一些方法:
继承Model类 TensorFlow Keras中的采样softmax
继承Layers类 如何在Keras模型中使用TensorFlow的采样softmax loss函数?
这两种方法中,Model方法更为简洁,而Layers方法则有些hacky——它将目标作为输入的一部分并将其推入模型中,多输出模型再见了。
我希望在子类化Model类方面获得一些帮助——具体来说: 1)与第一种方法不同——我想像在指定标准Keras模型时那样,使用任意数量的层。例如:
class LanguageModel(tf.keras.Model):
def __init__(self, **kwargs)
2) 我希望在模型类中加入如下代码 - 但是希望让模型类认识到:
def call(self, y_true, input):
""" reshaping of y_true and input to make them fit each other """
input = tf.reshape(input, (-1,self.hidden_size))
y_true = tf.reshape(y_true, (-1,1))
weights = tf.Variable(tf.float64))
biases = tf.Variable(tf.float64)
loss = tf.nn.sampled_softmax_loss(
weights=weights,
biases=biases,
labels=labels,
inputs=inputs,
...,
partition_strategy="div")
logits = tf.matmul(inputs, tf.transpose(weights))
logits = tf.nn.bias_add(logits, biases)
y_predis = tf.nn.softmax_cross_entropy_with_logits_v2(
labels=inputs[1],
logits=logits)
我想我需要一些指针来了解在函数式API中Model类的哪些部分应该进行更改,因为我必须像上面那样编写自定义损失函数。我猜问题在于访问tf.nn.sampledsoftmax函数中的权重。
y_pred
)的输出,并使用输出层权重和偏差重新计算它,使用sampled_softmax_loss
;这最终会导致对输出层进行梯度更新,但不直接使用输出层结果。 - Pedro Marques