编程语言
首页 > 编程语言> > python – 为什么Keras Conv1D图层的输出张量没有输入维度?

python – 为什么Keras Conv1D图层的输出张量没有输入维度?

作者:互联网

根据keras文档(https://keras.io/layers/convolutional/),Conv1D输出张量的形状是(batch_size,new_steps,filters),而输入张量形状是(batch_size,steps,input_dim).我不明白这是怎么回事,因为这意味着如果你传递长度为8000的1d输入,其中batch_size = 1且步数= 1(我听说步骤意味着输入中的#个通道)那么这个层就会有形状(1,1,X)的输出,其中X是Conv层中的滤波器数.但是输入维度会发生什么?由于图层中的X滤镜应用于整个输入尺寸,因此输出尺寸不应为8000(或者更少,具体取决于填充),如(1,1,8000,X)?我检查过,Conv2D图层的行为方式更符合他们的output_shape(samples,filters,new_rows,new_cols),其中new_rows和new_cols将是基于填充再次调整的输入图像的尺寸.如果Conv2D图层保留其输入尺寸,为什么不使用Conv1D图层?这里有什么我想念的吗?

背景资料:

我试图想象我的CNN的1d卷积层激活,但我发现大多数在线工具似乎只适用于2d卷积层,所以我决定为它编写自己的代码.我已经非常了解它是如何工作的,这是我到目前为止所获得的代码:

# all the model's activation layer output tensors
activation_output_tensors = [layer.output for layer in model.layers if type(layer) is keras.layers.Activation]

# make a function that computes activation layer outputs
activation_comp_function = K.function([model.input, K.learning_phase()], activation_output_tensors)

# 0 means learning phase = False (i.e. the model isn't learning right now)
activation_arrays = activation_comp_function([training_data[0,:-1], 0])

此代码基于julienr在此thread中的第一条评论,并对当前版本的keras进行了一些修改.当我使用它的时候,虽然所有的激活阵列都是形状的(1,1,X)……我昨天花了整整一天试图找出原因,但没有运气任何帮助都非常感激.

更新:结果我误认为input_dimension的含义与步骤维度.这主要是因为我使用的架构来自另一个在mathematica中构建模型的组,而在mathematica中,(X,Y)到Conv1D层的输入形状意味着X“通道”(或X的input_dimension)和Y步.感谢gionni帮助我实现这一点并很好地解释了“input_dimension”如何成为“过滤器”维度.

解决方法:

我以前对2D卷积有同样的问题.问题在于,当您应用卷积层时,您应用的内核不是大小(kernel_size,1),而是实际上(kernel_size,input_dim).

如果你想到它,如果不是这样的话,带有kernel_size = 1的1D卷积层对它收到的输入什么都不做.

相反,它计算每个时间步的输入要素的加权平均值,每个时间步使用相同的权重(尽管每个过滤器使用不同的权重集).我认为将input_dim可视化为图像的2D卷积中的通道数是有帮助的,其中相同的重新应用(在这种情况下是“迷路”并转换为滤波器数量的通道).

为了说服自己,可以使用kernel_size =(1D_kernel_size,input_dim)和相同数量的滤波器,使用2D卷积层重现1D卷积.这是一个例子:

from keras.layers import Conv1D, Conv2D
import keras.backend as K
import numpy as np

# create an input with 4 steps and 5 channels/input_dim
channels = 5
steps = 4
filters = 3
val = np.array([list(range(i * channels, (i + 1) * channels)) for i in range(1, steps + 1)])
val = np.expand_dims(val, axis=0)
x = K.variable(value=val)

# 1D convolution. Initialize the kernels to ones so that it's easier to compute the result by hand

conv1d = Conv1D(filters=filters, kernel_size=1, kernel_initializer='ones')(x)

# 2D convolution that replicates the 1D one

# need to add a dimension to your input since conv2d expects 4D inputs. I add it at axis 4 since my keras is setup with `channel_last`
val1 = np.expand_dims(val, axis=3)
x1 = K.variable(value=val1)

conv2d = Conv2D(filters=filters, kernel_size=(1, 5), kernel_initializer='ones')(x1)

# evaluate and print the outputs

print(K.eval(conv1d))
print(K.eval(conv2d))

正如我所说,我花了一段时间来理解这一点,我想主要是因为没有教程清楚地解释它

标签:python,keras,conv-neural-network,tensor
来源: https://codeday.me/bug/20190608/1196548.html