python - Tensorflow 中的 Conv1D 混淆
问题描述
由于一些维度问题,试图实现一篇论文并遇到一些砖墙。我的输入是单声道音频数据,其中 128 帧 50ms 的 16kHz 采样音频被输入网络。所以我的输入形状是:[128,0.005*16000, 1] 这是图层详细信息 -
1.) conv-bank 块:Conv1d-bank-8, LeReLU, IN (instance normalization) 我使用:
bank_width = 8
conv_bank_outputs = tf.concat([ tf.layers.conv1d(input,1,k,activation=tf.nn.leaky_relu,padding="same") for k in range(1, bank_width + 1)], axes = -1)
2.) conv-block: C-512-5, LReLu --> C-512-5,stride=2, LReLu, IN, RES (Residual)
这就是我卡住的地方,第二个卷积的输出形状和 (2) 层的输入形状不匹配。我无法理解它。
我使用以下方法实现了这一点:
block_1 = tf.layers.conv1d(input,filters=512,kernel_size=5,activation=tf.nn.leaky_relu,padding="same")
block_2 = tf.layers.conv1d(block_1,filters=512,kernel_size=5,strides=2,activation=tf.nn.leaky_relu,padding="same")
IN = tf.contrib.layers.instance_norm(block_2)
RES = IN + input
错误:ValueError: Dimensions must be equal, but are 400 and 800 for 'add' (op: 'Add') with input shapes: [128,400,512], [128,800,1024].
解决方案
当您使用 stride = 2 在 block1 上运行 conv1d 时,输入数据减半,因为 conv1d 有效地仅对备用数字进行采样,并且您还更改了通道数。这通常可以通过 1x1 conv 与 stride 2 和过滤器 512 对输入进行下采样来解决,但如果你可以分享这篇论文,我可以更具体。
推荐阅读
- java - 如何使用 Stream Api 从 Java 中的两个列表创建列表
- c# - 如何将数据传递到 ShellSection 的 ShellContent 以在 Xamarin.Forms Shell 应用程序上将同一页面用于不同目的?
- python - 如何确定哪个 py 文件(以及该 py 文件中的哪个类)调用了另一个 py 文件?
- intellij-idea - Intellij Idea 配置两个命令来部署 Angular 项目
- mysql - MySQL在过程中的if语句中选择
- c - 如果 scanf 类型错误,我应该如何打破循环?(C)
- c# - “xxx' 由于其保护级别而无法访问” 一切都是公开的(我认为)
- python - 获取点赞数、转发数和评论数最多的推文
- reactjs - .NET webapi 端点在 Postman 中工作,但 Chrome 提供 net::ERR_FAILED
- javascript - 为什么不能直接更新对象中嵌套属性的值?