【问题标题】:Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (800, 1000)检查输入时出错:预期 conv2d_1_input 有 4 个维度,但得到了形状为 (800, 1000) 的数组
【发布时间】:2019-08-25 05:31:12
【问题描述】:

我正在尝试使用 CNN 进行情感分析 我的代码我的数据具有 (1000,1000) 形状,当我将数据传递给卷积 2D 时,它给我一个错误。我无法解决。 我尝试了以下解决方案,但仍然面临问题。 When bulding a CNN, I am getting complaints from Keras that do not make sense to me.

我的代码如下。

TfIdf = TfidfVectorizer(max_features=1000) 
X = TfIdf.fit_transform(x.ravel()) 
Y = df.iloc[:,1:2].values


X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2,random_state=1)

classifier = Sequential()

classifier.add(Convolution2D(32, kernel_size=(3,3), input_shape=(1000, 1000, 1), activation = 'relu'))

classifier.add(MaxPooling2D(pool_size=(2,2)))

classifier.add(Flatten())

classifier.add(Dense(output_dim =  128, activation='relu'))

classifier.add(Dense(output_dim =  1, activation='sigmoid'))

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

classifier.fit(X_train, Y_train, batch_size = 10, nb_epoch = 100, validation_data=(X_test,Y_test))

(loss,accuracy) = classifier.evaluate(X_test,Y_test, batch_size =10)

print(accuracy)

【问题讨论】:

  • 你怎么说你有输入形状 (1000, 1000) 但错误状态你有 (800, 1000)? X_train的形状是什么?
  • 我的 x_train 是 800,100 我也尝试给 input_shape = x_train.shape
  • conv2d 层要求输入形状为 4D 张量(样本、行、列、通道),其中样本为批量大小。你只有两个。你有什么样的数据?
  • 它是一个文本数据...在 TFIDF 之后它的形状为 1000,1000
  • 您为什么决定使用主要用于处理图像的 2d 卷积?如果这是一个序列,你需要使用循环网络或 LSTM

标签: machine-learning keras deep-learning artificial-intelligence conv-neural-network


【解决方案1】:

我可能错了,但对我来说,您需要扩展数据维度以对应您的网络:

喜欢:

X = np.expand_dims(X, axis=-1)

【讨论】:

    【解决方案2】:

    您的神经网络期望数据是四维的。尺寸为(samples, rows, columns, channels)。您的输入数据似乎只是二维的。您需要添加第一个维度,即样本,因为 Keras 期望在输入处获得更多样本。您可以使用

    将样本维度添加到当前输入矩阵
    X = X[np.newaxis, ...]
    

    它将为大小为 1 的样本添加第一个维度。 您还需要将当前缺少的渠道维度添加为最后一个维度。

    这两个动作可以一步完成:

    X = X[np.newaxis, ..., np.newaxis]
    

    【讨论】:

      【解决方案3】:

      我添加了嵌入层并将 2d 卷积层替换为 1d。但是即使我更改了参数,我的准确性也是恒定的。

      这是我的代码。

      classifier = Sequential()
      
      classifier.add(Embedding(1000,64,input_length=1000))
      
      classifier.add(Convolution1D(32, kernel_size=3, activation = 'relu'))
      
      classifier.add(MaxPooling1D(pool_size=2))
      
      classifier.add(Flatten())
      
      classifier.add(Dense(output_dim =  128, activation='relu'))
      
      classifier.add(Dense(output_dim =  1, activation='sigmoid'))
      
      classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) 
      

      【讨论】:

        猜你喜欢
        • 2018-01-09
        • 2018-11-09
        • 2020-03-03
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        相关资源
        最近更新 更多