我正在做我的第一学位课程的最后一个项目。简而言之,我要提取772个训练声音文件,每个声音文件具有327个声音特征系数,称为mfcc,因此我的x_training输入为-772 * 327。
我问我推荐使用哪种型号,但我感到很生气-
在MFCC上尝试CNN(添加4个左右的CNN层,然后进行最大池化)->展平->密集层这是一种非常通用的体系结构,适用于这种性质的大多数任务– 2天前的Iordanis
所以我尝试使用张量流创建它-
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu', input_shape=(x_train.shape[1:])),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(32, activation='relu')
])
(整数值完全随机)
x_train.shape [1:]为327(每个声音文件中的mfcc系数数)
但不幸的是,它对我不起作用,它写道-
ValueError: Input 0 of layer conv2d is incompatible with the layer: expected ndim=4, found ndim=2. Full shape received: [None,
312]
我尝试将卷积层降低到1D,但它也没有用(只是将错误更改为例外3d而不是4d)
有人知道我该怎么办...
对不起我的英语,如果这是一个愚蠢的问题,对不起,我是tensorflow的新手:)
编辑:
我做了以下事情,但是现在写给我:
TypeError:将形状转换为TensorShape时出错:int()参数必须是字符串,类似字节的对象或数字,而不是'tuple' 在致密层上
x_train.reshape((-1, 1)) x_test.reshape((-1, 1)) model = tf.keras.models.Sequential([ tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(x_train.shape[1:], 1)), tf.keras.layers.MaxPooling1D(pool_size=2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(32, activation='relu'),
我也做到了:
x_train.reshape((-1, 1)) x_test.reshape((-1, 1)) model = tf.keras.models.Sequential([ tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(x_train.shape[1:])), tf.keras.layers.MaxPooling1D(pool_size=2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(32, activation='relu'),
但之前收到错误-
ValueError:conv1d层的输入0与该层不兼容: 预期ndim = 3,找到的ndim = 2。收到完整的图形:[无,312]
答案 0 :(得分:1)
由于您的训练数据只有一个特征维度,因此请使用Conv1D
而不是Conv2D
。然后,您的输入将具有一个3d形状,例如(?, x, 1)
,其中第一个尺寸为批处理大小,第二个尺寸为要素,最后一个包含值本身。
因此,请尝试首先通过
x_train = x_train.reshape(np.append(x_train.shape, 1))
和input_shape=(x_train.shape[1:])
应该可以正常工作。
请注意,之后您还必须将池更改为MaxPooling1D
!