Объединение двух выходных слоев в одну функцию потерь - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь реализовать гетероскедастическую алеаторическую неопределенность в кератах.У моей модели есть два последних слоя:

# Classification block
x = layers.Flatten(name='flatten')(x)
x = layers.Dense(4096, activation='relu', name='fc1')(x)
x = layers.Dense(4096, activation='relu', name='fc2')(x)

# Good old output
linear_output = layers.Dense(units=1, activation="linear", name='linear_output')(x)

# Data-dependent uncertainty outainty
variance_output = layers.Dense(units=1, activation='linear', name='variance_output')(x)

Я хотел бы объединить эти выводы в одну потерю:

loss = K.sum(0.5 * K.exp(-1 * variance_output) * K.square(K.abs(input_label - linear_output)) + 0.5 * variance_output)

Мне удалось заставить его работать с

model.add_loss(loss)

но, к сожалению, это создает проблему с сохранением и загрузкой модели.Я хотел бы найти другой способ реализовать его так, чтобы сохранение и загрузка модели работали.

1 Ответ

0 голосов
/ 07 мая 2019

Я не знаю, какую ошибку вы получаете, поэтому я стреляю немного вслепую, но похоже, что у вас такая же проблема, как и у меня.

Я создал пользовательскую функцию потери, которую яиспользовались во время обучения, и поэтому не могли загрузить модель.Эти пользовательские объекты должны быть указаны следующим образом: Обратите внимание на custom_objects

При построении модели:

def myLoss():
    ... some code here
    return loss

model.compile(optimizer = opt, loss = myLoss)

Затем при загрузке модели: (Функция должна быть определена в обоих сценариях)

model = load_model(model_path, custom_objects={'myLoss' : myLoss})
...