卷积神经网络性能低下

数据挖掘 深度学习 分类 喀拉斯
2022-02-13 10:56:05

问题描述

我正在使用卷积神经网络进行信号调制分类,但性能非常低(准确率约为 15%),我不知道为什么。

数据

数据集由 220.000 行组成。数据完美平衡:每个标签都有 20.000 个数据点。

数据集列 类型 范围 形式 笔记
信号 i=真实,q=真实 [i_0, i_1, ..., i_n], [q_0, q_1, ..., q_n] n=127
信噪比 s=整数 [-18, 20] s
标签 l=字符串 l 它们是 11 个标签

神经网络

神经网络是由 2 个卷积层和 3 个全连接顺序组成的卷积。

DROPOUT_RATE = 0.5

iq_in = keras.Input(shape=in_shp, name="IQ")

conv_1 = Convolution1D(128, 7, input_shape=(1, 2, 128), padding="same", activation="relu")(iq_in)
dr_1 = Dropout(DROPOUT_RATE)(conv_1)
conv_2 = Convolution1D(128, 5, padding="same", activation="relu")(dr_1)
max_pool = MaxPooling1D(padding='same')(conv_2)

fc1 = Dense(256, name="fc1")(max_pool)
dr_2 = Dropout(DROPOUT_RATE)(fc1)
fc2 = Dense(128, name="fc2")(dr_2)
out_flatten = Flatten()(fc2)
output = Dense(11, name="output")(out_flatten)

model = keras.Model(inputs=[iq_in], outputs=[output])
model.compile(loss='categorical_crossentropy', optimizer='adam')

model.summary()

神经网络

训练

正在完成训练,将数据分成 70% 作为训练集,30% 作为测试集。

NB_EPOCH = 100     # number of epochs to train on
BATCH_SIZE = 1024  # training batch size

filepath = NEURAL_NETWORK_FILENAME

history = model.fit(
    X_train,
    Y_train,
    batch_size=BATCH_SIZE,
    epochs=NB_EPOCH,
    validation_data=(X_test, Y_test),
    callbacks = [
        keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=True, mode='auto'),
        keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=0, mode='auto')
    ])

# we re-load the best weights once training is finished
model.load_weights(filepath)

结果

这是我的评估系统输出的混淆矩阵。

混淆矩阵

问题

如何提高性能?有人可以批评我的神经网络吗?

谢谢。

1个回答

有几件事我会建议:

  1. 重塑输入数据:在我看来,如果 IQ 值和每个时间序列是 128 个数据点,您想要分析时间序列。在这种情况下,您可能希望将 I 和 Q 分别视为通道并在 128 个点上进行卷积。为此,输入数据需要具有 shape (128, 2)现在,您将数据点视为 128 维向量,并在 I 和 Q 两个通道上进行卷积。

  2. 在卷积和密集部分之间展平:通常你有Convolution1DMaxPooling1D层提取一些空间特征。全连接层没有空间属性的概念,它们只是“理解”向量。所以大多数模型在Flatten层之前都有Dense层。

  3. 密集层的激活函数:除非在层中指定激活Dense,否则它们使用线性激活,这并不能真正收获层的表达能力(参见此处)。所以应该fc1fc2应该得到一个activation="relu"

  4. 输出激活:我也会softmax对输出使用激活,否则您不能将输出解释为类成员资格的概率。

固定这些点后,我希望您的模型至少在原则上可以工作。您可能还需要检查几点:

  1. 过滤器数量:现在您128对所有Convolution1D层都使用过滤器。这似乎很多,我会从也许开始16,看看你能走多远。您可以稍后增加数量。

  2. 过滤器尺寸:这只是我的直觉,但您可以尝试使用更小的过滤器。7在计算机视觉中,过滤器的大小5分别看起来非常大。但是,由于您可能更好地了解数据,因此您可能有自己的理由。

  3. 不确定这是否会有所帮助,但如果您想减少可训练参数的数量,您也可以尝试MaxPooling1D在两个卷积之间插入另一层。通常人们会尝试在学习更多特征的同时将空间信息与例如池化复合,即增加过滤器的数量。

尝试一个模型,例如这样的模型(未经测试的代码,这只是一个例子):

DROPOUT_RATE = 0.5

in_shp = (128, 2)
iq_in = keras.Input(shape=in_shp, name="IQ")

conv_1 = Convolution1D(16, 7, padding="same", activation="relu")(iq_in)
dr_1 = Dropout(DROPOUT_RATE)(conv_1)
conv_2 = Convolution1D(16, 5, padding="same", activation="relu")(dr_1)
max_pool = MaxPooling1D(padding='same')(conv_2)

out_flatten = Flatten()(max_pool)

fc1 = Dense(256, name="fc1", activation="relu")(out_flatten)
dr_2 = Dropout(DROPOUT_RATE)(fc1)
fc2 = Dense(128, name="fc2", activation="relu")(dr_2)
output = Dense(11, name="output", activation="softmax")(fc2)

model = keras.Model(inputs=[iq_in], outputs=[output])
model.compile(loss='categorical_crossentropy', optimizer='adam')

model.summary()

使用以下输出:

Layer (type)                 Output Shape              Param #   
=================================================================
IQ (InputLayer)              [(None, 128, 2)]          0         
_________________________________________________________________
conv1d (Conv1D)              (None, 128, 16)           240       
_________________________________________________________________
dropout (Dropout)            (None, 128, 16)           0         
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 128, 16)           1296      
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, 64, 16)            0         
_________________________________________________________________
flatten (Flatten)            (None, 1024)              0         
_________________________________________________________________
fc1 (Dense)                  (None, 256)               262400    
_________________________________________________________________
dropout_1 (Dropout)          (None, 256)               0         
_________________________________________________________________
fc2 (Dense)                  (None, 128)               32896     
_________________________________________________________________
output (Dense)               (None, 11)                1419      
=================================================================
Total params: 298,251
Trainable params: 298,251
Non-trainable params: 0
_________________________________________________________________