【问题标题】:Trying unsuccesfully to create a convolution layer to 2 dim input尝试为 2 个昏暗输入创建卷积层但未成功
【发布时间】:2020-03-25 18:24:04
【问题描述】:

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

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

在 MFCC 上尝试 CNN(添加 4 个左右的 CNN 层,然后是 Max Pooling)-> Flatten -> Dense Layers 这是一个非常通用的架构,适用于这种性质的大多数任务 – Iordanis 2 天前

所以我尝试使用 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,但它也不起作用(只是将错误更改为例外 3d 而不是 4d)

有人知道我该怎么办...

对不起我的英语,如果是愚蠢的问题,我很抱歉,我对 tensorflow 很陌生 :)

编辑:

我做了以下事情,但现在写给我:

TypeError:将形状转换为 TensorShape 时出错:int() 参数必须是字符串、类似字节的对象或数字,而不是“元组” 在密集层上

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]

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如果你首先重塑你的数据,你必须使用input_shape=(x_train.shape[1:]),而不是input_shape=(x_train.shape[1:], 1)。对不起,如果我把你弄糊涂了。
    • 我也试过了,但它给我写了同样的错误
    • ValueError: 层 conv1d 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[无,
    • 这就是我现在所做的: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'),
    • 对不起,我想我犯了一个错误。请查看我的帖子的编辑!
    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2012-06-25
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多