边学边总结。
背景:
在基于WiFi指纹数据库的定位算法中,为了减小计算量,需要将指纹数据库进行分区。数据库形式如下所示:
(Rss_1,Rss_2,.....Rss_n,(x_j,y_j),part_j)
其中Rss_i为第i个AP的信号强度,(x_j,y_j)是位置坐标,part_j是该位置所属分区号。
本文基于室内空间特征将指纹库分为了四个区,然后基于TensorFlow框架,搭建神经网络进行训练,并用tensorboard将数据可视化。
输入为:
(Rss_1,Rss_2,.....Rss_n)
输出为:
part_i
加载数据:
#coding: utf8 from numpy import genfromtxt, zeros def load_data(filename): with open(filename, 'rb') as dataset: X = genfromtxt(dataset,delimiter=',',usecols=range(28)) with open(filename, 'rb') as dataset: y = genfromtxt(dataset,delimiter=',',usecols=(30)) result=[ver(j) for j in y] result = [x.T[0] for x in result] a = X.min() b = X.max() X -= a # 对 X 进行归一化处理 X /= b my_data = list(zip(X,result)) return(my_data) def load_data_wrapper(): training_data = load_data(r'C:\Users\hyl\Desktop\Second_158\Classification_Model\30columns\train_6320_30.csv') test_data = load_data(r'C:\Users\hyl\Desktop\Second_158\Classification_Model\30columns\test_1550_301.csv') return (training_data,test_data) def ver(j): j = int(j) e = zeros((4,1)) e[j]=1.0 return e
搭建网络:
# -*- coding: utf-8 -*- import datas_loader as dl import tensorflow as tf from random import shuffle traind,testd = dl.load_data_wrapper() # 载入数据集 # trd = [x[0] for x in traind] # 训练数据 6320*28 # trd_label = [x[1] for x in traind] # 训练数据的标签 6320*4 ted = [x[0] for x in testd] # 测试数据 1550*28 ted_label = [x[1] for x in testd] # 测试数据的标签 1550*4 batch_size = 40 # 每个批次的大小 n_batch = len(traind)//batch_size # 总批次 # 可视化函数 def variable_summaries(var): with tf.name_scope("summaries"): mean = tf.reduce_mean(var) tf.summary.scalar('mean',mean) with tf.name_scope('stddev'): stddev = tf.sqrt(tf.reduce_mean(tf.square(var-mean))) tf.summary.scalar('stddev',stddev) # 标准差 tf.summary.scalar('max',tf.reduce_max(var)) # 最大值 tf.summary.histogram('histogram',var) # 直方图 # 定义两个 placeholder with tf.name_scope("input"): x = tf.placeholder(tf.float32,[None,28]) y = tf.placeholder(tf.float32,[None,4]) # 创建网络 with tf.name_scope('layer'): with tf.name_scope('wigths'): w1 = tf.Variable(tf.zeros([28,4])) variable_summaries(w1) with tf.name_scope('biases'): b1 = tf.Variable(tf.zeros([4])) variable_summaries(b1) with tf.name_scope('softmax'): z = tf.nn.softmax(tf.matmul(x,w1)+b1) # 二次代价函数 with tf.name_scope('loss'): loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=z)) tf.summary.scalar('loss',loss) # 训练 train_step = tf.train.GradientDescentOptimizer(0.005).minimize(loss) init = tf.global_variables_initializer() # 初始化 # 结果存放在一个布尔型列表中 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(z,1)) # 求准确率 with tf.name_scope('accuracy'): accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) tf.summary.scalar('accuracy',accuracy) # 合并所有的summary merged = tf.summary.merge_all() # 定义图 with tf.Session() as sess: sess.run(init) writer = tf.summary.FileWriter('logs/',sess.graph) for epoch in range(15): shuffle(traind) # 将训练数据顺序打乱 trd = [x[0] for x in traind] # 训练数据 6320*28 trd_label = [x[1] for x in traind] # 训练数据的标签 6320*4 for batch in range(n_batch-1): trd_i = trd[batch_size*batch:batch_size*(batch+1)] trd_label_i = trd_label[batch_size*batch:batch_size*(batch+1)] # merged的返回值存在summary中 summary,_ = sess.run([merged,train_step],feed_dict={x:trd,y:trd_label}) writer.add_summary(summary,epoch) # 将summary写入到文件中 acc = sess.run(accuracy,feed_dict={x:ted,y:ted_label}) # 测试精度 print('Iter'+str(epoch)+',Accuracy: '+str(acc)) print ('end!')训练结果与可视化:
可以看到准确度达到了95.7%。
用tensorboard查看详细数据:
数据流:
用TensorFlow搭建网络方便多了。