概述
给定的数据在 “point_data.csv”文件里,这个数据总共包含了5个类别(由Class_ID来区分), 并包括10个特征。在这里,我们需要搭建多层的神经网络,并利用这个网络来识别分类。
首先是导入所有所需的library
# 导入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.导入数据集
filename = 'point_data.csv'
dataset = pd.read_csv(filename)
2.数据预处理
首先使用LabelEncoder对label进行标准化处理
encoder = LabelEncoder()
# 定义标签Y和特征X
Y = dataset.iloc[:, 2:3].values
X = dataset.iloc[:, 3:13].values
# TODO: 对Y做一个简单的转换(不然会在keras部分会出错)
y = encoder.fit_transform(Y)
分割训练数据与测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)
使用preprocessing.scale函数对数据进行归一化
X_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)。
input_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
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
义模型的compile函数,设置loss为sparse_categorical_crossentropy, 利用上面定义的sgd优化器,利用准确率作为评估标准。
model.compile(loss='sparse_categorical_crossentropy',optimizer=sgd, metrics=['accuracy'])
4.训练模型
设置epoch为100, batch_Size为100,并把训练数据中的15%作为validation data(验证集), 把中间的结果都赋给history变量(后面做分析用)
history = model.fit(X_train, y_train, epochs=100,batch_size=100,validation_split=0.15)
可以看到随着模型的不断训练,损失函数降低到接近0.06,auc准确率可以达到97.7%
5.验证模型
我们可以画一个图来表示准确率的变化情况(分别在训练数据和测试数据)
plt.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的变化情况(分别在训练数据和测试数据)
plt.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()
在测试数据上做评估
y_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))
绘制混淆矩阵
# 预测结果
test_class = model.predict_classes(X_test)
# 绘制矩阵
confusion_matrix(y_test, test_class)
输出在测试集上的precision, recall, f1-score
print(classification_report(y_test, test_class))
所有源码、测试数据以及训练好的模型已上传至git,点击这里可直接查看,有疑问的同学请在博客下方留言或提Issuees,谢谢!
最后
以上就是羞涩春天为你收集整理的使用深度神经网络识别卫星数据的全部内容,希望文章能够帮你解决使用深度神经网络识别卫星数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复