I recently posted another question and this question is the evolution of that one.
By the way I will resume all the problem below, like if the previous question didn't ever exist.
I'm doing Signal Modulation Classification using a Convolutional Neural Network and I want to improve performance.
Dataset is composed by 220.000 rows like these. Data is perfectly balanced: I have 20.000 datapoints for each label.
|Signal||i=real, q=real||[i_0, i_1, ..., i_n], [q_0, q_1, ..., q_n]||n=127|
|Label||l=string||l||They are 11 labels|
Lower is the SNR value, and noisier is the signal: classify low SNR signals is not that easy.
Neural Network is a Convolutional Neural Network coded as below:
DROPOUT_RATE = 0.5 iq_in = keras.Input(shape=in_shp, name="IQ") reshape = Reshape(in_shp + )(iq_in) batch_normalization = BatchNormalization()(reshape) conv_1 = Convolution2D(16, 4, padding="same", activation="relu")(batch_normalization) max_pool = MaxPooling2D(padding='same')(conv_1) batch_normalization_2 = BatchNormalization()(max_pool) fc1 = Dense(256, activation="relu")(batch_normalization_2) conv_2 = Convolution2D(32, 2, padding="same", activation="relu")(fc1) batch_normalization_3 = BatchNormalization()(conv_2) max_pool_2 = MaxPooling2D(padding='same')(batch_normalization_3) out_flatten = Flatten()(max_pool_2) dr = Dropout(DROPOUT_RATE)(out_flatten) fc2 = Dense(256, activation="relu")(dr) batch_normalization_4 = BatchNormalization()(fc2) fc3 = Dense(128, activation="relu")(batch_normalization_4) output = Dense(11, name="output", activation="softmax")(fc3) model = keras.Model(inputs=[iq_in], outputs=[output]) model.compile(loss='categorical_crossentropy', optimizer='adam') model.summary()
Training is being done splitting the data in 75% as Training set, 25% as Test set.
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)
My evaluation system evaluate how accurate is my Neural Network for classifying signals with different SNR.
What did I try?
Thisis a list of things that I tried and I'm sure that are modifying performances in worse:
- Reducing batch size (only increases training time without improving test accuracy)
- Training without too noisy signals (lowers accuracy)
- Moving the Dropout layer before the Flatten layer
Any suggestion to get better performances?
Thanks in advance!