【问题标题】:What loss function can I use for a RNN sequence of multi-class classifications?对于多类分类的 RNN 序列,我可以使用什么损失函数?
【发布时间】:2021-07-04 05:46:57
【问题描述】:

我正在尝试使用 RNN 预测 18 个多类概率向量(14 个专有类)的序列,将 11 维数字向量作为输入。输入的数值向量在整个序列预测过程中是相同的。

为此,我在tensorflow中定义了这个模型:

model = keras.models.Sequential([
    keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[1, 11]),
    keras.layers.SimpleRNN(20, return_sequences=True),
    keras.layers.SimpleRNN(14, return_sequences=True, activation="softmax",
                                                    kernel_initializer="glorot_uniform")])

model.compile(loss="CategoricalCrossentropy",
              optimizer="nadam")

当我要求拟合模型时

history = model.fit(X_train, y_train, epochs=10, batch_size=32,
                    validation_data=(X_valid, y_valid))

我收到以下错误:

ValueError: Shapes (None, 18, 14) and (None, 1, 14) are incompatible

相比之下,如果我使用“mse”作为损失函数,则不会返回错误(尽管结果很差)。

作为参考,X_train.shape 是 (18000, 1, 11),而 y_train.shape 是 (18000, 18, 14)。

你能帮我解决这个错误吗?

非常感谢您的帮助,

【问题讨论】:

    标签: python tensorflow keras recurrent-neural-network loss-function


    【解决方案1】:

    你的网络产生的形状和你的目标的形状必须匹配。

    在您的情况下,您的网络必须生成(None, 18, 14)。一个简单的方法是使用这个结构:

    X = np.random.uniform(0,1, (100,1,11))
    Y = np.random.randint(0,1, (100,18,14))
    
    model = Sequential([
        SimpleRNN(20, return_sequences=False, input_shape=[1, 11]),
        RepeatVector(18),
        SimpleRNN(14, return_sequences=True, activation="softmax")])
    
    model.compile(loss="CategoricalCrossentropy", optimizer="nadam")
    history = model.fit(X, Y, epochs=10)
    

    我们设置return_sequences=False 并放置在RepeatVector 之后。

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 2019-04-05
      • 1970-01-01
      • 2019-03-16
      • 2017-12-08
      • 2017-03-23
      • 2018-10-27
      • 2017-11-16
      • 2021-10-04
      相关资源
      最近更新 更多