用于一维数组二进制分类的 Tensorflow 模型

Tensorflow model for binary classification of 1D arrays

我正在尝试建立一个模型来根据信号是否具有特定模式对信号进行分类。

我的信号只是每个 10000 个浮点数的数组。我有 500 个包含该模式的数组,还有 500 个不包含该模式的数组。

这就是我拆分数据集的方式:

X_train => 信号数组 |形状 => (800, 10000)

Y_train => 1 和 0 的数组 |形状 => (800,)

X_test => 信号数组 |形状 => (200, 10000)

Y_test => 1 和 0 的数组 |形状 => (200,)

(X 用于训练,Y 用于验证)

该模式只是值快速增加,然后值快速减少,如下所示(以红色突出显示):

这是一个没有参考模式的信号:

我在构建模型时遇到了很多麻烦,因为我习惯于对图像(所以 2D 或 3D)进行分类,而不仅仅是一系列点。

我试过像这样的简单顺序模型:

# create model
model = Sequential()
model.add(Dense(10000, input_dim=10000, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

但它完全失败了。我很想实现一个 CNN,但我不知道该怎么做。 当重新使用我用于图像分类的一些 CNN 时,我遇到了很多关于输入的错误,我认为这是因为它是 1D 信号而不是 2D 或 3D 图像。

这就是我过去用于图像分类的 CNN 的情况:

model_random = tf.keras.models.Sequential()

model_random = tf.keras.Sequential([
  tf.keras.layers.Conv2D(32, [3,3], activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(16, [3,3], activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(8, [3,3], activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(1)
])

model_random.compile(optimizer = 'adam',
              loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model_random.fit(X_train,Y_train, epochs=30)
    ValueError: Exception encountered when calling layer "sequential_8" (type Sequential).
    
    Input 0 of layer "conv2d_6" is incompatible with the layer: expected min_ndim=4, found ndim=2. Full shape received: (32, 10000)
    
    Call arguments received:
      • inputs=tf.Tensor(shape=(32, 10000), dtype=float32)
      • training=True
      • mask=None

tf.keras.layers.Conv1D 需要以下形状:(time_steps, features),所以你必须决定你的时间步长和特征是什么。 这是一个起点/虚拟模型,我假设每个样本有 10000 个时间步长,每个时间步长有一个浮动特征:

import tensorflow as tf

X_train = tf.expand_dims(tf.random.normal((800, 10000)), axis=-1)
Y_train = tf.random.uniform((800, 1), maxval=2, dtype=tf.int32)

inputs = tf.keras.layers.Input((10000, 1))
x = tf.keras.layers.Conv1D(64, kernel_size=3, activation='relu')(inputs)
x = tf.keras.layers.Conv1D(32, kernel_size=3, activation='relu')(x)
x = tf.keras.layers.GlobalMaxPool1D()(x)
x = tf.keras.layers.Dense(64, activation='relu')(x)
outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x)
model = tf.keras.Model(inputs, outputs)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, Y_train, batch_size=8, epochs=5)

另外,看看这个 。与 Conv2D 层相比,Conv1D 层在张量的 height 上将过滤器应用于 n 帧中的 windows,而 width过滤器保持固定。您还应该考虑对信号进行下采样,因为 10000 个时间步对于一个样本来说已经很多了。