gpt4 book ai didi

python - 关于如何在 Keras 中构建 CNN 1D 的正确而明确的解释

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:49 25 4
gpt4 key购买 nike

再见,

这是我面临的 CNN 1d 问题的第二部分。第一部分是这个

How does it works the input_shape variable in Conv1d in Keras?

我正在使用这段代码:

from keras.models import Sequential
from keras.layers import Dense, Conv1D
import numpy as np

N_FEATURES=5
N_TIMESTEPS=10
X = np.random.rand(100, N_FEATURES)
Y = np.random.randint(0,2, size=100)

model = Sequential()
model.add(Conv1D(filters=32, kernel_size=N_TIMESTEPS, activation='relu', input_shape=(N_TIMESTEPS, N_FEATURES)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

现在,我想做什么?

I want to train a CNN 1d over a timeseries with 5 features. Actually I want to work with time windows og length N_TIMESTEPS rather than timeserie it self. This means that I want to use a sort of "magnifier" of dimension N_TIMESTEPS x N_FEATURES on the time series to work locally. That's why I've decided to use CNN

第一个问题来了。由于我指定了 kernel_size 变量,所以完全不清楚我是否必须将时间序列转换为张量,或者这是 Keras 会为我做的事情。

如果我必须提供一个张量,我会这样做:

X_tensor = []
for i in range(len(X)-N_TIMESTEPS):
X_tensor+=[X_tensor[range(i, N_TIMESTEPS+i), :]]
X_tensor = np.asarray(X_tensor)

当然,在这种情况下,我还应该提供根据某些标准从 Y 计算出的 Y_tensor 向量。假设我已经有了与 X_tensor 相同长度的 Y_tensor bool 向量,即 len(X)-N_TIMESTEPS-1

Y_tensor = np.random.randint(0,2,len(X)-N_TIMESTEPS-1)

现在,如果我尝试为模型提供数据,我会遇到 CNN 1d 最常见的错误,即:

  ValueError: Error when checking input: expected conv1d_4_input to have 3 dimensions, but got array with shape (100, 5)

看了十几个关于它的帖子,我无法理解我做错了什么。这是我试过的:

model.fit(X,Y)
model.fit(np.expand_dims(X, axis=0),Y)
model.fit(np.expand_dims(X, axis=2),Y)
model.fit(X_tensor,Y_tensor)

对于所有这些情况,我总是得到相同的错误(在最终元组中具有不同的维度值)。

问题:

  1. What Keras expects from my data? Can I feed the model with the whole time series or I have to slice it into a tensor?

  2. How I have to feed the model in term of data structure?I.e. I have to specify in some strange way the dimension of the data?

你能帮帮我吗?我发现这是 Keras 中 CNN 实现最令人困惑的地方之一,不同的帖子有不同的解决方案,不符合我的数据结构(即使根据我的说法,它们具有非常常见的结构)。

注意:有些帖子建议将数据的长度传入input_shape变量。这对我来说毫无意义,因为我不应该向模型提供数据的维度(这是一个变量)。根据理论,我唯一应该给它的是过滤器维度和特征数量(即将在时间序列上滚动的矩阵的维度)。

谢谢,

我是

最佳答案

简单地说,Conv1D 需要 3 个维度:

  • 系列数 (1)
  • 步数(100 - 您的全部数据)
  • 特征数量 (5)

因此,model.fit(np.expand_dims(X, axis=0),Y) 对于 X 是正确的。

现在,如果 X(1, 100, 5),自然是您的 input_shape=(100,5)

如果您的 Y 有 100 步,那么您需要确保您的 Conv1D 将输出 100 步。你需要padding='same',否则会变成91。 (我建议你实际使用 91,因为你想要每 10 步的结果并且可能不希望边界效应破坏你的结果)

Y 也必须遵循相同的形状规则:

  • 系列数 (1)
  • 步数(如果 padding='same' 则为 100;如果 padding='valid' 则为 91)
  • 特征数量(1 = 密集输出)

所以,Y = Y.reshape((1,-1,1))

因为您只有一个类别(真/假),所以使用'categorical_crossentropy' 毫无意义。您应该使用 'binary_crossentropy'

一般来说,您使用这个卷积与 kernel_size=10 来模拟 10 步的滑动窗口的总体想法将按预期工作(它是否有效是另一个问题,只能由尝试)。


如果您想要更好的序列网络,您可能应该尝试 LSTM 层。尺寸的工作方式完全相同。您将需要 return_sequences=False

主要区别在于您需要像在该循环中那样分离数据。然后:

  • X.shape == (91, 10, 5)
  • Y.shape == (91, 1)

关于python - 关于如何在 Keras 中构建 CNN 1D 的正确而明确的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57558538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com