20
20
https://github.com/d2l-ai/d2l-en/blob/master/chapter_natural-language-processing/sentiment-analysis-rnn.md
21
21
https://github.com/d2l-ai/d2l-en/blob/master/chapter_natural-language-processing/sentiment-analysis-cnn.md"""
22
22
23
- import argparse
23
+ import collections
24
24
import os
25
- import tarfile
26
25
import random
27
- import collections
26
+ import sys
27
+ import tarfile
28
+
28
29
import mxnet as mx
29
30
from mxnet import nd , gluon
30
31
from mxnet .contrib import text
31
32
from mxnet .gluon import nn , rnn
32
33
from mxnet .gluon .contrib .estimator import estimator
33
34
35
+ # use with_seed decorator in python/unittest/common.py
36
+ sys .path .insert (0 , os .path .join (os .path .dirname (__file__ ), '..' , '..' , 'python' , 'unittest' ))
37
+ from common import with_seed
38
+ import unittest
39
+
34
40
35
41
class TextCNN (nn .Block ):
36
42
def __init__ (self , vocab , embed_size , kernel_sizes , num_channels ,
@@ -175,14 +181,10 @@ def pad(x):
175
181
return features , labels
176
182
177
183
178
- def run (net , train_dataloader , test_dataloader , ** kwargs ):
184
+ def run (net , train_dataloader , test_dataloader , num_epochs , ctx , lr ):
179
185
'''
180
186
Train a test sentiment model
181
187
'''
182
- num_epochs = kwargs ['epochs' ]
183
- ctx = kwargs ['ctx' ]
184
- batch_size = kwargs ['batch_size' ]
185
- lr = kwargs ['lr' ]
186
188
187
189
# Define trainer
188
190
trainer = mx .gluon .Trainer (net .collect_params (), 'adam' , {'learning_rate' : lr })
@@ -199,14 +201,17 @@ def run(net, train_dataloader, test_dataloader, **kwargs):
199
201
return acc
200
202
201
203
202
- def test_estimator_cpu (** kwargs ):
204
+ @with_seed ()
205
+ def test_estimator_cpu ():
203
206
'''
204
207
Test estimator by doing one pass over each model with synthetic data
205
208
'''
206
209
models = ['TextCNN' , 'BiRNN' ]
207
- ctx = kwargs ['ctx' ]
208
- batch_size = kwargs ['batch_size' ]
209
- embed_size = kwargs ['embed_size' ]
210
+ ctx = mx .cpu ()
211
+ batch_size = 64
212
+ embed_size = 100
213
+ lr = 1
214
+ num_epochs = 1
210
215
211
216
train_data = mx .nd .random .randint (low = 0 , high = 100 , shape = (2 * batch_size , 500 ))
212
217
train_label = mx .nd .random .randint (low = 0 , high = 2 , shape = (2 * batch_size ,))
@@ -229,18 +234,22 @@ def test_estimator_cpu(**kwargs):
229
234
net = BiRNN (vocab_list , embed_size , num_hiddens , num_layers )
230
235
net .initialize (mx .init .Xavier (), ctx = ctx )
231
236
232
- run (net , train_dataloader , val_dataloader , ** kwargs )
237
+ run (net , train_dataloader , val_dataloader , num_epochs = num_epochs , ctx = ctx , lr = lr )
233
238
234
239
235
- def test_estimator_gpu (** kwargs ):
240
+ # using fixed seed to reduce flakiness in accuracy assertion
241
+ @with_seed (7 )
242
+ @unittest .skipIf (mx .context .num_gpus () < 1 , "skip if no GPU" )
243
+ def test_estimator_gpu ():
236
244
'''
237
245
Test estimator by training Bidirectional RNN for 5 epochs on the IMDB dataset
238
246
and verify accuracy
239
247
'''
240
- ctx = kwargs ['ctx' ]
241
- batch_size = kwargs ['batch_size' ]
242
- num_epochs = kwargs ['epochs' ]
243
- embed_size = kwargs ['embed_size' ]
248
+ ctx = mx .gpu (0 )
249
+ batch_size = 64
250
+ num_epochs = 5
251
+ embed_size = 100
252
+ lr = 0.01
244
253
245
254
# data
246
255
download_imdb ()
@@ -253,8 +262,6 @@ def test_estimator_gpu(**kwargs):
253
262
test_dataloader = gluon .data .DataLoader (test_set , batch_size )
254
263
255
264
# Model
256
- # using fixed seed to reduce flakiness in accuracy assertion
257
- mx .random .seed (7 )
258
265
num_hiddens , num_layers = 100 , 2
259
266
net = BiRNN (vocab , embed_size , num_hiddens , num_layers )
260
267
net .initialize (mx .init .Xavier (), ctx = ctx )
@@ -265,27 +272,12 @@ def test_estimator_gpu(**kwargs):
265
272
net .embedding .weight .set_data (glove_embedding .idx_to_vec )
266
273
net .embedding .collect_params ().setattr ('grad_req' , 'null' )
267
274
268
- acc = run (net , train_dataloader , test_dataloader , ** kwargs )
275
+ acc = run (net , train_dataloader , test_dataloader , num_epochs = num_epochs , ctx = ctx , lr = lr )
269
276
270
277
assert acc .get ()[1 ] > 0.70
271
278
272
279
273
- parser = argparse .ArgumentParser (description = 'test gluon estimator' )
274
- parser .add_argument ('--type' , type = str , default = 'cpu' )
275
- opt = parser .parse_args ()
276
- kwargs = {
277
- 'batch_size' : 64 ,
278
- 'lr' : 0.01 ,
279
- 'embed_size' : 100
280
- }
281
-
282
- if opt .type == 'cpu' :
283
- kwargs ['ctx' ] = mx .cpu ()
284
- kwargs ['epochs' ] = 1
285
- test_estimator_cpu (** kwargs )
286
- elif opt .type == 'gpu' :
287
- kwargs ['ctx' ] = mx .gpu ()
288
- kwargs ['epochs' ] = 5
289
- test_estimator_gpu (** kwargs )
290
- else :
291
- raise RuntimeError ("Unknown test type" )
280
+ if __name__ == '__main__' :
281
+ import nose
282
+
283
+ nose .runmodule ()
0 commit comments