Tensorflow, обучить выбранные единицы вывода - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь обучить одиночный юнит из двух 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()

Я ожидал чтобы получить аналогичные результаты для двух сетей, но это результат: enter image description here

Автоматическое c дифференцирование должно нормально работать с нарезкой, поэтому я не понимаю, что предотвращает правильное обучение второй модели на первом выходе.

EDIT: Поскольку кажется, что люди неправильно понимают суть вопроса. Я знаю, что все вышесказанное не имеет смысла. Моя конечная цель - научить net с настраиваемыми потерями, которые по-разному используют выходные данные разных единиц вывода, поэтому здесь я пробовал только самую простую версию этого с двумя единицами net, где одна единица используется, а другая игнорируется.

1 Ответ

1 голос
/ 06 мая 2020

Измените функцию loss на следующее:

def loss(y_true, y_pred):
    return tf.keras.losses.MSE(y_true, y_pred[:, :1])

Формы y_true и y_pred в loss - это (None, 1) и (None, 2). Если вы сделаете y_pred[:, 0], вы получите тензор с формой (None,), а затем оба y_true и y_pred будут транслироваться в (None, None), но вычисленное MSE будет состоять из всех y_true значений против всех y_pred[:, 0] значения, что неверно. С помощью y_pred[:, :1] (или, что эквивалентно, tf.expand_dims(y_pred[:, 0], axis=1)) вы получите тензор с формой (None, 1) и вычисление MSE верное.

...