tf.nn.conv1d(
value,
filters,
stride,
padding,
use_cudnn_on_gpu=None,
data_format=None,
name=None
)
我们来理解一下怎么运算的
一个conv2d [128,128,3] 卷积核[3,3,64] ==> [128,128,64] 计算改变了通道数,实际上是每一个通道的卷积核与输入所有通道做计算。
类比一下 conv1d 卷积核变为1维 也就是filter_width,每一个新通道与旧的所有通道相乘,然后多个卷积核相加,实际上是一个矩阵相乘,旧通道为行乘新通道列,看做两个矩阵运算就得出了所有的旧通道*所有的新通道。矩阵运算完再做卷积核的运算应该会简洁很多。
看个例子:
import keras
import keras.backend as K
x = K.variable([[[0.5,0.5,0.5], [1.0,1.0,1.0], [1.5,1.5,1.5], [2.0,2.0,2.0], [2.5,2.5,2.5]]]) # (1,5,3)
# 卷积核大小3 输出通道5
cnn = keras.layers.Conv1D(5, 3, activation='relu', padding='same', kernel_initializer=keras.initializers.Ones(), bias_initializer=keras.initializers.Zeros())(x)
print(K.eval(cnn)) # shape: (1, 5, 5)
# (1*0.5+1*0.5+1*0.5)*3 3:通道
array([[[ 4.5, 4.5, 4.5, 4.5, 4.5],
[ 9. , 9. , 9. , 9. , 9. ],
[13.5, 13.5, 13.5, 13.5, 13.5],
[18. , 18. , 18. , 18. , 18. ],
[13.5, 13.5, 13.5, 13.5, 13.5]]], dtype=float32)
TensorFlow函数:tf.nn.conv1d