Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow LSTM错误-';登录和标签必须具有相同的形状';_Tensorflow_Lstm - Fatal编程技术网

Tensorflow LSTM错误-';登录和标签必须具有相同的形状';

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],

我已经在此处搜索了有关错误的其他线程,但无法找出问题所在。我尝试使用一个玩具数据集创建一个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],
     '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标准惯例将其标记为已接受的答案。