【问题标题】:How can I pass logits to sigmoid_cross_entropy_with_logits before I fit and predict model?如何在拟合和预测模型之前将 logits 传递给 sigmoid_cross_entropy_with_logits?
【发布时间】:2020-07-15 16:08:36
【问题描述】:

由于我需要训练具有多个标签的模型,我需要使用损失function tf.nn.sigmoid_cross_entropy_with_logits。这个函数有两个参数:logitsloss

参数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

我正在使用 tensorflow v2.1.0

【问题讨论】:

    标签: tensorflow machine-learning keras multilabel-classification


    【解决方案1】:

    这些参数(labelslogits)被传递给 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 的 loss 实现。在您的情况下,它将是:

    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)
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 2021-06-15
      • 2019-06-29
      • 1970-01-01
      相关资源
      最近更新 更多