Python神经网络 – 检查输入时出错:期望conv2d_1_input具有4个维度,但得到的数组形状为(700, 128, 33)

我正在进行一个“音乐流派分类”项目,并使用GTZAN数据集来创建一个简单的CNN网络,以对音频文件进行流派分类。

我的模型训练、验证和测试代码如下:

input_shape = (genre_features.train_X.shape[1], genre_features.train_X.shape[2],1)print("构建CNN模型 ...")model = Sequential()model.add(Conv2D(24, (5, 5), strides=(1, 1), input_shape=input_shape))model.add(AveragePooling2D((2, 2), strides=(2,2)))model.add(Activation('relu'))model.add(Conv2D(48, (5, 5), padding="same"))model.add(AveragePooling2D((2, 2), strides=(2,2)))model.add(Activation('relu'))model.add(Conv2D(48, (5, 5), padding="same"))model.add(AveragePooling2D((2, 2), strides=(2,2)))model.add(Activation('relu'))model.add(Flatten())model.add(Dropout(rate=0.5))model.add(Dense(64))model.add(Activation('relu'))model.add(Dropout(rate=0.5))model.add(Dense(10))model.add(Activation('softmax'))print("编译中 ...")opt = Adam()model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])model.summary()print("训练中 ...")batch_size = 35  # 每个小批次的训练样本数num_epochs = 400model.fit(    genre_features.train_X,    genre_features.train_Y,    batch_size=batch_size,    epochs=num_epochs)print("\n验证中 ...")score, accuracy = model.evaluate(    genre_features.dev_X, genre_features.dev_Y, batch_size=batch_size, verbose=1)print("验证损失:  ", score)print("验证准确率:  ", accuracy)print("\n测试中 ...")score, accuracy = model.evaluate(    genre_features.test_X, genre_features.test_Y, batch_size=batch_size, verbose=1)print("测试损失:  ", score)print("测试准确率:  ", accuracy)# 创建一个HDF5文件 'lstm_genre_classifier.h5'model_filename = "lstm_genre_classifier_lstm.h5"print("\n保存模型: " + model_filename)model.save(model_filename)

当我尝试训练文件时,我得到了以下错误(我在编译模型之前也打印了训练、验证和测试的形状)

Training X shape: (700, 128, 33)Training Y shape: (700, 10)Dev X shape: (200, 128, 33)Dev Y shape: (200, 10)Test X shape: (100, 128, 33)Test Y shape: (100, 10)Build CNN model ...2020-12-25 15:46:58.410663: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2Compiling ...Model: "sequential_1"_________________________________________________________________Layer (type)                 Output Shape              Param #=================================================================conv2d_1 (Conv2D)            (None, 124, 29, 24)       624_________________________________________________________________average_pooling2d_1 (Average (None, 62, 14, 24)        0_________________________________________________________________activation_1 (Activation)    (None, 62, 14, 24)        0_________________________________________________________________conv2d_2 (Conv2D)            (None, 62, 14, 48)        28848_________________________________________________________________average_pooling2d_2 (Average (None, 31, 7, 48)         0_________________________________________________________________activation_2 (Activation)    (None, 31, 7, 48)         0_________________________________________________________________conv2d_3 (Conv2D)            (None, 31, 7, 48)         57648_________________________________________________________________average_pooling2d_3 (Average (None, 15, 3, 48)         0_________________________________________________________________activation_3 (Activation)    (None, 15, 3, 48)         0_________________________________________________________________flatten_1 (Flatten)          (None, 2160)              0_________________________________________________________________dropout_1 (Dropout)          (None, 2160)              0_________________________________________________________________dense_1 (Dense)              (None, 64)                138304_________________________________________________________________activation_4 (Activation)    (None, 64)                0_________________________________________________________________dropout_2 (Dropout)          (None, 64)                0_________________________________________________________________dense_2 (Dense)              (None, 10)                650_________________________________________________________________activation_5 (Activation)    (None, 10)                0=================================================================Total params: 226,074Trainable params: 226,074Non-trainable params: 0_________________________________________________________________Training ...Traceback (most recent call last):  File "cnn.py", line 82, in <module>    epochs=400  File "C:\Users\Bharat.000\miniconda3\lib\site-packages\keras\engine\training.py", line 1154, in fit    batch_size=batch_size)  File "C:\Users\Bharat.000\miniconda3\lib\site-packages\keras\engine\training.py", line 579, in _standardize_user_data    exception_prefix='input')  File "C:\Users\Bharat.000\miniconda3\lib\site-packages\keras\engine\training_utils.py", line 135, in standardize_input_data    'with shape ' + str(data_shape))ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (700, 128, 33)

我尝试了一些类似问题的解决方案,但由于我对这个主题还不太了解,所以没有理解多少。任何关于如何更改以获得正确输出的帮助将不胜感激。


回答:

你的输入维度有误。你确定你的数据是2D的(如图像)而不是1D的(如声波)吗?如果你的数据是1D的,那么你应该进行一维卷积。错误发生的原因是你的训练数据形状为(700(数据点数量),128,33)。在Keras的Conv2D中,你需要有(batch size, image_height, image_width, channels) —— channels可以是第一位或最后一位,但这并不重要。我要说的是,你提供的不是2D卷积所需的(image_height, image_width)元组,而是只有数字128。也许你要找的是一维卷积。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注