当前位置: 首页 > 知识库问答 >
问题:

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

盛辰沛
2023-03-14

根据keras文件(https://keras.io/layers/convolutional/)Conv1D输出张量的形状为(batch\u size,new\u steps,filters),而输入张量的形状为(batch\u size,steps,input\u dim)。我不明白这是怎么回事,因为这意味着如果你传递一个长度为8000的1d输入,其中batch\u size=1,steps=1(我听说steps是指输入中的通道数),那么这个层的输出将是形状(1,1,X),其中X是Conv层中的过滤器数。但输入维度会发生什么变化?既然层中的X过滤器应用于整个输入维度,那么输出维度中的一个不应该是8000(或更少,取决于填充),比如(1,18000,X)?我检查了和Conv2D层的行为,使它们的输出形状(采样、过滤器、新行、新列)更有意义,其中新行和新列是输入图像的尺寸,再次根据填充进行调整。如果Conv2D图层保留其输入尺寸,为什么Conv1D图层不保留?这里有我遗漏的东西吗?

背景信息:

我试图将CNN的一维卷积层激活可视化,但我发现大多数在线工具似乎只适用于二维卷积层,所以我决定为其编写自己的代码。我对它的工作原理有很好的了解,这里是我目前掌握的代码:

# 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在该线程中的第一条评论,并对当前版本的keras进行了一些修改。当然,当我使用它时,虽然所有的激活数组都是形状(1,1,X)。。。昨天我花了一整天的时间想弄明白为什么会这样,但运气不好,任何帮助都不值得感激。

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

共有1个答案

王岳
2023-03-14

我以前也有二维卷积的问题。问题是,当您应用卷积层时,您应用的内核不是大小(kernel\u size,1),而是实际大小(kernel\u size,input\u dim)。

如果你想一想,如果不是这样的话,内核大小为1的1D卷积层对它接收到的输入没有任何作用。

相反,它是在每个时间步计算输入特征的加权平均值,对每个时间步使用相同的权重(尽管每个过滤器使用不同的权重集)。我认为这有助于在图像的2D卷积中将输入dim可视化为通道数,在这种情况下,同样的重排适用(在这种情况下是“丢失”并转换为过滤器数的通道)。

为了让自己相信这一点,您可以使用2D卷积层来重现1D卷积,使用kernel\u size=(1D\u kernel\u size,input\u dim)和相同数量的过滤器。以下是一个示例

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))

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

 类似资料:
  • 我基于mobilenet运行了这个keras模型:https://gist.github.com/giacomobartoli/eb45ab61b43e5e47ea2a60113f9352ef 输出是一个名为mobilenetv1的冻结图。PB 现在,我想在新的Google Vision工具包上编译这个模型。 为了做到这一点,我需要知道我的冻结图(mobilenetv1.pb)的输入和输出张量的名

  • 问题内容: 我有一个可加载的内核模块,其初始化如下 我还启用了正在使用的内核版本上启用的动态调试-ie 。 在模块的Makefile中,我在其中添加了一行,即文件名。 现在,我在执行此模块的insmod后检查了一下,在其中发现了以下几行 即使做了所有这些,令我失望的是,在dmesg的输出中找不到上述两个pr_debug语句。那我想念什么或做错什么呢? 问题答案: 假设是模块源文件,请将以下内容添加

  • 我是编程新手,我们从学校得到了一个例子来了解扫描仪是如何工作的。我的问题是,我不明白为什么消息“Input”(while循环中的System.out.println)会被打印两次。

  • 问题内容: 我在Keras的最后一层中使用一些tensorflow函数(reduce_sum和l2_normalize)构建模型,而遇到此问题。我一直在寻找解决方案,但所有解决方案都与“ Keras张量”有关。 这是我的代码: 然后是错误: ValueError:模型的输出张量必须是TensorFlow的输出(因此保留过去的层元数据)。找到:Tensor(“ l2_normalize_3:0”,s

  • 我正在尝试实现tensorflow回归模型,我的数据形状是train_X=(200,4)和train_Y=(200,)。我得到的形状错误,这是我的一段代码,请任何人都能提到我在哪里做错了。 df=pd。读取\u csv('all.csv') df=df。下降(“时间”,轴=1) 打印(df.descripe())#以了解数据集 列车Y=df[“功率”] 列车X=df。下降('功率',轴=1) 列车

  • 问题内容: 我正在使用具有Spring安全性的BCryptPasswordEncoder。我的期望是,对于相同的输入,我将始终获得相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用以下代码段对其进行测试: 输出:$ 2a $ 10 $ cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi 输出2:$ 2a $ 10 $ KEvYX9y