在 PyTorch 中创建具有不同维度数组的张量
Create tensor with arrays of different dimensions in PyTorch
我想连接不同维度的数组以将它们提供给我的神经网络,该网络的第一层是 AdaptiveAveragePooling1d。我有一个由多个信号(一维数组)组成的数据集,每个信号的长度都不同。例如:
array1 = np.random.randn(1200,1)
array2 = np.random.randn(950,1)
array3 = np.random.randn(1000,1)
我想获得一个张量,我在其中连接这三个信号以获得二维张量。
但是,如果我尝试做
tensor = torch.Tensor([array1, array2, array3])
它给我这个错误:
ValueError: expected sequence of length 1200 at dim 2 (got 950)
有没有办法获得这样的东西?
编辑
有关数据集的更多信息:
- 每个信号 window 代表 ECG 记录上的一次心跳,取自多位患者,采样频率为 1000Hz
- 节拍可以有不同的长度,因为它取决于患者本身的心率
- 对于每个节拍,我需要预测我拥有的 QRS 间隔(网络的目标)的长度,以毫秒表示
- 我已经考虑过将最短样本插值到最长样本的长度,但是我还必须更改标签中 QRS 间隔的长度,对吗?
我读过这个 AdaptiveAveragePooling1d 层,它允许我使用不同大小的样本输入网络。但我的问题是如何向网络输入每个样本长度不同的数据集?如何在不使用 NaN 或零填充方法的情况下对它们进行分组?
希望我解释清楚了。
这不符合张量的定义,是不可能的。如果张量的形状为 (NxMx1),则所有 N 个矩阵的大小必须为 (Mx1)。
仍然有一些方法可以使所有数组的长度相同。查看您的数据来自何处及其结构,并找出以下哪些解决方案可行。其中一些可能会以您不喜欢的方式改变信号的导数
- 将数组裁剪成相同大小(即剪掉 start/end)或将较短的数组零填充到较长数组的长度(我真的不喜欢这个,它只适用于非常特定的应用程序)
- 'Stretching' 使用插值将数组大小相同
- 通过子采样将数组缩短到相同大小
- 对于某些应用程序,甚至可能传递 a 的系数
来自信号的傅里叶级数
编辑
对于心率,它应该是一个大致周期性的信号,我肯定会裁剪应该工作得很好的信号。通过 FFT(等量裁剪信号)或傅立叶系数也可能产生有趣的结果,但根据我对神经尖峰数据的经验,当你有足够的数据进行训练时,像这样对信号的 FFT 进行训练并不会表现得更好。
此外,如果您使用的是全连接网络,使用一维卷积是一个很好的替代尝试。
我想连接不同维度的数组以将它们提供给我的神经网络,该网络的第一层是 AdaptiveAveragePooling1d。我有一个由多个信号(一维数组)组成的数据集,每个信号的长度都不同。例如:
array1 = np.random.randn(1200,1)
array2 = np.random.randn(950,1)
array3 = np.random.randn(1000,1)
我想获得一个张量,我在其中连接这三个信号以获得二维张量。 但是,如果我尝试做
tensor = torch.Tensor([array1, array2, array3])
它给我这个错误:
ValueError: expected sequence of length 1200 at dim 2 (got 950)
有没有办法获得这样的东西?
编辑 有关数据集的更多信息:
- 每个信号 window 代表 ECG 记录上的一次心跳,取自多位患者,采样频率为 1000Hz
- 节拍可以有不同的长度,因为它取决于患者本身的心率
- 对于每个节拍,我需要预测我拥有的 QRS 间隔(网络的目标)的长度,以毫秒表示
- 我已经考虑过将最短样本插值到最长样本的长度,但是我还必须更改标签中 QRS 间隔的长度,对吗?
我读过这个 AdaptiveAveragePooling1d 层,它允许我使用不同大小的样本输入网络。但我的问题是如何向网络输入每个样本长度不同的数据集?如何在不使用 NaN 或零填充方法的情况下对它们进行分组? 希望我解释清楚了。
这不符合张量的定义,是不可能的。如果张量的形状为 (NxMx1),则所有 N 个矩阵的大小必须为 (Mx1)。
仍然有一些方法可以使所有数组的长度相同。查看您的数据来自何处及其结构,并找出以下哪些解决方案可行。其中一些可能会以您不喜欢的方式改变信号的导数
- 将数组裁剪成相同大小(即剪掉 start/end)或将较短的数组零填充到较长数组的长度(我真的不喜欢这个,它只适用于非常特定的应用程序)
- 'Stretching' 使用插值将数组大小相同
- 通过子采样将数组缩短到相同大小
- 对于某些应用程序,甚至可能传递 a 的系数 来自信号的傅里叶级数
编辑 对于心率,它应该是一个大致周期性的信号,我肯定会裁剪应该工作得很好的信号。通过 FFT(等量裁剪信号)或傅立叶系数也可能产生有趣的结果,但根据我对神经尖峰数据的经验,当你有足够的数据进行训练时,像这样对信号的 FFT 进行训练并不会表现得更好。
此外,如果您使用的是全连接网络,使用一维卷积是一个很好的替代尝试。