在我的问题中,我想在神经网络模型中卷积两个张量。
两个张量的形状分别为[None,2,1],[None,3,1]。尺寸为None的轴表示输入张量的批量大小。对于批量中的每个样本,我想对两个张量分别为[2,1]和[3,1]的卷积进行卷积。
但是,TensorFlow中的tf.nn.conv1d只能将输入与固定内核进行卷积。是否有任何功能可以根据批处理大小轴支持两个张量的卷积,类似于tf.multiply可以为每个样本将两个张量相乘,或者只是逐元素相乘。
我运行的代码可以简化如下:
input_signal = Input(shape=(L, M), name='input_signal')
input_h = Input(shape=(N), name='input_h')
faded= Lambda(lambda x: tf.nn.conv1d(input, x))(input_h)
我想做的是,可以将具有相同索引的input_h样本卷积为input_signal样本。但是,它仅显示了我的纯洁想法,无法在环境中运行。我的问题是,对于批处理中的每个样本,如何修改代码以启用输入张量都可以与另一个输入张量进行卷积。
答案 0 :(得分:0)
根据Conv1D层或documentation中提到的任何其他层的内核大小参数的描述,您不能添加多个具有不同内核大小或跨度的过滤器。
此外,具有不同大小的内核的卷积将产生不同的高度和宽度的输出。
给出了假设对称核的输出大小的一般公式(X-K + 2P)/ S + 1
因此,假设您保持零填充且步幅相同,则在ConvD层中不能有多个大小不同的内核。
但是,您可以使用tf.keras.Model API在同一个输入上多次创建Conv1D,或者在您的情况下分别针对不同的输入和内核大小创建多个Conv1D层,然后使用maxpool,crop或使用零填充来创建。在堆叠它们之前,请先匹配它们的尺寸。
示例:
inputs = tf.keras.Input(shape=(n_timesteps,n_features))
x1 = tf.keras.layers.Conv1D(filters=32, kernel_size=2)(inputs)
x2 = tf.keras.layers.Conv1D(filters=16, kernel_size=3)(inputs)
#match dimensions (height and width) of x1 or x2 here
x3 = tf.keras.layers.Concatenate(axis=-1)[x1,x2]
您可以使用Zeropadding1D或Cropping2D或Maxpool1D来匹配尺寸。