Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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
Python 3.x Tensorflow Keras-叠加LSTM层时出错_Python 3.x_Tensorflow_Keras_Tensorflow2.0 - Fatal编程技术网

Python 3.x Tensorflow Keras-叠加LSTM层时出错

Python 3.x Tensorflow Keras-叠加LSTM层时出错,python-3.x,tensorflow,keras,tensorflow2.0,Python 3.x,Tensorflow,Keras,Tensorflow2.0,我有下面的层序列。在混合中添加额外的LSTM会产生以下错误,我无法真正理解 我正在Linux Ubuntu x64上使用python 3.7.3 GCC 7.4.0 tensorflow gpu='2.0.0' print(x_train_uni.shape)#(299980,20,1) 简单模型=tf.keras.models.Sequential([ tf.keras.layers.LSTM(128,输入形状=x火车形状[-2:]), tf.keras.layers.LSTM(64), tf

我有下面的层序列。在混合中添加额外的LSTM会产生以下错误,我无法真正理解

我正在Linux Ubuntu x64上使用python 3.7.3
GCC 7.4.0
tensorflow gpu='2.0.0'

print(x_train_uni.shape)#(299980,20,1)
简单模型=tf.keras.models.Sequential([
tf.keras.layers.LSTM(128,输入形状=x火车形状[-2:]),
tf.keras.layers.LSTM(64),
tf.keras.layers.LSTM(32),
tf.keras.层压降(0.25),
tf.keras.layers.LSTM(16),
tf.keras.layers.LSTM(8),
tf.keras.layers.Dense(1,活化='tanh')
])
简单的lstm模型。编译(优化器='adam',loss='mae')
这将产生:

---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
6 tf.keras.layers.LSTM(16),
7 tf.keras.layers.LSTM(8),
---->8 tf.keras.层。致密(1,活化='tanh')
9 ])
10
~/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow\u core/python/training/tracking/base.py in\u method\u wrapper(self,*args,**kwargs)
455 self._self_setattr_tracking=False#pylint:disable=protected access
456试试:
-->457结果=方法(自身、*args、**kwargs)
458最后:
459 self._self_setattr_tracking=上一个值#pylint:disable=受保护访问
~/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow\u core/python/keras/engine/sequential.py in\uuuuuuu init\uuuuu(self,layers,name)
112 tf_utils.assert_no_legacy_层(层)
113对于分层:
-->114自添加(层)
115
116@property
~/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow\u core/python/training/tracking/base.py in\u method\u wrapper(self,*args,**kwargs)
455 self._self_setattr_tracking=False#pylint:disable=protected access
456试试:
-->457结果=方法(自身、*args、**kwargs)
458最后:
459 self._self_setattr_tracking=上一个值#pylint:disable=受保护访问
添加中的~/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow\u core/python/keras/engine/sequential.py(self,layer)
194#如果模型持续构建在输入层之上:
195#刷新其输出。
-->196输出张量=层(自输出[0])
197如果len(嵌套展平(输出张量))!=1:
198 raise TypeError('序列模型中的所有层'
~/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow\u core/python/keras/layers/recurrent.py in\uuuuuuuuu调用(self、输入、初始状态、常量、**kwargs)
621
622如果初始_状态为无且常数为无:
-->623返回超级(RNN,自我)。\调用(输入,**kwargs)
624
625#如果指定了`初始状态'或`常数'中的任何一个且为Keras
~/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow\u core/python/keras/engine/base\u layer.py in\uuuu调用(self,input,*args,**kwargs)
810#是铸造的,而不是之前。
811输入规格。断言输入规格兼容性(自输入规格,输入,
-->812(姓名)
813 graph=backend.get_graph()
814带有graph.as_default()、backend.name_scope(self._name_scope()):
断言输入兼容性中的~/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow\u core/python/keras/engine/input\u spec.py(输入规范、输入、层名称)
175'预期的ndim='+str(spec.ndim)+',找到的ndim='+
176 str(ndim)+'。收到完整形状:'+
-->177 str(x.shape.as_list())
178如果spec.max\u ndim不是无:
179 ndim=x.shape.ndims
ValueError:层lstm_19的输入0与层不兼容:预期ndim=3,发现ndim=2。收到完整形状:[无,128]
然而,如果我像这样改变模型,它实际上是有效的

simple_lstm_model = tf.keras.models.Sequential([
    tf.keras.layers.LSTM(128, input_shape=x_train_uni.shape[-2:]),
#     tf.keras.layers.LSTM(64),
#     tf.keras.layers.LSTM(32),
#     tf.keras.layers.Dropout(0.25),
#     tf.keras.layers.LSTM(16),  
#     tf.keras.layers.LSTM(8),
    tf.keras.layers.Dense(1, activation='tanh')
])

simple_lstm_model.compile(optimizer='adam', loss='mae')

我错过了什么?为什么两个或多个LSTM层不能一个叠在另一个上?

LSTM层需要作为输入序列。但是,Keras中的默认设置是返回最终标量

因此,在所提出的体系结构中,第二个LSTM使用标量而不是所需的序列进行馈送

解决方案是使用
return\u sequences=True
标志(请参阅):

将tensorflow导入为tf
x_列_uni=tf.零((100,20,1))
简单模型=tf.keras.models.Sequential([
tf.keras.layers.LSTM(128,输入_形状=x_序列_单一形状[-2:],返回_序列=True),
tf.keras.layers.LSTM(64,返回序列=True),
tf.keras.layers.LSTM(32,返回序列=True),
tf.keras.层压降(0.25),
tf.keras.layers.LSTM(16,返回序列=真),
tf.keras.layers.LSTM(8),
tf.keras.layers.Dense(1,活化='tanh')
])
简单的lstm模型。编译(优化器='adam',loss='mae')