Tensorflow LSTM错误-';登录和标签必须具有相同的形状';
我已经在此处搜索了有关错误的其他线程,但无法找出问题所在。我尝试使用一个玩具数据集创建一个LSTM,该数据集具有两个预测值和三个结果,将输出层设置为sigmoid,以便每个结果标签的概率介于0-1之间。我的代码:Tensorflow LSTM错误-';登录和标签必须具有相同的形状';,tensorflow,lstm,Tensorflow,Lstm,我已经在此处搜索了有关错误的其他线程,但无法找出问题所在。我尝试使用一个玩具数据集创建一个LSTM,该数据集具有两个预测值和三个结果,将输出层设置为sigmoid,以便每个结果标签的概率介于0-1之间。我的代码: import pandas as pd import numpy as np import tensorflow as tf #create toy dataset d = {'custID': [101,101,101,102,102,102,103,103,103],
import pandas as pd
import numpy as np
import tensorflow as tf
#create toy dataset
d = {'custID': [101,101,101,102,102,102,103,103,103],
'X1': [1,1,1,0,0,0,1,1,0],
'X2': [0,1,0,1,1,1,1,1,0],
'y1': [0,0,1,0,1,1,0,0,1],
'y2': [0,1,1,0,0,1,1,0,1],
'y3':[0,0,0,0,0,1,0,1,0]}
data = pd.DataFrame(data=d)
#seperate preds (X) from outcome (y)
X = data[['custID','X1','X2']]
y = data[['custID','y1','y2','y3']]
X.set_index('custID', inplace=True)
y.set_index('custID', inplace=True)
#reshape
X = X.values.reshape(3,3,2)
print(X)
y = y.values.reshape(3,3,3)
print(y)
#create LSTM
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(6, input_shape=(3,2)),
tf.keras.layers.LSTM(12, return_sequences = False),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(3, activation='sigmoid')
])
model.compile(optimizer=tf.keras.optimizers.Adam(),loss='binary_crossentropy')
model.fit(X,y, epochs=10)
这会产生错误(*ValueError:logits和标签必须具有相同的形状((无,3)vs(无,3,3)))。如果我将输出层激活设置为softmax,它会起作用,但这会在所有3个标签上产生一个概率,其总和为1,而不是每个标签的概率。修复“相同形状”问题
我想你想把你的模型改成这个
#create LSTM
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(6, input_shape=(3,2)),
tf.keras.layers.LSTM(12, return_sequences=True),
tf.keras.layers.Dense(3, activation='sigmoid')
])
如果我们看一下模型摘要
model.summary()
我们得到以下输出
Layer (type) Output Shape Param #
=================================================================
dense_16 (Dense) (None, 3, 6) 18
_________________________________________________________________
lstm_8 (LSTM) (None, 3, 12) 912
_________________________________________________________________
dense_17 (Dense) (None, 3, 3) 39
=================================================================
Total params: 969
Trainable params: 969
Non-trainable params: 0
我们可以看到,数据看起来确实是以正确的形式流动的
证明这个模型是有效的
让我们用上面的模型来训练它
model.compile(optimizer=tf.keras.optimizers.Adam(),loss='binary_crossentropy')
dataSet = tf.data.Dataset.from_tensors((X,y)).repeat(1000)
model.fit(dataSet, epochs=5)
返回以下训练结果
Epoch 1/5
1000/1000 [==============================] - 2s 2ms/step - loss: 0.2522
Epoch 2/5
1000/1000 [==============================] - 2s 2ms/step - loss: 0.0142
Epoch 3/5
1000/1000 [==============================] - 2s 2ms/step - loss: 0.0048
Epoch 4/5
1000/1000 [==============================] - 2s 2ms/step - loss: 0.0023
Epoch 5/5
1000/1000 [==============================] - 2s 2ms/step - loss: 0.0012
看起来它训练得棒极了
我认为主要的问题是return\u sequence=False
,它基本上消除了数据的第二维度。展平
是不必要的,如果您修复了返回顺序,那么展平会导致另一个问题
如果这能解决您的问题,请告诉我太好了,谢谢。你能解释一下这条线在做什么吗:dataSet=tf.data.dataSet.from_张量((X,y)).repeat(1000)?这条线获取X,y训练数据并重复1000次。现在,每个历元实际上表示多次浏览数据,但是看到输出中显示5000个历元有点烦人,所以这只是做同样的事情,但只有5行。如果这回答了您的问题,请根据SO标准惯例将其标记为已接受的答案。