Образец Softmax в модели Keras - PullRequest
1 голос
/ 30 июня 2019

Некоторые подходы, которые я рассмотрел:

Наследование от класса модели Отобранный softmax в керах тензор-потока

Наследование от класса Layers Как я могу использовать выборочный softmax TensorFlowФункция потерь в модели Кераса?

Из двух подходов Модельный подход более чистый, так как подход к слоям немного хакерский - он выдвигает цель как часть ввода, а затем пока-output models.

Мне нужна помощь в создании подкласса класса 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 Думаю, мне нужнонекоторые указатели, с какими разделами класса Model в функциональном API я должен связываться - зная, что я должен написать пользовательскую функцию потери, как описано выше.Я предполагаю, что проблема заключается в доступе к весам в функции tf.nn.sampledsoftmax

1 Ответ

2 голосов
/ 07 июля 2019

Самый простой подход, который я могу предложить, - определить потери, которые игнорируют результат выходного слоя.

Полный Colab здесь: https://colab.research.google.com/drive/1Rp3EUWnBE1eCcaisUju9TwSTswQfZOkS

Функция потерь. Обратите внимание, что предполагается, что выходной слой является плотным (активация = '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 налагает, что входы последнего слоя модели должны иметь те же размеры, что и число классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...