TensorFlow 实现信号与系统中的严格卷积操作(类似np.convolve)

发布时间 2024-01-02 11:23:11作者: 海上灵光闪硕

在TensorFlow中,可以使用tf.nn.conv1d函数来进行一维的卷积操作,这个函数通常是用于卷积神经网络的,但也可以实现信号与系统里的卷积,此处关于信号与系统的卷积,可以参照【官方双语】那么……什么是卷积?_哔哩哔哩_bilibili

Numpy代码及结果

#得到结果:[ 4 13 28 27 18]
np.convolve((1,2,3),(4,5,6))

TensorFlow的实现

  • 需要注意的是在TensorFlow中的conv1d函数的padding填充方式,共有'VALID'(不填充)、'SAME'(与输入张量相同)、'EXPLICIT'(显式填充,直接自定义填充层)。具体可以参照:Module: tf.nn | TensorFlow v2.14.0 。这里使用手动填充0并选择'SAME'填充方式。
import tensorflow as tf
import numpy as np

# 定义输入信号和卷积核
input_signal = np.array([1, 2, 3], dtype=np.float32)
kernel = np.array([4, 5, 6], dtype=np.float32)

# 指定填充长度
paddings = [[2,0]]
input_signal=tf.pad(input_signal, paddings)

# 将卷积核翻转
# tf.nn.conv1d实际上执行的是互相关(cross-correlation)并非严格意义上的卷积,标准的卷积操作包括对系统响应取反向 (将系统响应翻转)。
kernel = kernel[::-1]
kernel=tf.pad(kernel, paddings)

# 扩展一维为符合tensorflow的要求
input_signal = tf.reshape(input_signal, [1, -1, 1]) # shape becomes [1, 3, 1]
kernel = tf.reshape(kernel, [-1, 1, 1]) # shape becomes [3, 1, 1]

# 进行卷积运算,设置填充方式为'SAME',即输出与填充后的输入数据相同形状
output = tf.nn.conv1d(input_signal, kernel, stride=1, padding='SAME')

# 处理卷积运算后的结果
output = tf.squeeze(output).numpy() # shape becomes [5,]

print(output) # prints: [ 4. 13. 28. 27. 18.]