indoorLocation(5)--DNN模型實現

  • Tensorflow基礎

關於Tensorflow,具體可以參考http://www.tensorfly.cn/來進行學習。下圖爲Tensorlfow基本結構圖:

節點(operation) 節點被稱爲op(也叫做操作,算子),一個節點獲得0個或者多個張量數據(tensor),一個節點也可以產生0個或者多個張量數據(tensor)。
張量(tensor) 計算圖的一條邊,就是一個tensor,一個張量數據,張量的流動是保持計算節點不變,讓數據進行流動。tensor可以是一維的也可以是多維的
變量(variable) 變量(tf.Variable)用於保存,更新神經網絡的參數張量。
圖(graph) 節點和邊相互連接成計算圖,一個計算圖描述了一次計算過程
會話(session)

使用teonserflow編寫的程序,通常有一個構建階段和運行階段。
構建階段,操作的執行,數據的流通生成圖
運行階段,使用會話執行圖的操作

爲了得到結果,計算圖必須在會話中啓動,會話將圖的op(節點)分發到CPU或者GPU之類的設備中,同時執行節點op的方法,處理結束後將tensor返回。


要使用tf,我們必須先構建(定義)graph,之後才能運行graph。
。。。。。。
import tensorflow as tf
# 構建graph
a = tf.add(3, 5) 

# 創建tf.Session的一個對象sess
sess = tf.Session()  

# 運行graph
print(sess.run(a)) 

# 關閉sess對象
sess.close()
。。。。。。。
一個session可能會佔用一些資源,比如變量、隊列和讀取器(reader)。我們使用sess.close()關閉會話或者使用上下文管理器釋放這些不再使用的資源。

  • Tensorflow實現DNN模型(具體算法筆記隨後在機器學習模塊中添加)

在我們之前的博文中有提到,我們創建神經網絡的結構主要爲以下結構

也就是說,我們輸入的判斷是那個floor的影響因素是多維的dc1-dcn,magnextcx,y,z這些。然後通過神經網絡的elu激活函數激活,逐步得到遞歸值floor。location同理。代碼中,關於X和Location和floor的model圖構建代碼如下:

# Declare session and placeholder
self.sess = tf.InteractiveSession()
self.x = tf.placeholder(tf.float32, [None, 10])
self.floor_y = tf.placeholder(tf.float32, [None, 1])
self.location_y = tf.placeholder(tf.float32, [None, 1])

# Define the structure of the network which can predict the building ID
floor_network = tl.layers.InputLayer(self.x, name='Input')
floor_network = tl.layers.DenseLayer(floor_network, n_units=128, act=tf.nn.elu, name='DL_fn1')
floor_network = tl.layers.DenseLayer(floor_network, n_units=32, act=tf.nn.elu, name='DL_fn2')
floor_network = tl.layers.DenseLayer(floor_network, n_units=16, act=tf.nn.elu, name='DL_fn3')
floor_network = tl.layers.DenseLayer(floor_network, n_units=8, act=tf.nn.elu, name='DL_fn4')
floor_network = tl.layers.DenseLayer(floor_network, n_units=4, act=tf.nn.elu, name='DL_fn5')
floor_network = tl.layers.DenseLayer(floor_network, n_units=2, act=tf.nn.elu, name='DL_fn6')
floor_network = tl.layers.DenseLayer(floor_network, n_units=1, act=tf.identity, name='DL_fn7')
self.floor_predict_y = floor_network.outputs
self.floor_cost = tl.cost.mean_squared_error(self.floor_y, self.floor_predict_y)
self.floor_optimize = tf.train.AdamOptimizer().minimize(self.floor_cost, var_list=floor_network.all_params)

# Define the structure of the network which can predict the building ID
location_network = tl.layers.InputLayer(self.x, name='Input')
location_network = tl.layers.DenseLayer(location_network, n_units=128, act=tf.nn.elu, name='DL_lc1')
location_network = tl.layers.DenseLayer(location_network, n_units=32, act=tf.nn.elu, name='DL_lc2')
location_network = tl.layers.DenseLayer(location_network, n_units=16, act=tf.nn.elu, name='DL_lc3')
location_network = tl.layers.DenseLayer(location_network, n_units=8, act=tf.nn.elu, name='DL_lc4')
location_network = tl.layers.DenseLayer(location_network, n_units=4, act=tf.nn.elu, name='DL_lc5')
location_network = tl.layers.DenseLayer(location_network, n_units=2, act=tf.nn.elu, name='DL_lc6')
location_network = tl.layers.DenseLayer(location_network, n_units=1, act=tf.identity, name='DL_lc7')
self.location_predict_y = location_network.outputs
self.location_cost = tl.cost.mean_squared_error(self.location_y, self.location_predict_y)
self.location_optimize = tf.train.AdamOptimizer().minimize(self.location_cost, var_list=location_network.all_params)

構建完成之後,我們對會話進行初始化並填充數據,填充數據之後,我們進行運算訓練,最後我們將訓練模型進行保存

self.sess.run(tf.global_variables_initializer())
for i in range(epoch):
    mini_x = dp.getMiniBatch(self.normalize_x, batch_size)
    mini_y = dp.getMiniBatch(np.expand_dims(self.floorNum_y, -1), batch_size)
    # 填充數據爲採集到的CSV訓練數據
    feed_dict = {
        self.x: mini_x.__next__(),
        self.floor_y: mini_y.__next__()
    }
    _cost, _, _output = self.sess.run([self.floor_cost, self.floor_optimize, self.floor_predict_y], feed_dict=feed_dict)

self.save()

 

 

樣本預測值:這裏得到的是根據每個輸入點的RSSI和magnetic預測的Floor和location。在訓練集中floor和location均爲1

該DNN模型在該點的識別誤差平均在

 

  • Keras基礎

Keras是一個基於 Python 編寫的高級神經網絡 API,可以理解爲比較的高端的Tensorflow。就是API使用更加方便。具體的學習資料請參考Keras中文文檔:https://keras.io/zh/

  • Keras實現DNN模型(具體算法筆記隨後在機器學習模塊中添加)

首先創建一個具有多個輸入層的全連接網絡模型:

self.encode_layer = Dense(512, activation='elu')(self.input_x)
self.encode_layer = Dense(256, activation='elu')(self.encode_layer)
self.encode_layer = Dense(64, activation='elu')(self.encode_layer)
decode_layer = Dense(256, activation='elu')(self.encode_layer)
decode_layer = Dense(512, activation='elu')(decode_layer)
decode_layer = Dense(10, activation='elu')(decode_layer)
self.encoder_model = Model(inputs=self.input_x, outputs=decode_layer)

# merge_layer = Concatenate([self.longitude_predict_output, self.latitude_predict_output])
floor_net = Dense(512, activation='elu')(self.encode_layer)
floor_net = Dense(256, activation='elu')(floor_net)
floor_net = Dense(128, activation='elu')(floor_net)
floor_net = Dense(64, activation='elu')(floor_net)
# 3表示3種情況變量
self.floor_predict_output = Dense(3, activation='elu')(floor_net)
self.floor_model = Model(inputs=self.input_x, outputs=self.floor_predict_output)

location_net = Dense(512, activation='elu')(self.encode_layer)
location_net = Dense(256, activation='elu')(location_net)
location_net = Dense(128, activation='elu')(location_net)
location_net = Dense(64, activation='elu')(location_net)
self.location_predict_output = Dense(3, activation='elu')(location_net)
self.location_model = Model(inputs=self.input_x, outputs=self.location_predict_output)

之後設置損失函數,並注入數據開始訓練:(激活函數在Dense()中的activationji)

self.encoder_model.compile(
    loss='mse',
    optimizer='adam'
)
self.encoder_model.fit(self.normalize_x, self.normalize_x, epochs=500, batch_size=100)

 經過迭代訓練之後,

我們得到訓練預測數據(左),添加多個測試訓練點(右)

預測的誤差值均值爲:

歡迎大家批評!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章