【问题标题】:expected conv1d_1_input to have shape (15, 512) but got array with shape (4, 512)预期 conv1d_1_input 的形状为 (15, 512) 但得到的数组形状为 (4, 512)
【发布时间】:2018-07-20 16:42:41
【问题描述】:

我正在使用 CNN 和 word2vec 作为嵌入方法在 python 中使用 keras 进行情感分析项目。 根据我的代码,我设置了我的输入形状,15 和 512,所以当我想预测一个新句子的极性时说:“我很抱歉”,例如,长度:4 - 我面临这个错误:

预期 conv1d_1_input 的形状为 (15, 512) 但得到的数组形状为 (4, 512) 这是我的代码的一部分:

model = Sequential()
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same', 
input_shape=(15, 512)))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Dropout(0.25))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Dropout(0.25))
model.add(Dense(256, activation='relu')
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(2, activation='softmax'))

我所能做的就是制作新的 python 文件并加载我所有的相关模型,例如 word2vec ...并像这样更改其上的输入形状:

model111 = Sequential()
model111.add(Conv1D(32, kernel_size=3, activation='elu', padding='same', 
input_shape=(len(input), 512)))
model111.add(Dense(256, activation='relu'))
model111.add(Dense(256, activation='relu'))
model111.add(Dropout(0.5))
model111.add(Flatten())
model111.add(Dense(2, activation='softmax'))

我想知道这个方法好不好??任何有效的解决方案将不胜感激

【问题讨论】:

    标签: python keras conv-neural-network prediction sentiment-analysis


    【解决方案1】:

    当您的输入尺寸小于您的模型预期时,您需要进行填充(即在输入数组的末尾添加零以完成预期尺寸,然后再提供给模型。有一个 keras 函数可以做到这一点:

    from keras.preprocessing.sequence import pad_sequences
    input_array = pad_sequences(input_array, maxlen=max_tweet_length, padding='post')
    

    然后,重塑您的数据,使其符合 CNN 的预期空间性:

    input_array = input_array.reshape(input_array.shape + (1,))
    

    【讨论】:

    • 您确定 pad_sequences 可以与 CNN 一起使用吗?据我所知,CNN 不支持这种方法,我应该直接使用它,当我这样做时,我会遇到此错误:检查输入时出错:预期 conv1d_1_input 具有 3 维,但得到的数组形状为 (1, 15 )
    • 是的。有用!问题是 CNN 需要一个 3d 张量,与填充无关。尝试在填充后向输入张量添加 1 个维度。像这样:`input_array = input_array.reshape(input_array.shape + (1,)))`
    • 感谢您的解决方案-因为我对这个领域有点陌生,请您稍微解释一下这句话:您需要为您的张量添加 1 个维度
    • 这是因为 CNN 需要一个形状为 (batch_size, steps, input_dim) 的张量,而您给出的是这个形状的张量 (batch_size, steps)
    • 感谢一百万,出现了一些愚蠢的错误 - 现在已修复
    【解决方案2】:

    根据 Eduardo Soares 所说,我应该直接填充我的输入句子或使用 pad_sequences 函数如下:

    from keras.preprocessing.sequence import pad_sequences
    input_array = pad_sequences(input_array, maxlen=max_tweet_length, padding='post')
    

    然后我得到了这个错误:

    检查输入时:预期 conv1d_1_input 有 3 个维度,但是 得到形状为 (1, 15) 的数组

    这与前错误无关,据我了解,这与输入形状有关,因此我应该在填充后重新调整输入(此处为 input_array),所以我使用以下代码进行了尝试:

    input_array = input_array.reshape(input_array.shape + (1,))
    

    一切顺利!希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2019-05-09
      • 2019-08-10
      相关资源
      最近更新 更多