Как я могу передать логи в sigmoid_cross_entropy_with_logits, прежде чем я подхожу и прогнозирую модель? - PullRequest
1 голос
/ 03 апреля 2020

Поскольку мне нужно обучить модель с несколькими метками, мне нужно использовать потерю function tf.nn.sigmoid_cross_entropy_with_logits. Эта функция имеет два параметра: logits и loss.

Является ли параметр logitsis значением предсказанного значения y? Как я могу передать это значение до компиляции модели? Я не могу предсказать y, прежде чем скомпилировать и подогнать модель, верно?

Это мой код:

import tensorflow as tf
from tensorflow import keras

model = keras.Sequential([keras.layers.Dense(50, activation='tanh', input_shape=[100]), 
                            keras.layers.Dense(30, activation='relu'),
                            keras.layers.Dense(50, activation='tanh'),
                            keras.layers.Dense(100, activation='relu'),
                            keras.layers.Dense(8)])

model.compile(optimizer='rmsprop', 
              loss=tf.nn.sigmoid_cross_entropy_with_logits(logits=y_pred), labels=y),   # <---How to figure out y_pred here?
              metrics=['accuracy'])
model.fit(x, y, epochs=10, batch_size=32)
y_pred = model.predict(x)  # <--- Now I got y_pred after compile, fit and predict

Я использую tenorflow v2.1.0

1 Ответ

0 голосов
/ 03 апреля 2020

Эти аргументы (labels и logits) передаются функции потерь в реализации Keras. Чтобы заставить ваш код работать, сделайте так:

import tensorflow as tf
from tensorflow import keras


def loss_fn(y_true, y_pred):
    return tf.nn.sigmoid_cross_entropy_with_logits(labels=y_true, logits=y_pred)

model = keras.Sequential([keras.layers.Dense(50, activation='tanh', input_shape=[100]), 
                          keras.layers.Dense(30, activation='relu'),
                          keras.layers.Dense(50, activation='tanh'),
                          keras.layers.Dense(100, activation='relu'),
                          keras.layers.Dense(8)])

model.compile(optimizer='rmsprop', 
              loss=loss_fn,
              metrics=['accuracy'])
x = np.random.normal(0, 1, (64, 100))
y = np.random.randint(0, 2, (64, 8)).astype('float32')
model.fit(x, y, epochs=10, batch_size=32)
y_pred = model.predict(x)

Тем не менее, предлагается использовать вместо этого реализацию Keras с потерями. В вашем случае это будет:

model = keras.Sequential([keras.layers.Dense(50, activation='tanh', input_shape=[100]), 
                          keras.layers.Dense(30, activation='relu'),
                          keras.layers.Dense(50, activation='tanh'),
                          keras.layers.Dense(100, activation='relu'),
                          keras.layers.Dense(8)])

model.compile(optimizer='rmsprop', 
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])
x = np.random.normal(0, 1, (64, 100))
y = np.random.randint(0, 2, (64, 8)).astype('float32')
model.fit(x, y, epochs=10, batch_size=32)
y_pred = model.predict(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...