TensorFlow搭建简易Wide and Deep 模型
Wide & Deep 模型是谷歌在2016年發表的論文中所提到的模型。在論文中,谷歌將 LR 模型與 深度神經網絡 結合在一起作為 Google Play 的推薦獲得了一定的效果。
官方提供的 Wide & Deep 模型的(簡稱,WD 模型)教程 都是使用 TensorFlow (簡稱,TF )自帶的函數來做的特征工程,并且模型也進行了封裝,所以如果要簡單驗證這個模型的話,自己用tf直接搭建一個或許是一個更好的主意。
所以本文就向您展示了如何自己用 TF 搭建一個結構清晰,定制性更高的 WD 模型。
1.先讓我們來看看wide_deep模型是如何工作的:
上圖左邊是wide模型,對于右邊是deep模型。可見wide模型就是一個RL模型,而右邊的deep網絡隱藏層有三層,神經元個數分別為256,128,64。
谷歌教程的圖
?
上面的圖示谷歌教程里,可見最后將wide的輸出和deep的輸出進行相加。最后用一個Relu激活函數,然后輸出最終預測。
我自己寫了一個小小的demo,可以展示這個過程,思路還是很清晰的,下面我將用自己的demo來解釋這個過程。
2. demo解析
outline:
我用了三個函數,分別為:
wide_model:來建立wide模型
deep_model: 來建立deep模型
build_w_d : 來結合上面二者進行預測與反向傳播
1. wide_model函數解析
下面是我的代碼,用的是TensorFlow框架:
我再代碼內部已經給了一些注釋,有一定解釋作用
值得注意的是:
1.我用的是隨機初始化,但是我見過用修正方式初始化權重的,我不知道這個模型,用那種方式是不是會更好,所以這里可能會有錯誤。
2.對于前向傳播完成后,是否需要用一個relu激活函數,我也沒有查到什么確切的資料,這也是個問題。
2. deep_model函數解析
這里我只做了個demo,所以我直接用了和之前圖中一樣的隱藏層網絡層數(3層),然后神經元節點數目,我還是用的參數形式表示,以便于擴展。
下面是我的代碼:
def deep_model(data , hidden1 , hidden2 , hidden3) :len = np.shape(data)[1]#隨機初始化參數W1 = tf.get_variable("W1", [len , hidden1], initializer=tf.contrib.layers.xavier_initializer())b1 = tf.get_variable("b1", [hidden1 , 1], initializer=tf.zeros_initializer())W2 = tf.get_variable("W2", [hidden1 , hidden2], initializer=tf.contrib.layers.xavier_initializer())b2 = tf.get_variable("b2", [hidden2 , 1], initializer=tf.zeros_initializer())W3 = tf.get_variable("W3", [hidden2 , hidden3], initializer=tf.contrib.layers.xavier_initializer())b3 = tf.get_variable("b3", [hidden3 , 1], initializer=tf.zeros_initializer())# 前向傳播Z1 = tf.add(tf.matmul(data, W1), b1) # Z1 = np.dot(W1, X) + b1A1 = tf.nn.relu(Z1) # A1 = relu(Z1)Z2 = tf.add(tf.matmul(A1, W2), b2) # Z2 = np.dot(W2, a1) + b2A2 = tf.nn.relu(Z2) # A2 = relu(Z2)Z3 = tf.add(tf.matmul(A2, W3), b3) # Z3 = np.dot(W3,Z2) + b3output = tf.nn.relu(Z3) #這個Relu我不知道要不要用。。。return output問題:同樣,,,這個最后的relu我不知道要不要用。
3. build_w_d函數解釋
下面是代碼:
def build_w_d(deep_input, wide_input, y):dmodel = deep_model(deep_input, 256, 128, 64)wmodel = wide_model(wide_input)#初始化參數(就是類似于前面函數的b)central_bias = tf.Variable([np.random.randn()], name="central_bias")# 使用 LR 將兩個模型組合在一起dmodel_weight = tf.Variable(tf.truncated_normal([1, 1]), name="dmodel_weight")wmodel_weight = tf.Variable(tf.truncated_normal([1, 1]), name="wmodel_weight")#將wide和deep的輸出結合起來network = tf.add(tf.matmul(dmodel , dmodel_weight) , tf.matmul(wmodel, wmodel_weight))prediction = tf.add(network, central_bias)#計算cost函數cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y , logits=prediction))#反向傳播,用了Adam優化train_step = tf.train.AdamOptimizer(0.001).minimize(cost)return train_step , cost , prediction好了,結合起來就是這樣,這展現了wide_deep模型的基本結構,當然,需要得到一個很厲害的,應用級的模型的話,還需要很多的優化與連接措施。
下面貼出幾個參考資料:
https://www.tensorflow.org/tutorials/wide_and_deep
https://research.google.com/pubs/pub45413.html
https://research.googleblog.com/2016/06/wide-deep-learning-better-together-with.html
?
總結
以上是生活随笔為你收集整理的TensorFlow搭建简易Wide and Deep 模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis Hash槽
- 下一篇: wide Deep tensorflo