层conv1d_1的输入0与该层不兼容:预期ndim = 3,找到的ndim = 2。收到的完整形状:[无,200]

时间:2019-08-09 13:06:54

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

我正在开发应预测10秒音频文件中有趣时刻的应用程序。我将音频分割为50ms的块并提取了音符,因此每个示例都有200个音符。当我添加卷积层时,它将返回错误:

  

ValueError:conv1d_1层的输入0与该层不兼容:   预期ndim = 3,找到的ndim = 2。收到完整的图形:[无,200]

这是我的代码:

library(ggplot2)

x <- c(1:70)
y <- c((1:70)^2)
df <- data.frame(x,y)

ggplot(df, aes(x = x, y = y)) +
  ylab(expression(bold("Height"))) +
  xlab(expression(bold("Width"))) +
  geom_point(size=1, col="red") +
  geom_hline(aes(yintercept=2000, linetype = "1st border of height"),col="green",size=1) +
  geom_hline(aes(yintercept=4000, linetype = "2st border of height"), col="red", size=1) +
  geom_vline(aes(xintercept=20, linetype = "1st border of width"), col="blue", size=1, linetype="dashed") +
  geom_vline(aes(xintercept=40, linetype = "2st border of width"),col="darkblue", size=1, linetype="dashed") +
  geom_smooth(lwd=1, col="blue", span = 0.8, se=F) +
  scale_linetype_manual(name = "Legend", values = c(1,2,1,1), 
                    guide = guide_legend(override.aes = list(color = c("green", "red", "blue", "darkblue")))) + 
  theme()

什么原因导致此问题,以及如何解决?

1 个答案:

答案 0 :(得分:1)

序列上的1D卷积需要3D输入。换句话说,对于批次中的每个元素,每个时间步长,单个向量。请考虑以下内容:

X = tf.random.normal([10, 200])
convolved = tf.keras.layers.Conv1D(32, 3, padding='same', activation=tf.nn.relu, input_shape=[None, 200])
print(convolved(X))

这会引发错误:

  

ValueError:conv1d_3层的输入0与该层不兼容:预期ndim = 3,找到的ndim = 2。收到的完整图形:[10,200]

但是,如果我们提供10个批次样本中的每个样本,则对于5个时间步长中的每一个,都会提供200维矢量:

X = tf.random.normal([10, 5, 200])
convolved = tf.keras.layers.Conv1D(32, 3, padding='same', activation=tf.nn.relu, input_shape=[None, 200])
print(convolved(X)

这可以正常工作。因此,在您的情况下,对于每个音频文件,每一秒钟(取决于您对数据进行采样的方式),都将具有单个矢量。