我正在进行一个“音乐流派分类”项目,并使用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。也许你要找的是一维卷积。