提交 9ec4ae1e 编写于 作者: S shippingwang

upgrade to API2.0

上级 4d1187d5
...@@ -18,91 +18,92 @@ from __future__ import print_function ...@@ -18,91 +18,92 @@ from __future__ import print_function
import numpy as np import numpy as np
import paddle import paddle
import paddle.fluid as fluid
from paddle.fluid.param_attr import ParamAttr
from paddle.fluid.layer_helper import LayerHelper
from paddle.fluid.dygraph.nn import Conv2D, Pool2D, BatchNorm, Linear, Dropout
import math import math
from paddle.nn import Conv2d, BatchNorm2d, Linear, Dropout, MaxPool2d, AvgPool2d
from paddle import ParamAttr
import paddle.nn.functional as F
from paddle.jit import to_static
from paddle.static import InputSpec
class ConvBNLayer(paddle.nn.Layer):
class ConvBNLayer(fluid.dygraph.Layer):
def __init__(self, def __init__(self,
num_channels, in_channels,
num_filters, out_channels,
filter_size, kernel_size,
stride=1, stride=1,
groups=1, groups=1,
act=None, act=None,
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2D( self._conv = Conv2d(
num_channels=num_channels, in_channels=in_channels,
num_filters=num_filters, out_channels=out_channels,
filter_size=filter_size, kernel_size=kernel_size,
stride=stride, stride=stride,
padding=(filter_size - 1) // 2, padding=(kernel_size - 1) // 2,
groups=groups, groups=groups,
act=None, weight_attr=ParamAttr(name=name + "_weights"),
param_attr=ParamAttr(name=name + "_weights"),
bias_attr=False) bias_attr=False)
if name == "conv1": if name == "conv1":
bn_name = "bn_" + name bn_name = "bn_" + name
else: else:
bn_name = "bn" + name[3:] bn_name = "bn" + name[3:]
self._batch_norm = BatchNorm(
num_filters, self._act = act
act=act,
param_attr=ParamAttr(name=bn_name + "_scale"), self._batch_norm = BatchNorm2d(
bias_attr=ParamAttr(bn_name + "_offset"), out_channels,
moving_mean_name=bn_name + "_mean", weight_attr=ParamAttr(name=bn_name + "_scale"),
moving_variance_name=bn_name + "_variance") bias_attr=ParamAttr(bn_name + "_offset"))
def forward(self, inputs): def forward(self, inputs):
y = self._conv(inputs) y = self._conv(inputs)
y = self._batch_norm(y) y = self._batch_norm(y)
if self._act:
y = getattr(paddle.nn.functional, self._act)(y)
return y return y
class BottleneckBlock(fluid.dygraph.Layer): class BottleneckBlock(paddle.nn.Layer):
def __init__(self, def __init__(self,
num_channels, in_channels,
num_filters, out_channels,
stride, stride,
shortcut=True, shortcut=True,
name=None): name=None):
super(BottleneckBlock, self).__init__() super(BottleneckBlock, self).__init__()
self.conv0 = ConvBNLayer( self.conv0 = ConvBNLayer(
num_channels=num_channels, in_channels=in_channels,
num_filters=num_filters, out_channels=out_channels,
filter_size=1, kernel_size=1,
act="relu", act="relu",
name=name + "_branch2a") name=name + "_branch2a")
self.conv1 = ConvBNLayer( self.conv1 = ConvBNLayer(
num_channels=num_filters, in_channels=out_channels,
num_filters=num_filters, out_channels=out_channels,
filter_size=3, kernel_size=3,
stride=stride, stride=stride,
act="relu", act="relu",
name=name + "_branch2b") name=name + "_branch2b")
self.conv2 = ConvBNLayer( self.conv2 = ConvBNLayer(
num_channels=num_filters, in_channels=out_channels,
num_filters=num_filters * 4, out_channels=out_channels * 4,
filter_size=1, kernel_size=1,
act=None, act=None,
name=name + "_branch2c") name=name + "_branch2c")
if not shortcut: if not shortcut:
self.short = ConvBNLayer( self.short = ConvBNLayer(
num_channels=num_channels, in_channels=in_channels,
num_filters=num_filters * 4, out_channels=out_channels * 4,
filter_size=1, kernel_size=1,
stride=stride, stride=stride,
name=name + "_branch1") name=name + "_branch1")
self.shortcut = shortcut self.shortcut = shortcut
self._num_channels_out = num_filters * 4
def forward(self, inputs): def forward(self, inputs):
y = self.conv0(inputs) y = self.conv0(inputs)
...@@ -114,37 +115,37 @@ class BottleneckBlock(fluid.dygraph.Layer): ...@@ -114,37 +115,37 @@ class BottleneckBlock(fluid.dygraph.Layer):
else: else:
short = self.short(inputs) short = self.short(inputs)
y = fluid.layers.elementwise_add(x=short, y=conv2) y = paddle.add(x=short, y=conv2)
return fluid.layers.relu(y) return F.relu(y)
class BasicBlock(fluid.dygraph.Layer): class BasicBlock(paddle.nn.Layer):
def __init__(self, def __init__(self,
num_channels, in_channels,
num_filters, out_channels,
stride, stride,
shortcut=True, shortcut=True,
name=None): name=None):
super(BasicBlock, self).__init__() super(BasicBlock, self).__init__()
self.stride = stride self.stride = stride
self.conv0 = ConvBNLayer( self.conv0 = ConvBNLayer(
num_channels=num_channels, in_channels=in_channels,
num_filters=num_filters, out_channels=out_channels,
filter_size=3, filter_size=3,
stride=stride, stride=stride,
act="relu", act="relu",
name=name + "_branch2a") name=name + "_branch2a")
self.conv1 = ConvBNLayer( self.conv1 = ConvBNLayer(
num_channels=num_filters, in_channels=out_channels,
num_filters=num_filters, out_channels=out_channels,
filter_size=3, filter_size=3,
act=None, act=None,
name=name + "_branch2b") name=name + "_branch2b")
if not shortcut: if not shortcut:
self.short = ConvBNLayer( self.short = ConvBNLayer(
num_channels=num_channels, in_channels=in_channels,
num_filters=num_filters, out_channels=out_channels,
filter_size=1, filter_size=1,
stride=stride, stride=stride,
name=name + "_branch1") name=name + "_branch1")
...@@ -159,13 +160,11 @@ class BasicBlock(fluid.dygraph.Layer): ...@@ -159,13 +160,11 @@ class BasicBlock(fluid.dygraph.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = fluid.layers.elementwise_add(x=short, y=conv1) y = paddle.add(short, conv1)
y = F.relu(y)
layer_helper = LayerHelper(self.full_name(), act="relu") return y
return layer_helper.append_activation(y)
class TSN_ResNet(paddle.nn.Layer):
class TSN_ResNet(fluid.dygraph.Layer):
def __init__(self, config): def __init__(self, config):
super(TSN_ResNet, self).__init__() super(TSN_ResNet, self).__init__()
self.layers = config.MODEL.num_layers self.layers = config.MODEL.num_layers
...@@ -184,19 +183,19 @@ class TSN_ResNet(fluid.dygraph.Layer): ...@@ -184,19 +183,19 @@ class TSN_ResNet(fluid.dygraph.Layer):
depth = [3, 4, 23, 3] depth = [3, 4, 23, 3]
elif self.layers == 152: elif self.layers == 152:
depth = [3, 8, 36, 3] depth = [3, 8, 36, 3]
num_channels = [64, 256, 512, in_channels = [64, 256, 512,
1024] if self.layers >= 50 else [64, 64, 128, 256] 1024] if self.layers >= 50 else [64, 64, 128, 256]
num_filters = [64, 128, 256, 512] out_channels = [64, 128, 256, 512]
self.conv = ConvBNLayer( self.conv = ConvBNLayer(
num_channels=3, in_channels=3,
num_filters=64, out_channels=64,
filter_size=7, kernel_size=7,
stride=2, stride=2,
act="relu", act="relu",
name="conv1") name="conv1")
self.pool2d_max = Pool2D( self.pool2d_max = MaxPool2d(
pool_size=3, pool_stride=2, pool_padding=1, pool_type="max") kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
if self.layers >= 50: if self.layers >= 50:
...@@ -213,9 +212,9 @@ class TSN_ResNet(fluid.dygraph.Layer): ...@@ -213,9 +212,9 @@ class TSN_ResNet(fluid.dygraph.Layer):
bottleneck_block = self.add_sublayer( bottleneck_block = self.add_sublayer(
conv_name, conv_name,
BottleneckBlock( BottleneckBlock(
num_channels=num_channels[block] in_channels=in_channels[block]
if i == 0 else num_filters[block] * 4, if i == 0 else out_channels[block] * 4,
num_filters=num_filters[block], out_channels=out_channels[block],
stride=2 if i == 0 and block != 0 else 1, stride=2 if i == 0 and block != 0 else 1,
shortcut=shortcut, shortcut=shortcut,
name=conv_name)) name=conv_name))
...@@ -229,44 +228,44 @@ class TSN_ResNet(fluid.dygraph.Layer): ...@@ -229,44 +228,44 @@ class TSN_ResNet(fluid.dygraph.Layer):
basic_block = self.add_sublayer( basic_block = self.add_sublayer(
conv_name, conv_name,
BasicBlock( BasicBlock(
num_channels=num_channels[block] in_channels=in_channels[block]
if i == 0 else num_filters[block], if i == 0 else out_channels[block],
num_filters=num_filters[block], out_channels=out_channels[block],
stride=2 if i == 0 and block != 0 else 1, stride=2 if i == 0 and block != 0 else 1,
shortcut=shortcut, shortcut=shortcut,
name=conv_name)) name=conv_name))
self.block_list.append(basic_block) self.block_list.append(basic_block)
shortcut = True shortcut = True
self.pool2d_avg = Pool2D( self.pool2d_avg = AvgPool2d(kernel_size=7)
pool_size=7, pool_type='avg', global_pooling=True)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = in_channels[-1] * 2
self.out = Linear( self.out = Linear(
self.pool2d_avg_channels, self.pool2d_avg_channels,
self.class_dim, self.class_dim,
act='softmax', weight_attr=ParamAttr(
param_attr=ParamAttr( initializer=paddle.nn.initializer.Normal(
initializer=fluid.initializer.Normal(
loc=0.0, scale=0.01), loc=0.0, scale=0.01),
name="fc_0.w_0"), name="fc_0.w_0"),
bias_attr=ParamAttr( bias_attr=ParamAttr(
initializer=fluid.initializer.ConstantInitializer(value=0.0), initializer=paddle.nn.initializer.Constant(value=0.0),
name="fc_0.b_0")) name="fc_0.b_0"))
#@to_static(input_spec=[InputSpec(shape=[None, 3, 224, 224], name='inputs')])
def forward(self, inputs): def forward(self, inputs):
y = fluid.layers.reshape( y = paddle.reshape(
inputs, [-1, inputs.shape[2], inputs.shape[3], inputs.shape[4]]) inputs, [-1, inputs.shape[2], inputs.shape[3], inputs.shape[4]])
y = self.conv(y) y = self.conv(y)
y = self.pool2d_max(y) y = self.pool2d_max(y)
for block in self.block_list: for block in self.block_list:
y = block(y) y = block(y)
y = self.pool2d_avg(y) y = self.pool2d_avg(y)
y = fluid.layers.dropout( y = F.dropout(y, p=0.2)
y, dropout_prob=0.2, dropout_implementation="upscale_in_train") y = paddle.reshape(y, [-1, self.seg_num, y.shape[1]])
y = fluid.layers.reshape(y, [-1, self.seg_num, y.shape[1]]) y = paddle.mean(y, axis=1)
y = fluid.layers.reduce_mean(y, dim=1) y = paddle.reshape(y, shape=[-1, 2048])
y = fluid.layers.reshape(y, shape=[-1, 2048])
y = self.out(y) y = self.out(y)
y = F.softmax(y)
return y return y
...@@ -16,20 +16,19 @@ import os ...@@ -16,20 +16,19 @@ import os
import sys import sys
import time import time
import argparse import argparse
import ast
import wget import wget
import tarfile import tarfile
import logging import logging
import numpy as np import numpy as np
import paddle.fluid as fluid
import glob import glob
from paddle.fluid.dygraph.base import to_variable import ast
from model import TSN_ResNet from model import TSN_ResNet
from utils.config_utils import * from utils.config_utils import *
from reader.ucf101_reader import UCF101Reader from reader.ucf101_reader import UCF101Reader
import paddle import paddle
from paddle.io import DataLoader, DistributedBatchSampler from paddle.io import DataLoader, DistributedBatchSampler
from compose import TSN_UCF101_Dataset from compose import TSN_UCF101_Dataset
import paddle.nn.functional as F
logging.root.handlers = [] logging.root.handlers = []
FORMAT = '[%(levelname)s: %(filename)s: %(lineno)4d]: %(message)s' FORMAT = '[%(levelname)s: %(filename)s: %(lineno)4d]: %(message)s'
...@@ -127,11 +126,11 @@ def val(epoch, model, val_loader, cfg, args): ...@@ -127,11 +126,11 @@ def val(epoch, model, val_loader, cfg, args):
outputs = model(imgs) outputs = model(imgs)
loss = fluid.layers.cross_entropy( loss = F.cross_entropy(
input=outputs, label=labels, ignore_index=-1) input=outputs, label=labels, ignore_index=-1)
avg_loss = fluid.layers.mean(loss) avg_loss = paddle.mean(loss)
acc_top1 = fluid.layers.accuracy(input=outputs, label=labels, k=1) acc_top1 = paddle.metric.accuracy(input=outputs, label=labels, k=1)
acc_top5 = fluid.layers.accuracy(input=outputs, label=labels, k=5) acc_top5 = paddle.metric.accuracy(input=outputs, label=labels, k=5)
dy_out = avg_loss.numpy()[0] dy_out = avg_loss.numpy()[0]
total_loss += dy_out total_loss += dy_out
...@@ -161,12 +160,12 @@ def create_optimizer(cfg, params): ...@@ -161,12 +160,12 @@ def create_optimizer(cfg, params):
l2_weight_decay = cfg.l2_weight_decay l2_weight_decay = cfg.l2_weight_decay
momentum = cfg.momentum momentum = cfg.momentum
optimizer = fluid.optimizer.Momentum( optimizer = paddle.optimizer.Momentum(
learning_rate=fluid.layers.piecewise_decay( learning_rate=paddle.optimizer.PiecewiseLR(
boundaries=bd, values=lr), boundaries=bd, values=lr),
momentum=momentum, momentum=momentum,
regularization=fluid.regularizer.L2Decay(l2_weight_decay), weight_decay=paddle.regularizer.L2Decay(l2_weight_decay),
parameter_list=params) parameters=params)
return optimizer return optimizer
...@@ -178,162 +177,155 @@ def train(args): ...@@ -178,162 +177,155 @@ def train(args):
print_configs(train_config, 'Train') print_configs(train_config, 'Train')
use_data_parallel = args.use_data_parallel use_data_parallel = args.use_data_parallel
trainer_count = fluid.dygraph.parallel.Env().nranks paddle.disable_static(paddle.CUDAPlace(0))
# (data_parallel step1/6) place = paddle.CUDAPlace(paddle.distributed.ParallelEnv().dev_id) \
place = fluid.CUDAPlace(fluid.dygraph.parallel.Env().dev_id) \ if use_data_parallel else paddle.CUDAPlace(0)
if use_data_parallel else fluid.CUDAPlace(0) if use_data_parallel:
pre_state_dict = fluid.load_program_state(args.pretrain)
with fluid.dygraph.guard(place): paddle.distributed.init_parallel_env()
if use_data_parallel:
# (data_parallel step2/6) video_model = TSN_ResNet(train_config)
strategy = fluid.dygraph.parallel.prepare_context() if use_data_parallel:
video_model = TSN_ResNet(train_config)
video_model = init_model(video_model, pre_state_dict) video_model = paddle.DataParallel(video_model)
optimizer = create_optimizer(train_config.TRAIN,
video_model.parameters()) pre_state_dict, _ = paddle.load(args.pretrain)
#if paddle.distributed.parallel.Env().local_rank == 0:
video_model = init_model(video_model, pre_state_dict)
if use_data_parallel: optimizer = create_optimizer(train_config.TRAIN,
# (data_parallel step3/6) video_model.parameters())
video_model = fluid.dygraph.parallel.DataParallel(video_model,
strategy)
bs_denominator = 1 bs_denominator = 1
if args.use_gpu: if args.use_gpu:
# check number of GPUs # check number of GPUs
gpus = os.getenv("CUDA_VISIBLE_DEVICES", "") gpus = os.getenv("CUDA_VISIBLE_DEVICES", "")
if gpus == "": if gpus == "":
pass pass
else: else:
gpus = gpus.split(",") gpus = gpus.split(",")
num_gpus = len(gpus) num_gpus = len(gpus)
bs_denominator = num_gpus bs_denominator = num_gpus
bs_train_single = int(train_config.TRAIN.batch_size / bs_denominator) bs_train_single = int(train_config.TRAIN.batch_size / bs_denominator)
bs_val_single = int(valid_config.VALID.batch_size / bs_denominator) bs_val_single = int(valid_config.VALID.batch_size / bs_denominator)
train_dataset = TSN_UCF101_Dataset(train_config, 'train') train_dataset = TSN_UCF101_Dataset(train_config, 'train')
val_dataset = TSN_UCF101_Dataset(valid_config, 'valid') val_dataset = TSN_UCF101_Dataset(valid_config, 'valid')
train_sampler = DistributedBatchSampler( train_sampler = DistributedBatchSampler(
train_dataset, train_dataset,
batch_size=bs_train_single, batch_size=bs_train_single,
shuffle=train_config.TRAIN.use_shuffle, shuffle=train_config.TRAIN.use_shuffle,
drop_last=True) drop_last=True)
train_loader = DataLoader( train_loader = DataLoader(
train_dataset, train_dataset,
batch_sampler=train_sampler, batch_sampler=train_sampler,
places=place, places=place,
num_workers=train_config.TRAIN.num_workers, num_workers=train_config.TRAIN.num_workers,
return_list=True) return_list=True)
val_sampler = DistributedBatchSampler( val_sampler = DistributedBatchSampler(
val_dataset, batch_size=bs_val_single) val_dataset, batch_size=bs_val_single)
val_loader = DataLoader( val_loader = DataLoader(
val_dataset, val_dataset,
batch_sampler=val_sampler, batch_sampler=val_sampler,
places=place, places=place,
num_workers=valid_config.VALID.num_workers, num_workers=valid_config.VALID.num_workers,
return_list=True) return_list=True)
if use_data_parallel:
# (data_parallel step4/6) # resume training the model
train_reader = fluid.contrib.reader.distributed_batch_reader( if args.resume is not None:
train_reader) model_state, opt_state = paddle.load(args.resume)
video_model.set_dict(model_state)
# resume training the model optimizer.set_dict(opt_state)
if args.resume is not None:
model_state, opt_state = fluid.load_dygraph(args.resume) for epoch in range(1, train_config.TRAIN.epoch + 1):
video_model.set_dict(model_state) video_model.train()
optimizer.set_dict(opt_state) total_loss = 0.0
total_acc1 = 0.0
for epoch in range(1, train_config.TRAIN.epoch + 1): total_acc5 = 0.0
video_model.train() total_sample = 0
total_loss = 0.0 batch_start = time.time()
total_acc1 = 0.0 for batch_id, data in enumerate(train_loader):
total_acc5 = 0.0 train_reader_cost = time.time() - batch_start
total_sample = 0 imgs = paddle.to_tensor(data[0], place=paddle.CUDAPinnedPlace())
batch_start = time.time() labels = paddle.to_tensor(data[1], place=paddle.CUDAPinnedPlace())
for batch_id, data in enumerate(train_loader): labels.stop_gradient = True
train_reader_cost = time.time() - batch_start outputs = video_model(imgs)
imgs = paddle.to_tensor(data[0])
labels = paddle.to_tensor(data[1]) loss = F.cross_entropy(input=outputs, label=labels, ignore_index=-1)
labels.stop_gradient = True avg_loss = paddle.mean(loss)
outputs = video_model(imgs)
acc_top1 = paddle.metric.accuracy(
loss = fluid.layers.cross_entropy(
input=outputs, label=labels, ignore_index=-1)
avg_loss = fluid.layers.mean(loss)
acc_top1 = fluid.layers.accuracy(
input=outputs, label=labels, k=1) input=outputs, label=labels, k=1)
acc_top5 = fluid.layers.accuracy( acc_top5 = paddle.metric.accuracy(
input=outputs, label=labels, k=5) input=outputs, label=labels, k=5)
dy_out = avg_loss.numpy()[0] dy_out = avg_loss.numpy()[0]
if use_data_parallel: if use_data_parallel:
# (data_parallel step5/6) # (data_parallel step5/6)
avg_loss = video_model.scale_loss(avg_loss) avg_loss = video_model.scale_loss(avg_loss)
avg_loss.backward() avg_loss.backward()
video_model.apply_collective_grads() video_model.apply_collective_grads()
else: else:
avg_loss.backward() avg_loss.backward()
optimizer.minimize(avg_loss)
video_model.clear_gradients()
total_loss += dy_out
total_acc1 += acc_top1.numpy()[0]
total_acc5 += acc_top5.numpy()[0]
total_sample += 1
train_batch_cost = time.time() - batch_start
print(
'TRAIN Epoch: {}, iter: {}, batch_cost: {:.5f} s, reader_cost: {:.5f} s, loss={:.6f}, acc1 {:.6f}, acc5 {:.6f} '.
format(epoch, batch_id, train_batch_cost, train_reader_cost,
total_loss / total_sample, total_acc1 / total_sample,
total_acc5 / total_sample))
batch_start = time.time()
optimizer.minimize(avg_loss)
optimizer.step()
optimizer.clear_grad()
total_loss += dy_out
total_acc1 += acc_top1.numpy()[0]
total_acc5 += acc_top5.numpy()[0]
total_sample += 1
train_batch_cost = time.time() - batch_start
print( print(
'TRAIN End, Epoch {}, avg_loss= {}, avg_acc1= {}, avg_acc5= {}'. 'TRAIN Epoch: {}, iter: {}, batch_cost: {:.5f} s, reader_cost: {:.5f} s, loss={:.6f}, acc1 {:.6f}, acc5 {:.6f} '.
format(epoch, total_loss / total_sample, total_acc1 / format(epoch, batch_id, train_batch_cost, train_reader_cost,
total_sample, total_acc5 / total_sample)) total_loss / total_sample, total_acc1 / total_sample,
total_acc5 / total_sample))
batch_start = time.time()
# save model's and optimizer's parameters which used for resuming the training stage print(
save_parameters = (not use_data_parallel) or ( 'TRAIN End, Epoch {}, avg_loss= {}, avg_acc1= {}, avg_acc5= {}'.
use_data_parallel and format(epoch, total_loss / total_sample, total_acc1 /
fluid.dygraph.parallel.Env().local_rank == 0) total_sample, total_acc5 / total_sample))
if save_parameters:
model_path_pre = "_tsn" # save model's and optimizer's parameters which used for resuming the training stage
if not os.path.isdir(args.checkpoint): save_parameters = (not use_data_parallel) or (
os.makedirs(args.checkpoint) use_data_parallel and
model_path = os.path.join( paddle.distributed.ParallelEnv().local_rank == 0)
args.checkpoint, if save_parameters:
"_" + model_path_pre + "_epoch{}".format(epoch)) model_path_pre = "_tsn"
fluid.dygraph.save_dygraph(video_model.state_dict(), model_path) if not os.path.isdir(args.checkpoint):
fluid.dygraph.save_dygraph(optimizer.state_dict(), model_path) os.makedirs(args.checkpoint)
model_path = os.path.join(
if args.validate: args.checkpoint,
video_model.eval() "_" + model_path_pre + "_epoch{}".format(epoch))
val_acc = val(epoch, video_model, val_loader, valid_config, paddle.save(
args) video_model.state_dict(), model_path)
# save the best parameters in trainging stage paddle.save(optimizer.state_dict(), model_path)
if epoch == 1:
best_acc = val_acc if args.validate:
else: video_model.eval()
if val_acc > best_acc: val_acc = val(epoch, video_model,valid_loader, valid_config, args)
best_acc = val_acc # save the best parameters in trainging stage
if fluid.dygraph.parallel.Env().local_rank == 0: if epoch == 1:
if not os.path.isdir(args.weights): best_acc = val_acc
os.makedirs(args.weights)
fluid.dygraph.save_dygraph(video_model.state_dict(),
args.weights + "/final")
else: else:
if fluid.dygraph.parallel.Env().local_rank == 0: if val_acc > best_acc:
if not os.path.isdir(args.weights): best_acc = val_acc
os.makedirs(args.weights) if paddle.distributed.ParallelEnv().local_rank == 0:
fluid.dygraph.save_dygraph(video_model.state_dict(), if not os.path.isdir(args.weights):
args.weights + "/final") os.makedirs(args.weights)
paddle.save(video_model.state_dict(), args.weights + "/final")
else:
if paddle.distributed.parallel.Env().local_rank == 0:
if not os.path.isdir(args.weights):
os.makedirs(args.weights)
paddle.save(video_model.state_dict(),args.weights + "/final")
logger.info('[TRAIN] training finished') logger.info('[TRAIN] training finished')
if __name__ == "__main__": if __name__ == "__main__":
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册