2017-07-10 35 views
3

在TensorFlow優化(蟒蛇)apply_dense不會得到所謂的神經元的權重(層連接)和偏置權重,但我想在此方法中使用這兩種方法。如何在優化器中獲得偏差和神經元權重?

def _apply_dense(self, grad, weight): 
    ... 

例如:具有兩個隱藏層具有兩個神經元和每個偏壓完全連接的神經網絡。

Neural network example

如果我們看一看在第2層,我們在apply_dense得到一個呼籲神經元的權重:

neuron weights

,並呼籲偏置權重:

bias weights

但我要麼需要兩個矩陣中的一個調用的apply_dense或權重矩陣是這樣的:

all weights from one layer

X_2X_4,B_1X_4,...只是兩個神經元之間的連接權重的符號。因此B_1X_4只是B_1和X_4之間權重的佔位符。

如何做到這一點?

MWE

對於此處的最小工作示例與動量隨機梯度下降優化器的實現。對於每一層來說,來自其他神經元的所有傳入連接的動量被降低到平均值(參見ndims == 2)。我需要的不僅是來自傳入神經元連接的動量值的平均值,而且還來自傳入偏移連接(如上所述)。

from __future__ import absolute_import 
from __future__ import division 
from __future__ import print_function 

import tensorflow as tf 
from tensorflow.python.training import optimizer 


class SGDmomentum(optimizer.Optimizer): 
    def __init__(self, learning_rate=0.001, mu=0.9, use_locking=False, name="SGDmomentum"): 
     super(SGDmomentum, self).__init__(use_locking, name) 
     self._lr = learning_rate 
     self._mu = mu 

     self._lr_t = None 
     self._mu_t = None 

    def _create_slots(self, var_list): 
     for v in var_list: 
      self._zeros_slot(v, "a", self._name) 

    def _apply_dense(self, grad, weight): 
     learning_rate_t = tf.cast(self._lr_t, weight.dtype.base_dtype) 
     mu_t = tf.cast(self._mu_t, weight.dtype.base_dtype) 
     momentum = self.get_slot(weight, "a") 

     if momentum.get_shape().ndims == 2: # neuron weights 
      momentum_mean = tf.reduce_mean(momentum, axis=1, keep_dims=True) 
     elif momentum.get_shape().ndims == 1: # bias weights 
      momentum_mean = momentum 
     else: 
      momentum_mean = momentum 

     momentum_update = grad + (mu_t * momentum_mean) 
     momentum_t = tf.assign(momentum, momentum_update, use_locking=self._use_locking) 

     weight_update = learning_rate_t * momentum_t 
     weight_t = tf.assign_sub(weight, weight_update, use_locking=self._use_locking) 

     return tf.group(*[weight_t, momentum_t]) 

    def _prepare(self): 
     self._lr_t = tf.convert_to_tensor(self._lr, name="learning_rate") 
     self._mu_t = tf.convert_to_tensor(self._mu, name="momentum_term") 

對於一個簡單的神經網絡:https://raw.githubusercontent.com/aymericdamien/TensorFlow-Examples/master/examples/3_NeuralNetworks/multilayer_perceptron.py(只改變優化的定製SGDmomentum優化)

+0

你需要更加明確。你在打什麼方法?你能給我們一個最小的工作例子嗎? –

+0

我正在實現一個優化器。我添加了一個這樣的優化器的MWE,並描述了我的問題的要求。 – Spen

+0

我不認爲我明白你在問什麼。你在問如何獲得網絡中的權重? –

回答

1

更新:我會盡力給一個更好的答案(或至少一些想法)現在我對你的目標有了一些瞭解,但是,正如你在評論中提出的那樣,在TensorFlow中做這件事可能不是沒有錯誤的方法。

由於TF是一種通用的計算框架,有確定哪些對重量和偏見是有一個模式沒有什麼好辦法(或者如果它是一個神經網絡的話)。以下是我可以想到的問題的一些可能方法:

  • 註釋張量。這可能是不實際的,因爲你已經說過你無法控制模型,但是一個簡單的選擇是爲張量添加額外的屬性來表示重量/偏差關係。例如,你可以不喜歡W.bias = BB.weight = W,然後在_apply_dense檢查hasattr(weight, "bias")和(有可能是在這個意義上說一些更好的設計)。
  • 您可以查看一些構建在TensorFlow之上的框架,您可以在其中獲得關於模型結構的更多信息。例如,Keras是一個基於圖層的框架,它實現了它自己的optimizer classes(基於TensorFlow或Theano)。我不太熟悉代碼或其可擴展性,但可能您有更多的工具可供使用。
  • 從優化器自己檢測網絡的結構。這很複雜,但理論上可行。從傳遞給優化器的損耗張量,應該可以在模型圖中「爬上」到達其所有節點(取張量的.op和操作的.inputs)。您可以檢測張量乘法和變量添加,並跳過其他所有內容(激活,損失計算等)以確定網絡的結構;如果模型與您的預期不符(例如,沒有乘法或者沒有後續加法的乘法),則可以引發異常,指示您的優化器不能用於該模型。

老的回答,保持飼養的緣故。

我不是100%清楚你想要做什麼,所以我不知道這是否真的回答你的問題。

比方說,你有一個緻密層變換大小中號的輸入大小ň的輸出。根據你顯示慣例,你就必須一個Ñ×中號權重矩陣W¯¯Ñ尺度的偏置矢量。然後,將輸入矢量大小中號X(或一批尺寸的輸入中號×ķ)將被通過層作爲W¯¯·X + ,然後加工應用激活功能(在批次的情況下,添加將是「廣播」操作)。在TensorFlow:

X = ... # Input batch of size M x K 
W = ... # Weights of size N x M 
B = ... # Biases of size N 

Y = tf.matmul(W, X) + B[:, tf.newaxis] # Output of size N x K 
# Activation... 

如果你願意,你可以隨時把W¯¯在一個單一的擴展權重矩陣W¯¯ *,基本上添加作爲一個新行中W¯¯ ,因此W *將是(N + 1)×M。然後你只需要到一個新的元素添加到輸入向量X包含常數1(或新的,如果它是一個批處理行),那麼你會得到X *與大小ň + 1(或(N + 1)×K一批)。產品WX *然後會給你與以前相同的結果。在TensorFlow中:

X = ... # Input batch of size M x K 
W_star = ... # Extended weights of size (N + 1) x M 
# You can still have a "view" of the original W and B if you need it 
W = W_star[:N] 
B = W_star[-1] 

X_star = tf.concat([X, tf.ones_like(X[:1])], axis=0) 
Y = tf.matmul(W_star, X_star) # Output of size N x K 
# Activation... 

現在您可以計算梯度和更新的權重和偏差在一起。這種方法的一個缺點是,如果你想應用正則化,那麼你應該小心地將它應用於矩陣的權重部分,而不是偏見。

+0

謝謝你試圖想出我的問題的答案。可悲的是你是對的,這不是我的問題的實際答案。我試圖解決的問題是,從優化器的角度來看,我無法控制網絡的外觀。所以給定Y = tf.matmul(W,X)+ B我仍然想在apply_dense的調用中使用W和B.我的問題的答案只能來自優化者的觀點,而不是來自外部的答案。限制是我只能更改優化器而不是網絡。 – Spen

+0

@Spen好吧,我看了一下基礎優化器類,我看到了你現在想做的事情。但是我仍然不明白,如果你無法控制模型的外觀,你怎麼能保證實際上會存在偏見?或者說模型完全是一個神經網絡?在TF中,偏見和wieghts將只是兩個獨立的變量對象,如果你不能控制模型,我不知道你怎麼知道哪些是權重和偏差對。 – jdehesa

+0

是的,我也看到這個問題。我只是認爲這是一個給定的相應的權重和偏見相繼出現,並且權重矩陣的維數爲2,而偏差矩陣的維數爲1。但是也許您是對的,並且沒有保存在tensorflow中這樣做的方法。在其他框架中,這是可能的,因爲您可以訪問完整的網絡,但在張量流中,這種訪問似乎不可能。既然獎金已經用完了,你是唯一一個試圖幫助我的人,我會獎勵給你。 – Spen