草庐IT

关于python:LSTM:lstm_1层的输入0与层不兼容:预期ndim=3,发现ndim=2(reshaping input)

codeneng 2023-03-28 原文

LSTM: Input 0 of layer lstm_1 is incompatible with the layer: expected ndim=3, found ndim=2 (reshaping input)

我想根据 Robert Frost 的诗歌创作诗歌。
我已经预处理了我的数据集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
max_sentence_len = max(len(l) for l in corpus_int)

input_seq = np.array(tf.keras.preprocessing.sequence.pad_sequences(corpus_int,padding = 'pre',truncating = 'pre',maxlen = max_sentence_len))
predictors, label = input_seq[:,:-1],input_seq[:,-1]#predictors everything except last, label only last
label = ku.to_categorical(label, num_classes=total_words,dtype='int32')

predictors

array([[   0,    0,    0, ...,   10,    5,  544],
       [   0,    0,    0, ...,   64,    8,  854],
       [   0,    0,    0, ...,  855,  174,    2],
       ...,
       [   0,    0,    0, ...,  129,   49,   94],
       [   0,    0,    0, ...,  183,  159,   60],
       [   0,    0,    3, ...,    3, 2157,    4]], dtype=int32)

label

array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 1]], dtype=int32)

之后,我使用编码器 - 解码器架构构建了我的模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class seq2seq(tf.keras.Model):
  def __init__(self,max_sequence_len,total_words):
    super(seq2seq,self).__init__()
    self.max_sequence_len = max_sequence_len
    self.total_words = total_words

    self.input_len = self.max_sequence_len - 1
    self.total_words = self.total_words

    #Encoder
    self.enc_embedding = tf.keras.layers.Embedding(input_dim = total_words,output_dim = 300,input_length = max_sentence_len - 1)
    self.enc_lstm_1 = tf.keras.layers.LSTM(units = 300, activation = 'tanh')
    self.enc_lstm_2 = tf.keras.layers.LSTM(units = 300, activation = 'tanh', return_state = True)

    #decoder
    self.dec_embedding = tf.keras.layers.Embedding(input_dim = total_words,output_dim = 300,input_length = max_sentence_len - 1)
    self.dec_lstm_1 = tf.keras.layers.LSTM(units = 300, activation = 'tanh')
    self.dec_lstm_2 = tf.keras.layers.LSTM(units = 300, activation = 'tanh', return_state = True,return_sequences = True)

    #Dense layer and output:
    self.dense = tf.keras.layers.Dense(total_words, activation='softmax')

  def call(self,inputs):
    #Encoding
    enc_x = self.enc_embedding(inputs)
    enc_x = self.enc_lstm_1(enc_x)
    enc_outputs, state_h, state_c = self.enc_lstm_2(enc_x)

    #Decoding:
    dec_x = self.dec_embedding(enc_outputs)
    dec_x = self.dec_lstm_1(dec_x,initial_state = [state_h, state_c])
    dec_outputs, _, _ = self.enc_lstm_2(dec_x)
    output_dense = self.dense(dec_outputs)

    return output_dense

model = seq2seq(max_sequence_len = max_sentence_len,total_words = total_words)  
model.compile(optimizer = tf.keras.optimizers.RMSprop(lr=0.0001),loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(predictors,label,epochs=5, batch_size=128)

但最后我得到以下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ValueError                                Traceback (most recent call last)
<ipython-input-4-1c349573302d> in <module>()
     37 model = seq2seq(max_sequence_len = max_sentence_len,total_words = total_words)
     38 model.compile(optimizer = tf.keras.optimizers.RMSprop(lr=0.0001),loss='categorical_crossentropy', metrics=['accuracy'])
---> 39 model.fit(predictors,label,epochs=5, batch_size=128)

8 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/autograph/impl/api.py in wrapper(*args, **kwargs)
    235       except Exception as e:  # pylint:disable=broad-except
    236         if hasattr(e, 'ag_error_metadata'):
--> 237           raise e.ag_error_metadata.to_exception(e)
    238         else:
    239           raise

ValueError: in converted code:

    <ipython-input-4-1c349573302d>:27 call  *
        enc_outputs, state_h, state_c = self.enc_lstm_2(enc_x)
    /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/layers/recurrent.py:623 __call__
        return super(RNN, self).__call__(inputs, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/base_layer.py:812 __call__
        self.name)
    /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/input_spec.py:177 assert_input_compatibility
        str(x.shape.as_list()))

    ValueError: Input 0 of layer lstm_1 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 300]

我明白,问题出在输入形状中(正如在帖子中回答的那样,预期 ndim=3,发现 ndim=2)。

但我不知道我应该如何为 tensorflow 2.0 重塑我的数据。
你能帮我解决这个问题吗?

  • 如果您共享完整的错误跟踪,这会有所帮助
  • @OverLordGoldDragon 已编辑。请看一下。
  • 错误很好,但是您确定您提供的代码是您使用的代码吗?我很惊讶它完全可以编译——这些层甚至没有连接。对于您的问题,使用基于类的模型定义似乎是一种过度杀伤力——无论如何,问题是不可重现的。在此处查看参考实现
  • @OverLordGoldDragon 是的,我确定
  • 我非常怀疑它 - 但试一试,分享你的完整代码,也许它会改变一些东西。
  • @OverLordGoldDragon 已更正,现在图层已连接。


问题的根源在于 return_sequences:

的使用

  • True --> 返回每个输入时间步的输出。 LSTM 维度为 20,输入形状为 (32, 100, 40),输出形状为 (32, 100, 20) == (batch_size, timesteps, lstm_units)
  • False --> 返回最后一个时间步的输出,使用所有时间步计算:(32, 1, 20)

默认情况下,层将压缩尺寸为 1 - 所以 return_sequences=False 返回一个 2D 输入。同样,Dense 不能处理 3D 输入,除非通过 TimeDistributed - 所以预密集 LSTM 应该有 return_sequences=False。所有提到的更改都在下面实现 - 模型能够适应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class seq2seq(tf.keras.Model):
  def __init__(self,max_sequence_len,total_words):
    super(seq2seq,self).__init__()
    self.max_sequence_len = max_sequence_len
    self.total_words = total_words

    self.input_len = self.max_sequence_len - 1
    self.total_words = self.total_words

    #Encoder
    self.enc_embedding = tf.keras.layers.Embedding(input_dim = total_words,
                         output_dim = 300,input_length = max_sentence_len - 1)
    self.enc_lstm_1 = tf.keras.layers.LSTM(units = 300, activation = 'tanh',
                                           return_sequences=True)
    self.enc_lstm_2 = tf.keras.layers.LSTM(units = 300, activation = 'tanh',
                                           return_state = True)

    #decoder
    self.dec_embedding = tf.keras.layers.Embedding(input_dim = total_words,
                         output_dim = 300,input_length = max_sentence_len - 1)
    self.dec_lstm_1 = tf.keras.layers.LSTM(units = 300, activation = 'tanh',
                                           return_sequences=True)
    self.dec_lstm_2 = tf.keras.layers.LSTM(units = 300, activation = 'tanh',
                         return_state = True,return_sequences = False)

    #Dense layer and output:
    self.dense = tf.keras.layers.Dense(total_words, activation='softmax')

  def call(self,inputs):
    #Encoding
    enc_x = self.enc_embedding(inputs)
    enc_x = self.enc_lstm_1(enc_x)
    enc_outputs, state_h, state_c = self.enc_lstm_2(enc_x)

    #Decoding:
    dec_x = self.dec_embedding(enc_outputs)
    dec_x = self.dec_lstm_1(dec_x,initial_state = [state_h, state_c])
    dec_outputs, _, _ = self.enc_lstm_2(dec_x)
    output_dense = self.dense(dec_outputs)

    return output_dense

有关关于python:LSTM:lstm_1层的输入0与层不兼容:预期ndim=3,发现ndim=2(reshaping input)的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  3. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  4. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  5. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  9. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  10. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

随机推荐