尝试创建2个昏暗输入的卷积层失败

时间:2019-11-30 14:05:28

标签: tensorflow keras neural-network conv-neural-network mfcc

我正在做我的第一学位课程的最后一个项目。简而言之,我要提取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]

1 个答案:

答案 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