【问题标题】:How to build 1D Convolutional Neural Network in keras python?如何在 keras python 中构建一维卷积神经网络?
【发布时间】:2018-10-04 21:59:37
【问题描述】:

我正在使用 CNN 解决分类问题。我有 data.csv 文件(15000 个样本/行和 271 列),其中第一列是类标签(总共 4 个类),其他 270 列是特征(连接长度为 45 的 6 个不同信号,即 6X45=270)。

问题: 我想提供长度为 270 的单个样本作为向量(6 X 45,所有 6 个信号都有不同的含义),但是当在卷积中将单个样本重新整形为(6 行,45 列)时,我的尺寸会出现错误。
我的 CNN 模型:

X, y = load_data()   
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
num_classes = 4

X_train = X_train.reshape(X_train.shape[0], 6, 45).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 6, 45).astype('float32') 

model = Sequential()
model.add(Conv1D(filters=32, kernel_size=5, input_shape=(6, 45)))
model.add(MaxPooling1D(pool_size=5 ))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))  

如何重塑 CNN 将每个样本视为 6 个长度为 45 的信号并与窗口 5 的内核卷积的数据。

【问题讨论】:

  • 错误是什么?
  • 默认情况下,keras 最后使用通道,所以如果长度=45 和信号=6,我建议使用input_shape=(45,6)。为此,您可能需要 np.swapaxes(X_train,1,2) 在不更改数据顺序的情况下反转维度。
  • 原始错误:“对于输入形状为 [?,2,1,6] 的 max_pooling1d_2/MaxPool,从 2 中减去 5 导致的负尺寸尺寸:[?,2,1,6]”在反转尺寸后出现同样的错误np.swapaxes(X_train,1,2)跨度>
  • 那正是我的评论,以及下面的答案。

标签: python deep-learning keras conv-neural-network


【解决方案1】:

你需要像这样重塑你的数据

X_train.reshape(num_of_examples, num_of_features, num_of_signals)

并将模型中的 input_shape 更改为 (45, 6)。请参阅下面的示例代码,

X = np.random.randn(4000,270)
y = np.ones((4000,1))
y[0:999] = 2
y[1000:1999] = 3
y[2000:2999] = 0

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
num_classes = 4

X_train = X_train.reshape(X_train.shape[0], 45, 6).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 45, 6).astype('float32') 

model = Sequential()
model.add(Conv1D(filters=32, kernel_size=5, input_shape=(45, 6)))
model.add(MaxPooling1D(pool_size=5 ))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

【讨论】:

  • 注意:确保您的原始数据是 (45,6) 形式的序列,否则将 X_train 创建为 (-1,6,45) 并调用 np.swapaxes(X_train,1,2)
  • @DanielMöller 在此设置中,我设想每个样本都有一个二维数组,其中行是各种信号,列是这些信号的元素。换句话说,每一行都是一个时间序列。那是对的吗?在此示例中,6 行和 45 列。鉴于此,将内核视为 [filter length=5] 行和 45 列的数组并向下移动 6x45 矩阵进行卷积是否准确?
  • @B_Miner 在 Keras 中(除了你可以选择使用channels_first 的卷积层),通道或特征总是排在最后,中间维度是时间步长或长度。因此,在像 (samples, 45, 6) 这样的形状中,您有 6 个不同的信号/特征,在 45 个不同的时刻测量。
【解决方案2】:

input_shape 参数指定每个输入“批次”的形状。对于您的示例,它具有以下形式:(steps, channels)steps 是每个通道上的观察数,channels 是信号数。实际运行时

model.fit(X,Y)

X 将采用(batch, steps, channels) 的形式,每个批次都是对数据的每次观察。为此使用 3 维 numpy 数据框。

numpy.vstack() 可能会派上用场

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2019-05-22
    • 2017-07-31
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多