繁体   English   中英

Tensorflow model 用于一维的二进制分类 arrays

[英]Tensorflow model for binary classification of 1D arrays

我目前正在尝试构建一个 model,它将根据信号中是否具有特定模式对信号进行分类。

我的信号只是 arrays 每个 10000 个浮点数。 我有 500 个包含该模式的 arrays,而 500 个没有。

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

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

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

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

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

(X 表示训练,Y 表示验证)

该模式只是值的快速增加,然后是值的快速减少,如下所示(以红色突出显示): 在此处输入图像描述

这是一个没有模式的信号供参考: 在此处输入图像描述

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

我尝试了一个简单的顺序 model ,如下所示:

# 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 时,我收到了很多关于输入的错误,我认为这是因为它是一维信号而不是二维或 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) ,因此您必须确定您的时间步长和特征。 这是一个起点/虚拟 model ,我假设每个样本有 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 个时间步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM