用keras搭建一个简单的一维卷积神经网络

编程环境:

python 3.6.8

tensorflow 1.12.3 点击下载离线包

matplotlib 3.1.2

numpy 1.17.4

数据集说明:

我所采用的数据集,是我自己构建的一个网络流量数据集,借鉴了Wei Wang等人端到端的思想,

但是处理成的数据集却不同于他们的MNIST型数据集,而是采用的npy进行存储。

由于只是用于测试模型搭建,该数据集仅包含了一部分数据(Chat流量),

原数据来源于加拿大网络安全研究所的公开数据集(ISCX2016)

直接上代码:

训练模型部分:

from tensorflow import keras
from tensorflow.python.keras.layers import Dense, Dropout, Activation, Flatten, Convolution1D, MaxPooling1D
import matplotlib.pyplot as plt
import numpy as np
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# [training_images, training_labels,
# validation_images, validation_labels,
# testing_images, testing_labels]
data = np.load('dataset.npy', allow_pickle=True)

x_train, y_train, x_test, y_test = np.array(data[0]), np.array(data[1]), np.array(data[4]), np.array(data[5])
print(x_train.shape, y_train.shape)

# 一维化
X_train = x_train.reshape(-1, 784, 1)
X_test = x_test.reshape(-1, 784, 1)

# 构建模型
model = keras.models.Sequential()

# 卷积层1
model.add(Convolution1D(filters=32, kernel_size=3,padding='same',input_shape=(784,1)))
# 激活层1
model.add(Activation('relu'))
# 池化层1
model.add(MaxPooling1D(pool_size=3, strides=3))

# 卷积层2
model.add(Convolution1D(filters=64, kernel_size=3,padding='same'))
# 激活层2
model.add(Activation('relu'))
# 池化层2
model.add(MaxPooling1D(pool_size=3, strides=3))

# 神经元随机失活
model.add(Dropout(0.25))
# 拉成一维数据
model.add(Flatten())
# 全连接层1
model.add(Dense(1024))
# 激活层
model.add(Activation('relu'))

# 随机失活
model.add(Dropout(0.5))
# 全连接层2
model.add(Dense(2))

# Softmax评分
model.add(Activation('softmax'))

# 查看定义的模型
model.summary()

# 自定义优化器参数
rmsprop = keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)

model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 训练
history = model.fit(X_train, y_train, epochs=20, batch_size=1000,
                    verbose=1, validation_data=[X_test, y_test])

model.save_weights("cnn_traffic_weights.h5")
print(history.params)

# 评估
score_eval = model.evaluate(X_test, y_test, verbose=0)
print(model.metrics_names[0], ' : ', score_eval[0], model.metrics_names[1], ' : ', score_eval[1])

加载训练好的模型权重进行测试:

from tensorflow import keras
from tensorflow.python.keras.layers import Dense, Dropout, Activation, Flatten, Convolution1D, MaxPooling1D
import matplotlib.pyplot as plt
import numpy as np
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

data = np.load('dataset.npy', allow_pickle=True)

x_validation, y_validation = np.array(data[2]), np.array(data[3])

# 一维化验证集
X_validation = x_validation.reshape(-1, 784, 1)

# 构建模型
model = keras.models.Sequential()

# 卷积层1
model.add(Convolution1D(filters=32, kernel_size=3,padding='same',input_shape=(784,1)))
# 激活层1
model.add(Activation('relu'))
# 池化层1
model.add(MaxPooling1D(pool_size=3, strides=3))

# 卷积层2
model.add(Convolution1D(filters=64, kernel_size=3,padding='same'))
# 激活层2
model.add(Activation('relu'))
# 池化层2
model.add(MaxPooling1D(pool_size=3, strides=3))

# 神经元随机失活
model.add(Dropout(0.25))
# 拉成一维数据
model.add(Flatten())
# 全连接层1
model.add(Dense(1024))
# 激活层
model.add(Activation('relu'))

# 随机失活
model.add(Dropout(0.5))
# 全连接层2
model.add(Dense(2))

# Softmax评分
model.add(Activation('softmax'))

# 加载训练好的权重
model.load_weights('cnn_traffic_weights.h5')
model.summary()

# 选一个预测
x_validation_0 = X_validation[11, :].reshape(-1, 784, 1)
y_validation_0 = y_validation[:]
# 绘制预测样本像素点
plt.imshow(x_validation_0.reshape([28, 28]))
plt.show()
prediction = model.predict(x_validation_0[:])
print('真实标签 :', y_validation_0[11], '\n标签预测概率 : ',
      prediction[0], '\n网络预测标签 : ', np.argmax([prediction[0]]))

注:神经网络初涉,有啥问题请直接指出,谢谢!有流量识别领域的小伙伴欢迎打扰!相互交流!

说明:鉴于很多人问我数据集的问题,但写这个文章时所用的仅有“Chat”的流量的数据集我已经删除了,所以我在这里提供了包含有我已处理好的六类网络流量的npy数据集,有需要的自取(下载地址)

你可能感兴趣的:(机器学习之实践篇)