对于 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
之后。
我正在尝试使用 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
之后。