Skip to content

Commit c1276be

Browse files
author
chaoming
committed
add return_sequence to SimpleRNN example and fix bugs
1 parent dc5820f commit c1276be

File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed

examples/mlp-digits.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ def main(max_iter):
1010
# prepare
1111
npdl.utils.random.set_seed(1234)
1212

13-
#
1413
# data
1514
digits = load_digits()
1615

@@ -32,5 +31,3 @@ def main(max_iter):
3231

3332
if __name__ == '__main__':
3433
main(150)
35-
36-

examples/rnn-character-lm.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ def main(max_iter, corpus_path=os.path.join(os.path.dirname(__file__), 'data/lm/
2828

2929
print("Building model ...")
3030
net = npdl.Model()
31-
# net.add(model.layers.SimpleRNN(n_out=500, return_sequence=True))
32-
net.add(npdl.layers.SimpleRNN(n_out=500, n_in=vocab_size))
31+
net.add(npdl.layers.SimpleRNN(n_out=500, n_in=vocab_size, return_sequence=True,
32+
nb_batch=batch_size, nb_seq=time_steps))
33+
net.add(npdl.layers.MeanPooling(pool_size=(time_steps, 1)))
34+
net.add(npdl.layers.Flatten())
3335
net.add(npdl.layers.Softmax(n_out=vocab_size))
3436
net.compile(loss=npdl.objectives.SCCE(), optimizer=npdl.optimizers.SGD(lr=0.00001, clip=5))
3537

examples/rnn-character-lm2.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import os
4+
5+
import numpy as np
6+
7+
import npdl
8+
9+
10+
def main(max_iter, corpus_path=os.path.join(os.path.dirname(__file__), 'data/lm/tiny_shakespeare.txt')):
11+
raw_text = open(corpus_path, 'r').read()
12+
chars = list(set(raw_text))
13+
data_size, vocab_size = len(raw_text), len(chars)
14+
print("data has %s charactres, % unique." % (data_size, vocab_size))
15+
char_to_index = {ch: i for i, ch in enumerate(chars)}
16+
index_to_char = {i: ch for i, ch in enumerate(chars)}
17+
18+
time_steps, batch_size = 30, 40
19+
20+
length = batch_size * 20
21+
text_pointers = np.random.randint(data_size - time_steps - 1, size=length)
22+
batch_in = np.zeros([length, time_steps, vocab_size])
23+
batch_out = np.zeros([length, vocab_size], dtype=np.uint8)
24+
for i in range(length):
25+
b_ = [char_to_index[c] for c in raw_text[text_pointers[i]:text_pointers[i] + time_steps + 1]]
26+
batch_in[i, range(time_steps), b_[:-1]] = 1
27+
batch_out[i, b_[-1]] = 1
28+
29+
print("Building model ...")
30+
net = npdl.Model()
31+
net.add(npdl.layers.SimpleRNN(n_out=500, n_in=vocab_size))
32+
net.add(npdl.layers.Softmax(n_out=vocab_size))
33+
net.compile(loss=npdl.objectives.SCCE(), optimizer=npdl.optimizers.SGD(lr=0.00001, clip=5))
34+
35+
print("Train model ...")
36+
net.fit(batch_in, batch_out, max_iter=max_iter, batch_size=batch_size)
37+
38+
39+
if __name__ == '__main__':
40+
main(100)

npdl/layers/recurrent.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ def backward(self, pre_grad, *args, **kwargs):
160160
# hiddens.shape == (nb_timesteps, nb_batch, nb_out)
161161
hiddens = np.transpose(self.last_output, (1, 0, 2))
162162
if self.return_sequence:
163-
# check shape #
163+
# check shape
164+
pre_grad = np.transpose(pre_grad, (1, 0, 2))
164165
assert hiddens.shape == pre_grad.shape
165166
nb_timesteps = pre_grad.shape[0]
166167
layer_grad = Zero()(pre_grad.shape)

0 commit comments

Comments
 (0)