给定的数据在 “point_data.csv”文件里,这个数据总共包含了5个类别(由Class_ID来区分), 并包括10个特征。在这里,我们需要搭建多层的神经网络,并利用这个网络来识别分类。
首先是导入所有所需的library
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 导入library import numpy as np import matplotlib.pyplot as plt import pandas as pd # TODO 导入跟keras相关的libraray from keras.models import Sequential from keras.layers import Dense, Dropout from keras.optimizers import SGD # 以下是跟sklearn相关的库 from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder,scale from sklearn.metrics import f1_score, classification_report,confusion_matrix
1.导入数据集
1
2
3filename = 'point_data.csv' dataset = pd.read_csv(filename)
2.数据预处理
首先使用LabelEncoder对label进行标准化处理
1
2
3
4
5
6
7
8
9encoder = LabelEncoder() # 定义标签Y和特征X Y = dataset.iloc[:, 2:3].values X = dataset.iloc[:, 3:13].values # TODO: 对Y做一个简单的转换(不然会在keras部分会出错) y = encoder.fit_transform(Y)
分割训练数据与测试数据
1
2X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)
使用preprocessing.scale函数对数据进行归一化
1
2
3X_train = scale(X_train) X_test = scale(X_test)
3.定义深度神经网络模型
模型总共包含4层hidden layer, 第一层包括50个hidden units, 第二层包括50个hidden units, 第三层包括60个hidden units,
第四层包括40个hidden units. 并在第一层hidden layer和第二层hidden layer之间添加一个dropout layer (rate=0.2),在第二层和第三层hidden layer之间添加dropout layer(rate=0.2), 第三层和第四层之间添加dropout layer(rate=0.1)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19input_shape = (10,) output_shape = 5 # TODO: 定义深度学习模型 model = Sequential() model.add(Dense(10, input_shape=input_shape, activation='relu')) model.add(Dense(50, activation='relu')) model.add(Dropout(rate=0.2)) model.add(Dense(50, activation='relu')) model.add(Dropout(rate=0.2)) model.add(Dense(60, activation='relu')) model.add(Dropout(rate=0.1)) model.add(Dense(40, activation='relu')) model.add(Dense(output_shape, activation='softmax')) # 输出模型描述 model.summary()
定义SGD优化器,学习率为0.01
1
2sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
义模型的compile函数,设置loss为sparse_categorical_crossentropy, 利用上面定义的sgd优化器,利用准确率作为评估标准。
1
2model.compile(loss='sparse_categorical_crossentropy',optimizer=sgd, metrics=['accuracy'])
4.训练模型
设置epoch为100, batch_Size为100,并把训练数据中的15%作为validation data(验证集), 把中间的结果都赋给history变量(后面做分析用)
1
2history = model.fit(X_train, y_train, epochs=100,batch_size=100,validation_split=0.15)
可以看到随着模型的不断训练,损失函数降低到接近0.06,auc准确率可以达到97.7%
5.验证模型
我们可以画一个图来表示准确率的变化情况(分别在训练数据和测试数据)
1
2
3
4
5
6
7
8plt.plot(history.history['acc']) plt.plot(history.history['val_acc']) plt.title('accuracy') plt.ylabel('accuracy') plt.xlabel('epoch') plt.legend(['train', 'test'], loc='lower right') plt.show()
也可以画一个图来表示LOSS的变化情况(分别在训练数据和测试数据)
1
2
3
4
5
6
7
8plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('loss') plt.ylabel('loss') plt.xlabel('epoch') plt.legend(['train', 'test'], loc='upper right') plt.show()
在测试数据上做评估
1
2
3
4
5y_pred = model.predict(X_test) score = model.evaluate(X_test, y_test, batch_size=100, verbose=1) print(score) print("Baseline Error: %.2f%%" % (100-score[1]*100))
绘制混淆矩阵
1
2
3
4
5# 预测结果 test_class = model.predict_classes(X_test) # 绘制矩阵 confusion_matrix(y_test, test_class)
输出在测试集上的precision, recall, f1-score
1
2print(classification_report(y_test, test_class))
所有源码、测试数据以及训练好的模型已上传至git,点击这里可直接查看,有疑问的同学请在博客下方留言或提Issuees,谢谢!
最后
以上就是羞涩春天最近收集整理的关于使用深度神经网络识别卫星数据的全部内容,更多相关使用深度神经网络识别卫星数据内容请搜索靠谱客的其他文章。
发表评论 取消回复