对于 multi-class classifications 的 RNN 序列,我可以使用什么损失函数?

What loss function can I use for a RNN sequence of multi-class classifications?

我正在尝试使用 RNN 预测 18 个多 class 概率向量(14 个独占 classes)的序列,将 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)。

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

非常感谢您的帮助,

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

在您的情况下,您的网络必须生成 (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 之后。