gpt4 book ai didi

python - Keras 模型中的 Softmax 采样

转载 作者:行者123 更新时间:2023-12-01 00:47:41 28 4
gpt4 key购买 nike

我考虑过的一些方法:

继承自Model类 Sampled softmax in tensorflow keras

继承自Layers类 How can I use TensorFlow's sampled softmax loss function in a Keras 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)




3 我想我需要一些指针来指示我应该处理函数式 API 中 Model 类的哪些部分 - 知道我必须编写一个像上面这样的自定义损失函数。我猜问题是访问 tf.nn.sampledsoftmax 函数中的权重

最佳答案

我能想到的最简单的方法是定义一个忽略输出层结果的损失。

完整的 Colab 在这里: https://colab.research.google.com/drive/1Rp3EUWnBE1eCcaisUju9TwSTswQfZOkS

损失函数。请注意,它假设输出层是 Dense(activation='softmax') 并且忽略 y_pred。因此,在使用损失的训练/评估期间,密集层的实际输出是 NOP。

进行预测时使用输出层。

class SampledSoftmaxLoss(object):
""" The loss function implements the Dense layer matmul and activation
when in training mode.
"""
def __init__(self, model):
self.model = model
output_layer = model.layers[-1]
self.input = output_layer.input
self.weights = output_layer.weights

def loss(self, y_true, y_pred, **kwargs):
labels = tf.argmax(y_true, axis=1)
labels = tf.expand_dims(labels, -1)
loss = tf.nn.sampled_softmax_loss(
weights=self.weights[0],
biases=self.weights[1],
labels=labels,
inputs=self.input,
num_sampled = 3,
num_classes = 4,
partition_strategy = "div",
)
return loss

型号:

def make_model():
inp = Input(shape=(10,))
h1 = Dense(16, activation='relu')(inp)
h2 = Dense(4, activation='linear')(h1)
# output layer and last hidden layer must have the same dims
out = Dense(4, activation='softmax')(h2)
model = Model(inp, out)
loss_calculator = SampledSoftmaxLoss(model)
model.compile('adam', loss_calculator.loss)
return model

tf.set_random_seed(42)
model = make_model()
model.summary()

请注意,SampledSoftmaxLoss 强制最后一个模型层的输入必须具有与类数相同的维度。

关于python - Keras 模型中的 Softmax 采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com