尝试为 2 个暗淡输入创建卷积层失败

Trying unsuccesfully to create a convolution layer to 2 dim input

我正在做关于第一学位研究的期末项目。简而言之,我正在使用 772 个训练声音文件,每个声音文件都有 327 个称为 mfcc 的声音特征系数,所以我的 x_training 输入是 - 772*327。

我问我推荐使用什么型号,我得到了答复 -

Try CNN on MFCC (add 4 or so CNN layers followed by Max Pooling) -> Flatten -> Dense Layers This is a very generic architecture that works for most tasks of this nature – Iordanis 2 days ago

所以我尝试使用 tensorflow 创建它 -

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,但它也没有用(只是将错误更改为 excepted 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: Input 0 of layer conv1d is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 312]

由于您的训练数据只有一个特征维度,因此请使用 Conv1D 而不是 Conv2D。然后你的输入有一个像 (?, x, 1) 这样的 3d 形状,其中第一个维度是批量大小,第二个是特征,最后一个包含值本身。 因此,首先尝试通过

重塑您的数据
x_train = x_train.reshape(np.append(x_train.shape, 1))

input_shape=(x_train.shape[1:]) 应该可以正常工作。

请注意,之后您还必须将池化更改为 MaxPooling1D