Keras с одним входом и несколькими выходами - почему потери так высоки по сравнению с одним выходом?

Я думаю, что что-то не так с моим кодированием нескольких выходов Keras, что приводит к большим потерям по сравнению с последовательной моделью. Пожалуйста, помогите мне, какая часть неправильная.

import os, random, string, pandas, math, numpy
import tensorflow as tf
from tensorflow import keras

Данные обучения:

feature_data = [] # common feature data
label_data = [] # for multiple outputs
single_data = [] # for single output
size = 10000
features = ['x1', 'x2']
labels = ['y1', 'y2']
for i in range(size):
    a = random.random()
    b = random.random()
    c = math.sin(a)
    d = math.cos(b)
    feature = [a, b]
    label = [c, d]
    feature_data.append(feature)
    label_data.append(label)
    single_data.append(c)

Это моя модель с единственным выходом, которая работает хорошо: loss ‹2e-05

single = keras.Sequential([
    keras.layers.Dense(2, input_shape=(2,), activation=tf.nn.softmax),
    keras.layers.Dense(4, activation=tf.nn.softmax),
    keras.layers.Dense(1)])
optimizer = tf.optimizers.RMSprop(learning_rate=0.001)
single.compile(loss='mse', optimizer=optimizer, metrics=['mae'])
single.fit(x=feature_data, y=single_data, epochs=100, batch_size=100)

Это должна быть идентичная модель с несколькими выходами, но потери действительно велики: 0,1

def build_model():
    input_shape=(2, )
    inputs = keras.Input(shape=input_shape)
    outputs = []
    for label in labels:
        u = keras.layers.Dense(2, input_shape=input_shape, activation=tf.nn.softmax)(inputs)
        v = keras.layers.Dense(4, activation=tf.nn.softmax)(u)
        w = keras.layers.Dense(1, name=label)(v)
        outputs.append(w)
    model = keras.Model(inputs = inputs, outputs = outputs)
    optimizer = tf.optimizers.RMSprop(learning_rate=0.001)
    model.compile(loss='mse', optimizer=optimizer, metrics=['mae'])
    return model

model = build_model()
model.fit(x=feature_data, y=label_data, epochs=100, batch_size=100)

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


person XQ.Wei    schedule 26.01.2021    source источник


Ответы (2)


[Игнорировать это] Вторая модель отличается от первой: вначале в ней используется другой плотный слой.

Эта структура соответствует первой модели:

def build_model():
    input_shape=(2, )
    inputs = keras.Input(shape=input_shape)
    outputs = []
    d = keras.layers.Dense(2, input_shape=input_shape, activation=tf.nn.softmax)
    for label in labels:
        u = d(inputs)
        v = keras.layers.Dense(4, activation=tf.nn.softmax)(u)
        w = keras.layers.Dense(1, name=label)(v)
        outputs.append(w)
    model = keras.Model(inputs = inputs, outputs = outputs)
    optimizer = tf.optimizers.RMSprop(learning_rate=0.001)
    model.compile(loss='mse', optimizer=optimizer, metrics=['mae'])
    return model

Структура соответствует первой модели, потому что в ней используется один и тот же плотный слой (одинаковые веса) для интерпретации входных данных в обеих цепочках.

Попробуйте построить историю потерь из вашей второй сети. Вы можете увидеть двойные колеблющиеся значения: одно становится хорошим, другое - плохим, и они меняются местами.

person Jack Parsons    schedule 31.01.2021
comment
Спасибо за ответ! Однако это мало что меняет. Я думаю, что с выходным слоем что-то не так, я смущен, первоначальная идея состоит в том, чтобы изменить форму каждого выходного элемента и сопоставить с метками обучения по метке, но, честно говоря, я понятия не имею, как это сделать :-( - person XQ.Wei; 01.02.2021

Я не обращал внимания.

Softmax предназначен для выбора одного из нескольких возможных выходов. Вы делаете вывод с непрерывным уровнем, а не однократное кодирование.

Я думаю, ваша вторая модель должна работать, если вы выберете правильную функцию активации на правильных плотных слоях.

Глядя на свои данные, вы предсказываете sin от (0- ›1) и cos (0-› 1). На графике это обе очень плоские линии в диапазоне sin и cos. Это такая маленькая модель, что, возможно, подойдет tanh или sigmoid на любом или всем плотном слое.

sin cos chart

person Jack Parsons    schedule 03.02.2021
comment
Извините, моя беда, я не уточнил, что ввод предназначен только для демонстрации, проблема, с которой я сталкиваюсь, заключается в том, что если модель имеет только одно числовое значение на выходе, коэффициент потерь будет приятным и низким, но если я присоединюсь к нескольким такие модели, потери будут безумными. Я просто хочу понять, как правильно объединить модели, которые используют одни и те же входные данные. - person XQ.Wei; 03.02.2021
comment
Я попробовал несколько способов, и использование «swish» в последнем слое Dense (и никаких других функций активации нигде) у меня сработало. «swish» - это вариант «relu». Он встроен в Керас. - person Jack Parsons; 04.02.2021