@@ -46,7 +46,8 @@ def train(args):
46
46
level = logging .INFO
47
47
if paddle .distributed .get_rank () == 0 else logging .WARN , )
48
48
49
- labels = get_labels (args .labels )
49
+ all_labels = get_labels (args .labels )
50
+
50
51
pad_token_label_id = paddle .nn .CrossEntropyLoss ().ignore_index
51
52
52
53
tokenizer = LayoutLMTokenizer .from_pretrained (args .model_name_or_path )
@@ -59,10 +60,10 @@ def train(args):
59
60
else :
60
61
model = LayoutLMModel .from_pretrained (args .model_name_or_path )
61
62
model = LayoutLMForTokenClassification (
62
- model , num_classes = len (labels ), dropout = None )
63
+ model , num_classes = len (all_labels ), dropout = None )
63
64
64
65
train_dataset = FunsdDataset (
65
- args , tokenizer , labels , pad_token_label_id , mode = "train" )
66
+ args , tokenizer , all_labels , pad_token_label_id , mode = "train" )
66
67
train_sampler = paddle .io .DistributedBatchSampler (
67
68
train_dataset , batch_size = args .per_gpu_train_batch_size , shuffle = True )
68
69
@@ -95,7 +96,9 @@ def train(args):
95
96
epsilon = args .adam_epsilon ,
96
97
weight_decay = args .weight_decay )
97
98
98
- # Train!
99
+ loss_fct = paddle .nn .loss .CrossEntropyLoss (ignore_index = pad_token_label_id )
100
+
101
+ # Train
99
102
logger .info ("***** Running training *****" )
100
103
logger .info (" Num examples = %d" , len (train_dataset ))
101
104
logger .info (" Num Epochs = %d" , args .num_train_epochs )
@@ -115,33 +118,26 @@ def train(args):
115
118
int (args .num_train_epochs ),
116
119
desc = "Epoch" ,
117
120
disable = args .local_rank not in [- 1 , 0 ])
118
- set_seed (
119
- args ) # Added here for reproductibility (even between python 2 and 3)
121
+ set_seed (args )
120
122
for _ in train_iterator :
121
123
epoch_iterator = tqdm (
122
124
train_dataloader ,
123
125
desc = "Iteration" ,
124
126
disable = args .local_rank not in [- 1 , 0 ])
125
127
for step , batch in enumerate (epoch_iterator ):
126
- # model.eval()
127
128
model .train ()
128
129
inputs = {
129
130
"input_ids" : batch [0 ],
130
131
"attention_mask" : batch [1 ],
131
- "labels" : batch [3 ],
132
+ "token_type_ids" : batch [2 ],
133
+ "bbox" : batch [4 ],
132
134
}
133
- if args .model_type in ["layoutlm" ]:
134
- inputs ["bbox" ] = batch [4 ]
135
- inputs ["token_type_ids" ] = (
136
- batch [2 ] if args .model_type in ["bert" , "layoutlm" ] else
137
- None ) # RoBERTa don"t use segment_ids
138
-
139
- outputs = model (** inputs )
140
- # model outputs are always tuple in ppnlp (see doc)
141
- loss = outputs [0 ]
135
+ labels = batch [3 ]
136
+ logits = model (** inputs )
137
+ loss = loss_fct (
138
+ logits .reshape ([- 1 , len (all_labels )]), labels .reshape ([- 1 , ]))
142
139
143
140
loss = loss .mean ()
144
-
145
141
logger .info ("train loss: {}" .format (loss .numpy ()))
146
142
loss .backward ()
147
143
@@ -162,7 +158,8 @@ def train(args):
162
158
args ,
163
159
model ,
164
160
tokenizer ,
165
- labels ,
161
+ all_labels ,
162
+ loss_fct ,
166
163
pad_token_label_id ,
167
164
mode = "test" , )
168
165
logger .info ("results: {}" .format (results ))
@@ -194,21 +191,21 @@ def train(args):
194
191
def evaluate (args ,
195
192
model ,
196
193
tokenizer ,
197
- labels ,
194
+ all_labels ,
195
+ loss_fct ,
198
196
pad_token_label_id ,
199
197
mode ,
200
198
prefix = "" ):
201
199
eval_dataset = FunsdDataset (
202
- args , tokenizer , labels , pad_token_label_id , mode = mode )
203
-
200
+ args , tokenizer , all_labels , pad_token_label_id , mode = mode )
204
201
args .eval_batch_size = args .per_gpu_eval_batch_size * max (
205
202
1 , paddle .distributed .get_world_size ())
206
203
eval_dataloader = paddle .io .DataLoader (
207
204
eval_dataset ,
208
205
batch_size = args .eval_batch_size ,
209
206
collate_fn = None , )
210
207
211
- # Eval!
208
+ # Eval
212
209
logger .info ("***** Running evaluation %s *****" , prefix )
213
210
logger .info (" Num examples = %d" , len (eval_dataset ))
214
211
logger .info (" Batch size = %d" , args .eval_batch_size )
@@ -222,33 +219,29 @@ def evaluate(args,
222
219
inputs = {
223
220
"input_ids" : batch [0 ],
224
221
"attention_mask" : batch [1 ],
225
- "labels" : batch [3 ],
222
+ "token_type_ids" : batch [2 ],
223
+ "bbox" : batch [4 ],
226
224
}
227
- if args .model_type in ["layoutlm" ]:
228
- inputs ["bbox" ] = batch [4 ]
229
- inputs ["token_type_ids" ] = (
230
- batch [2 ] if args .model_type in ["bert" , "layoutlm" ] else
231
- None ) # RoBERTa don"t use segment_ids
232
- outputs = model (** inputs )
233
- tmp_eval_loss , logits = outputs [:2 ]
234
-
225
+ labels = batch [3 ]
226
+ attention_mask = batch [1 ]
227
+ logits = model (** inputs )
228
+ tmp_eval_loss = loss_fct (
229
+ logits .reshape ([- 1 , len (all_labels )]), labels .reshape ([- 1 , ]))
235
230
tmp_eval_loss = tmp_eval_loss .mean ()
236
-
237
231
eval_loss += tmp_eval_loss .item ()
232
+
238
233
nb_eval_steps += 1
239
234
if preds is None :
240
235
preds = logits .numpy ()
241
- out_label_ids = inputs [ " labels" ] .numpy ()
236
+ out_label_ids = labels .numpy ()
242
237
else :
243
238
preds = np .append (preds , logits .numpy (), axis = 0 )
244
- out_label_ids = np .append (
245
- out_label_ids , inputs ["labels" ].numpy (), axis = 0 )
239
+ out_label_ids = np .append (out_label_ids , labels .numpy (), axis = 0 )
246
240
247
241
eval_loss = eval_loss / nb_eval_steps
248
242
preds = np .argmax (preds , axis = 2 )
249
243
250
- label_map = {i : label for i , label in enumerate (labels )}
251
-
244
+ label_map = {i : label for i , label in enumerate (all_labels )}
252
245
out_label_list = [[] for _ in range (out_label_ids .shape [0 ])]
253
246
preds_list = [[] for _ in range (out_label_ids .shape [0 ])]
254
247
@@ -272,7 +265,7 @@ def evaluate(args,
272
265
for key in sorted (results .keys ()):
273
266
logger .info (" %s = %s" , key , str (results [key ]))
274
267
275
- return results , preds_list
268
+ return results , preds
276
269
277
270
278
271
if __name__ == "__main__" :
0 commit comments