我有一些簡單的循環神經網絡的代碼,並想知道是否有一種方法可以減少更新階段所需的代碼量。我有這樣的代碼:有沒有辦法來減少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)
爲#RMSProp
下每個變量如下更新規則,即:
cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx/(np.sqrt(cache) + eps)
我cache_
都宣佈之後self.weight_
或self.bias_
並希望有這樣寫更緊湊。我在尋找使用zip()
,但我不知道如何去做。
該代碼位於何處?在腳本/模塊,類或函數中? 'self'的使用表示一種方法,但使用像'cache_w_hid'這樣的全局變量指向一個模塊或一個類。 –
我不太確定你的意思。我寫這篇文章可以更好地理解python中的類是如何工作的。我已經更新了該帖子,以包含該代碼部分所在的整個功能。 'cache_'只能在'def update'中找到,而在整個班級中其他地方都沒有。 – Lukasz
完美地回答了我的問題。謝謝。現在就回答問題。 –