Я пытаюсь обучить одиночный юнит из двух net, это код, в котором я сравниваю его с одиночным юнитом net:
import numpy as np
import tensorflow as tf
model1 = tf.keras.Sequential(tf.keras.layers.Dense(1))
model2 = tf.keras.Sequential(tf.keras.layers.Dense(2))
model1.compile(loss=tf.keras.losses.MSE, optimizer=tf.keras.optimizers.Adam(), metrics=['mse'])
def loss(y_true, y_pred):
return tf.keras.losses.MSE(y_true, y_pred[:,0])
model2.compile(loss=loss, optimizer=tf.keras.optimizers.Adam(), metrics=['mse'])
X = np.linspace(0,2, 50)
model1.fit(X, 2*X, batch_size=32, epochs=1000, verbose=0);
model2.fit(X, 2*X, batch_size=32, epochs=1000, verbose=0);
x = np.linspace(-1,1, 50)
y1 = model1.predict(x)
y2 = model2.predict(x)[:,0]
f, ax = plt.subplots()
ax.scatter(x, 2*x)
ax.plot(x, y1, label='model 1')
ax.plot(x, y2, label='model 2')
f.legend()
Я ожидал чтобы получить аналогичные результаты для двух сетей, но это результат:
Автоматическое c дифференцирование должно нормально работать с нарезкой, поэтому я не понимаю, что предотвращает правильное обучение второй модели на первом выходе.
EDIT: Поскольку кажется, что люди неправильно понимают суть вопроса. Я знаю, что все вышесказанное не имеет смысла. Моя конечная цель - научить net с настраиваемыми потерями, которые по-разному используют выходные данные разных единиц вывода, поэтому здесь я пробовал только самую простую версию этого с двумя единицами net, где одна единица используется, а другая игнорируется.