Я думаю, что что-то не так с моим кодированием нескольких выходов 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)
Я предполагаю, что что-то не так с входным слоем или форматом данных метки, но до сих пор не знаю, как это исправить. Пожалуйста помоги.