単純なリカレントニューラルネットワーク用のコードがいくつかありますが、私の更新段階に必要なコードの量を減らす方法があるかどうかを知りたいと思っています。私はそうしていたコード:#RMSProp
下のすべての変数についてRMSPropのコード量を減らす方法はありますか
class RNN(object):
def__init___(self, data, hidden_size, eps=0.0001):
self.data = data
self.hidden_size = hidden_size
self.weights_hidden = np.random.rand(hidden_size, hidden_size) * 0.1 # W
self.weights_input = np.random.rand(hidden_size, len(data[0])) * 0.1 # U
self.weights_output = np.random.rand(len(data[0]), hidden_size) * 0.1 # V
self.bias_hidden = np.array([np.random.rand(hidden_size)]).T # b
self.bias_output = np.array([np.random.rand(len(data[0]))]).T # c
self.cache_w_hid, self.cache_w_in, self.cache_w_out = 0, 0, 0
self.cache_b_hid, self.cache_b_out = 0, 0
self.eps = eps
def train(self, seq_length, epochs, eta, decay_rate=0.9, learning_decay=0.0):
# Other stuff
self.update(seq, epoch, eta, decay_rate, learning_decay)
# Other Stuff
def update(self, seq, epoch, eta, decay_rate, learning_decay):
"""Updates the network's weights and biases by applying gradient
descent using backpropagation through time and RMSPROP.
"""
delta_nabla_c, delta_nabla_b,\
delta_nabla_V, delta_nabla_W, delta_nabla_U = self.backward_pass(seq)
eta = eta*np.exp(-epoch*learning_decay)
self.cache_w_hid += decay_rate * self.cache_w_hid \
+ (1 - decay_rate) * delta_nabla_W**2
self.weights_hidden -= eta * delta_nabla_W/(np.sqrt(self.cache_w_hid) + self.eps)
self.cache_w_in += decay_rate * self.cache_w_in \
+ (1 - decay_rate) * delta_nabla_U**2
self.weights_input -= eta * delta_nabla_U/(np.sqrt(self.cache_w_in) + self.eps)
self.cache_w_out += decay_rate * self.cache_w_out \
+ (1 - decay_rate) * delta_nabla_V**2
self.weights_output -= eta * delta_nabla_V/(np.sqrt(self.cache_w_out) + self.eps)
self.cache_b_hid += decay_rate * self.cache_b_hid \
+ (1 - decay_rate) * delta_nabla_b**2
self.bias_hidden -= eta * delta_nabla_b/(np.sqrt(self.cache_b_hid) + self.eps)
self.cache_b_out += decay_rate * self.cache_b_out \
+ (1 - decay_rate) * delta_nabla_c**2
self.bias_output -= eta * delta_nabla_c/(np.sqrt(self.cache_b_out) + self.eps)
、すなわち、更新規則に従います:
cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx/(np.sqrt(cache) + eps)
私はself.weight_
かself.bias_
が続き、これが書かれていたいcache_
すべて宣言していますよりコンパクトに。私はzip()
を使用して見ていたが、私はそれについてどうやって行くのか分からない。
このコードはどこですか?スクリプト/モジュール、クラス、関数では? 'self'の使用はメソッドを示しますが、' cache_w_hid'のようなグローバルの使用はモジュールまたはクラスを指しています。 –
私はあなたが何を意味するかあまりにも分かりません。私はこれを書いて、クラスがどのようにPythonで動作するかをよりよく理解するようにしました。コードのその部分がどこにあるのかを関数全体に含めるように投稿を更新しました。 'cache_'は' def update'にのみあり、クラス全体にはありません。 – Lukasz
それは私の質問に完全に答えます。ありがとう。今すぐ答えよ。 –