一. 数据集预处理
1. 加载csv文件
obj = pd.read_csv("文件路径", header=0)
2. 提取数据
data = np.asarray(obj.iloc[:, m:n+1]) # 数据集中在m~n列
3. 数据归一化
参考数据标准化处理
4. 数据输入格式基本处理
# 如将样本处理成三维数据,可利用reshape()
data = data.reshape(num, rows, cols)
# 列表转数组
data = np.array(data)
5. 提取标签值
# 提取标签值
obj = obj[['列名1','列名2',...,'列名n']]
6. 标签值的类别转id(即用数字表示标签的类别数,如果有n类标签就用0~n-1表示)
# 假设只有一列为标签
obj['id'] = obj['列名'].factorize()[0] # 在其后增加一列,列名为id
7. one-hot编码(适用于多分类问题)
# 将id列的数值进行编码
''' 如0~5编码后对应[[1,0,0,0,0,0],
[0,1,0,0,0,0],
[0,0,1,0,0,0],
[0,0,0,1,0,0],
[0,0,0,0,1,0],
[0,0,0,0,0,1]]
'''
lable = pd.get_dummies(obj['id']).values
8. 划分训练数据和测试数据
# 划分训练集(80%)和测试集(20%)
# CNN输入
x_train1, x_test1, y_train, y_test = train_test_split(data, lable, test_size=0.2)
# LSTM输入,标签一样,因此不用再次划分
x_train2, x_test2 = train_test_split(data, test_size=0.2)
二. 构建模型
# CNN输入格式(三维)
input_shape = (rows, cols, 1)
# input层
input_a = Input(shape=input_shape)
input_b = Input(shape=[‘LSTM输入样本序列长度’, ])
# CNN模型
model1 = Sequential([Convolution2D(32, (3, 3), activation='relu', padding='same', input_shape=input_shape),
SeparableConv2D(32, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
Flatten()])
# LSTM模型
model2 = Sequential([Embedding(256, 32, input_length='LSTM输入样本序列长度'),
LSTM(32, dropout=0.1, return_sequences=True),
Flatten()])
# 并联操作
concat = concatenate([model1(input_a), model2(input_b)], axis=1, name="concat_layer")
# 全连接层
output = Dense(类别_num, activation='softmax')(concat) # 全连接层:每个神经元对应一个类别,输出值表示样本属于该类别的概率大小
model = Model(inputs=[input_a, input_b], outputs=[output])
三. 编译模型
# 编译模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
四. 训练模型
# 训练模型
# batch_size:训练批次样本数
# epochs:训练次数
# verbose:是否打印日志
history = model.fit([x_train1, x_train2], y_train, batch_size=128, epochs=20, verbose=2)
五. 评估模型
# 评估模型
score = model.evaluate([x_test1, x_test2], y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])
六. 打印模型各层参数
# way1:直接利用summary()打印
model.summary()
# way2:利用plot_model()打印
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from keras.utils import plot_model
plot_model(model, to_file='obj.png', show_shapes=True)
photo = mpimg.imread('obj.png')
plt.imshow(photo)
plt.axis('off') # 不显示坐标轴
plt.show()
七. 注:所用到的库
from sklearn import preprocessing
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras import Model
from keras.layers import Dense, Dropout, Flatten, Input
from keras.layers import Convolution2D, MaxPooling2D, SeparableConv2D
from keras.layers import LSTM, Embedding, concatenate
1173

被折叠的 条评论
为什么被折叠?



