1. train_0:

1个GPU,两个GPU也可以训练但是会有问题,保存的模型测试结果都是一样的,所有测试图片结果一样,但每次测结果都不一样(第一次:000000,第二次555555,第三次888888等……因为没有吧module层去掉,只有去掉才可以用多gpu训练保证没问题)

from torchvision import datasets, transforms
import torch
from torch import nn
import torch.optim as optim
import argparse
import warnings
import torch.optim.lr_scheduler as lr_scheduler
from torch.utils.data.dataloader import default_collate
from model_0 import EfficientNet
import os
from PIL import Image
from collections import Counter
# os.environ['NCCL_SOCKET_IFNAME'] = 'lo'class LoadDataset(torch.utils.data.Dataset):def __init__(self, txt_data, transform=None):with open(txt_data, 'r') as f:images, all_label, label_id_num = [], [], []for line in f.readlines():line = line.strip().split(" ")images.append((line[0], line[1]))all_label.append(line[1])temp_l = dict(Counter(all_label))label_id_num.append(dict(sorted(temp_l.items())))classes = set(all_label)classes = sorted(list(classes))class_to_idx = {classes[i]: i for i in range(len(classes))}  # convert label to index(from 0 to num_class-1)del all_labelself.classes = classesself.class_to_idx = class_to_idxself.images = imagesself.transform = transformself.label_id_num = label_id_numdef __getitem__(self, index):img_name, label = self.images[index]label = self.class_to_idx[label]img = Image.open(img_name).convert('RGB')if self.transform is not None:img = self.transform(img)return img, labeldef __len__(self):return len(self.images)def main():ii = 0learning_rate = 1e-3  # 学习率best_acc = 0  # 初始化best test accuracyprint("Start Training, DeepNetwork!")  # 定义遍历数据集的次数# criterioncriterion = nn.CrossEntropyLoss().cuda()# optimizeroptimizer = optim.Adam(params_to_update, lr=learning_rate, betas=(0.9, 0.999), eps=1e-9)# schedulerscheduler = lr_scheduler.ReduceLROnPlateau(optimizer, mode='max', factor=0.7, patience=3, verbose=True)with open(save_dir + "/acc.txt", "w") as f, open(save_dir + "/model_performance.txt", "w") as f1:write_attribute_str = ",".join(u for u in attribute_label)f1.write("label: " + write_attribute_str + "\n")f1.write('train_num:{}, {}'.format(len(train_dataset), train_dataset.label_id_num[0]) + "\n")f1.write('val_num:{}, {}'.format(len(val_dataset), val_dataset.label_id_num[0]) + "\n")with open(save_dir + "/log.txt", "w")as f2:for epoch in range(pre_epoch, epochs):# scheduler.step(epoch)print('\nEpoch: %d' % (epoch + 1))net.train()sum_loss = 0.0correct = 0.0total = 0.0for i, data in enumerate(dataloaders_train):# 准备数据length = len(dataloaders_train)input, target = datainput, target = input.to(device), target.to(device)# 训练optimizer.zero_grad()# forward + backwardoutput = net(input)loss = criterion(output, target)loss.backward()optimizer.step()# 每训练1个batch打印一次loss和准确率sum_loss += loss.item()_, predicted = torch.max(output.data, 1)total += target.size(0)correct += predicted.eq(target.data).cpu().sum()print('[epoch:%d, iter:%d] Loss: %.03f | Acc: %.3f%% '% (epoch + 1, (i + 1 + epoch * length), sum_loss / (i + 1),100. * float(correct) / float(total)))f2.write('%03d  %05d |Loss: %.03f | Acc: %.3f%% '% (epoch + 1, (i + 1 + epoch * length), sum_loss / (i + 1),100. * float(correct) / float(total)))f2.write('\n')f2.flush()# 每训练完一个epoch测试一下准确率print("Waiting Test!")with torch.no_grad():test_cor = [0] * classes_numtest_pre = [0] * classes_numrecall = []precision = []correct = 0total = 0for data in dataloaders_val:net.eval()images, labels = dataimages, labels = images.to(device), labels.to(device)outputs = net(images)# 取得分最高的那个类 (outputs.data的索引号)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).cpu().sum()num_base = labels.shape[0]labels_l = labels.cpu().numpy().tolist()predicted_l = predicted.cpu().numpy().tolist()for i in range(num_base):test_pre[int(predicted_l[i])] += 1if predicted_l[i] == labels_l[i]:test_cor[int(labels_l[i])] += 1print('test_accuracy= %.3f%%' % (100. * float(correct) / float(total)))acc = 100. * float(correct) / float(total)scheduler.step(acc)for i in range(classes_num):recall.append(100. * float(test_cor[i]) / float(val_list[i]) if val_list[i]>0 else 0)precision.append(100. * float(test_cor[i]) / float(test_pre[i]) if test_pre[i]>0 else 0)# 将每次测试结果实时写入acc.txt文件中if ii % 1 == 0:print('Saving model......')torch.save(net.state_dict(), '%s/net_%03d.pth' % (save_dir, epoch + 1))f.write("EPOCH=%03d,Accuracy= %.3f%%\n" % (epoch + 1, acc))f.flush()f1.write("EPOCH=%03d\n" % (epoch + 1))f1.write("total=%d,correct=%d,Accuracy= %.3f%%\n" % (total, correct, acc))for j in range(len(recall)):f1.write("%s:total=%d,correct_num=%d,predicted_num=%d,recall=%.2f%%,precision=%.2f%%\n"% (attribute_label[j], val_list[j], test_cor[j], test_pre[j], recall[j], precision[j]))f1.flush()# 记录最佳测试分类准确率并写入best_acc.txt文件中if acc > best_acc:f3 = open(save_dir + "/best_acc.txt", "w")f3.write("EPOCH=%d,best_acc= %.3f%%" % (epoch + 1, acc))f3.close()best_acc = accprint("Training Finished, TotalEPOCH=%d" % epochs)if __name__ == "__main__":os.environ['CUDA_VISIBLE_DEVICES'] = '0' #设置0为主卡 实际显卡:0,1 现在运算显卡:0,1warnings.filterwarnings("ignore")# parser = argparse.ArgumentParser(description='PyTorch DeepNetwork Training')# parser.add_argument('--weights', type=str, default='save_models/efficientnet-b1.pth', help='initial weights path')# parser.add_argument('--batch_size', type=int, default=4, help='total batch size for all GPUs')# parser.add_argument('--epochs', type=int, default=100)# parser.add_argument('--pre_epoch', type=int, default=0)# parser.add_argument('--save_dir', type=str, default="./logs/log0", help='model checkpoints')# args = parser.parse_args()freeze_pre = False  # True or Falsenet_weight = './efficientnetb0.pth'batch_size = 64epochs = 100pre_epoch = 0# save_dir = "./logs/log0"save_dir = "./out"# attribute_label = ["male", "female"]# attribute_name = "Female"# root_path = "E:/AI_data/human_data/PA100K/annotation/every_attribute/"# train_data_txt = root_path + attribute_name + "_train.txt"# val_data_txt = root_path + attribute_name + "_val.txt"# attribute_name = "Female"# root_path = "E:/AI_data/human_data/PA100K/annotation/every_attribute/"attribute_label = ["0", "1","2","3","4","5","6","7","8","9"]train_data_txt = "/home/jovyan/dataset/bag_data/colour/train.txt" #F:/1213bag/111/1colour/colour/train.txtval_data_txt = "/home/jovyan/dataset/bag_data/colour/val.txt" #F:/1213bag/111/1colour/colour/val.txtif not os.path.exists(save_dir):os.makedirs(save_dir)net = EfficientNet.from_name('efficientnet-b0')if freeze_pre:model = torch.load(net_weight)net.load_state_dict(model, strict=False)net._fc = nn.Linear(net._fc.in_features, len(attribute_label))for name, param in net.named_parameters():param.requires_grad = Falseif "_blocks_branch_0" in name:param.requires_grad = Truenet._conv_head.weight.requires_grad = Truenet._bn1.weight.requires_grad = Truenet._bn1.bias.requires_grad = Truenet._fc.weight.requires_grad = Truenet._fc.bias.requires_grad = Trueelse:model = torch.load(net_weight)net.load_state_dict(model, strict=False)net._fc = nn.Linear(net._fc.in_features, len(attribute_label))for name, param in net.named_parameters():if param.requires_grad == True:print("\t", name)dummy_input = torch.autograd.Variable(torch.randn(1, 3, 256, 128))net(dummy_input)net.set_swish(memory_efficient=False)# torch.onnx.export(net, dummy_input, "save.onnx")device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#     device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")if torch.cuda.device_count() > 1:net = nn.DataParallel(net)#所有默认显卡都会使用net.to(device)# net.load_state_dict(torch.load('./model/net_pre.pth'))params_to_update = net.parameters()# 数据预处理部分data_transforms = {'train': transforms.Compose([transforms.Resize(size=(256, 128)),# transforms.CenterCrop(input_size),transforms.RandomAffine(degrees=0, translate=(0.05, 0.05)),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]),'val': transforms.Compose([transforms.Resize(size=(256, 128)),# transforms.CenterCrop(input_size),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])}train_dataset = LoadDataset(txt_data=train_data_txt, transform=data_transforms['train'])val_dataset = LoadDataset(txt_data=val_data_txt, transform=data_transforms['val'])dataloaders_train = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=16)dataloaders_val = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size, shuffle=False, num_workers=16)val_list = list(val_dataset.label_id_num[0].values())classes_num = len(train_dataset.classes)if len(attribute_label) != classes_num:print("mark of data do not match attribute!")exit()print('classes:{}'.format(train_dataset.class_to_idx))print('train_num:{}, {}'.format(len(train_dataset), train_dataset.label_id_num[0]))print('val_num:{}, {}'.format(len(val_dataset), val_dataset.label_id_num[0]))main()

2. model_0:模型文件

"""model.py - Model and module class for EfficientNet.They are built to mirror those in the official TensorFlow implementation.
"""# Author: lukemelas (github username)
# Github repo: https://github.com/lukemelas/EfficientNet-PyTorch
# With adjustments and added comments by workingcoder (github username).import torch
from torch import nn
from torch.nn import functional as F
from utils import (round_filters,round_repeats,drop_connect,get_same_padding_conv2d,get_model_params,efficientnet_params,load_pretrained_weights,Swish,MemoryEfficientSwish,calculate_output_image_size
)VALID_MODELS = ('efficientnet-b0', 'efficientnet-b1', 'efficientnet-b2', 'efficientnet-b3','efficientnet-b4', 'efficientnet-b5', 'efficientnet-b6', 'efficientnet-b7','efficientnet-b8',# Support the construction of 'efficientnet-l2' without pretrained weights'efficientnet-l2'
)class MBConvBlock(nn.Module):"""Mobile Inverted Residual Bottleneck Block.Args:block_args (namedtuple): BlockArgs, defined in utils.py.global_params (namedtuple): GlobalParam, defined in utils.py.image_size (tuple or list): [image_height, image_width].References:[1] https://arxiv.org/abs/1704.04861 (MobileNet v1)[2] https://arxiv.org/abs/1801.04381 (MobileNet v2)[3] https://arxiv.org/abs/1905.02244 (MobileNet v3)"""def __init__(self, block_args, global_params, image_size=None):super().__init__()self._block_args = block_argsself._bn_mom = 1 - global_params.batch_norm_momentum  # pytorch's difference from tensorflowself._bn_eps = global_params.batch_norm_epsilonself.has_se = (self._block_args.se_ratio is not None) and (0 < self._block_args.se_ratio <= 1)self.id_skip = block_args.id_skip  # whether to use skip connection and drop connect# Expansion phase (Inverted Bottleneck)inp = self._block_args.input_filters  # number of input channelsoup = self._block_args.input_filters * self._block_args.expand_ratio  # number of output channelsif self._block_args.expand_ratio != 1:Conv2d = get_same_padding_conv2d(image_size=image_size)self._expand_conv = Conv2d(in_channels=inp, out_channels=oup, kernel_size=1, bias=False)self._bn0 = nn.BatchNorm2d(num_features=oup, momentum=self._bn_mom, eps=self._bn_eps)# image_size = calculate_output_image_size(image_size, 1) <-- this wouldn't modify image_size# Depthwise convolution phasek = self._block_args.kernel_sizes = self._block_args.strideConv2d = get_same_padding_conv2d(image_size=image_size)self._depthwise_conv = Conv2d(in_channels=oup, out_channels=oup, groups=oup,  # groups makes it depthwisekernel_size=k, stride=s, bias=False)self._bn1 = nn.BatchNorm2d(num_features=oup, momentum=self._bn_mom, eps=self._bn_eps)image_size = calculate_output_image_size(image_size, s)# Squeeze and Excitation layer, if desiredif self.has_se:Conv2d = get_same_padding_conv2d(image_size=(1, 1))num_squeezed_channels = max(1, int(self._block_args.input_filters * self._block_args.se_ratio))self._se_reduce = Conv2d(in_channels=oup, out_channels=num_squeezed_channels, kernel_size=1)self._se_expand = Conv2d(in_channels=num_squeezed_channels, out_channels=oup, kernel_size=1)# Pointwise convolution phasefinal_oup = self._block_args.output_filtersConv2d = get_same_padding_conv2d(image_size=image_size)self._project_conv = Conv2d(in_channels=oup, out_channels=final_oup, kernel_size=1, bias=False)self._bn2 = nn.BatchNorm2d(num_features=final_oup, momentum=self._bn_mom, eps=self._bn_eps)self._swish = MemoryEfficientSwish()def forward(self, inputs, drop_connect_rate=None):"""MBConvBlock's forward function.Args:inputs (tensor): Input tensor.drop_connect_rate (bool): Drop connect rate (float, between 0 and 1).Returns:Output of this block after processing."""# Expansion and Depthwise Convolutionx = inputsif self._block_args.expand_ratio != 1:x = self._expand_conv(inputs)x = self._bn0(x)x = self._swish(x)x = self._depthwise_conv(x)x = self._bn1(x)x = self._swish(x)# Squeeze and Excitationif self.has_se:x_squeezed = F.adaptive_avg_pool2d(x, 1)x_squeezed = self._se_reduce(x_squeezed)x_squeezed = self._swish(x_squeezed)x_squeezed = self._se_expand(x_squeezed)x = torch.sigmoid(x_squeezed) * x# Pointwise Convolutionx = self._project_conv(x)x = self._bn2(x)# Skip connection and drop connectinput_filters, output_filters = self._block_args.input_filters, self._block_args.output_filtersif self.id_skip and self._block_args.stride == 1 and input_filters == output_filters:# The combination of skip connection and drop connect brings about stochastic depth.if drop_connect_rate:x = drop_connect(x, p=drop_connect_rate, training=self.training)x = x + inputs  # skip connectionreturn xdef set_swish(self, memory_efficient=True):"""Sets swish function as memory efficient (for training) or standard (for export).Args:memory_efficient (bool): Whether to use memory-efficient version of swish."""self._swish = MemoryEfficientSwish() if memory_efficient else Swish()class EfficientNet(nn.Module):"""EfficientNet model.Most easily loaded with the .from_name or .from_pretrained methods.Args:blocks_args (list[namedtuple]): A list of BlockArgs to construct blocks.global_params (namedtuple): A set of GlobalParams shared between blocks.References:[1] https://arxiv.org/abs/1905.11946 (EfficientNet)Example:import torch# >>> from efficientnet.model import EfficientNet# >>> inputs = torch.rand(1, 3, 224, 224)# >>> model = EfficientNet.from_pretrained('efficientnet-b0')# >>> model.eval()# >>> outputs = model(inputs)"""def __init__(self, blocks_args=None, global_params=None):super().__init__()assert isinstance(blocks_args, list), 'blocks_args should be a list'assert len(blocks_args) > 0, 'block args must be greater than 0'self._global_params = global_paramsself._blocks_args = blocks_args# Batch norm parametersbn_mom = 1 - self._global_params.batch_norm_momentumbn_eps = self._global_params.batch_norm_epsilon# Get stem static or dynamic convolution depending on image sizeimage_size = global_params.image_sizeConv2d = get_same_padding_conv2d(image_size=image_size)# Stemin_channels = 3  # rgbout_channels = round_filters(32, self._global_params)  # number of output channelsself._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False)self._bn0 = nn.BatchNorm2d(num_features=out_channels, momentum=bn_mom, eps=bn_eps)image_size = calculate_output_image_size(image_size, 2)# Build blocksself._blocks = nn.ModuleList([])self._blocks_branch_0 = nn.ModuleList([])for block_args in self._blocks_args[:-2]:# Update block input and output filters based on depth multiplier.block_args = block_args._replace(input_filters=round_filters(block_args.input_filters, self._global_params),output_filters=round_filters(block_args.output_filters, self._global_params),num_repeat=round_repeats(block_args.num_repeat, self._global_params))# The first block needs to take care of stride and filter size increase.self._blocks.append(MBConvBlock(block_args, self._global_params, image_size=image_size))image_size = calculate_output_image_size(image_size, block_args.stride)if block_args.num_repeat > 1:  # modify block_args to keep same output sizeblock_args = block_args._replace(input_filters=block_args.output_filters, stride=1)for _ in range(block_args.num_repeat - 1):self._blocks.append(MBConvBlock(block_args, self._global_params, image_size=image_size))# image_size = calculate_output_image_size(image_size, block_args.stride)  # stride = 1for block_args in self._blocks_args[-2:]:block_args = block_args._replace(input_filters=round_filters(block_args.input_filters, self._global_params),output_filters=round_filters(block_args.output_filters, self._global_params),num_repeat=round_repeats(block_args.num_repeat, self._global_params))self._blocks_branch_0.append(MBConvBlock(block_args, self._global_params, image_size=image_size))image_size = calculate_output_image_size(image_size, block_args.stride)if block_args.num_repeat > 1:  # modify block_args to keep same output sizeblock_args = block_args._replace(input_filters=block_args.output_filters, stride=1)for _ in range(block_args.num_repeat - 1):self._blocks_branch_0.append(MBConvBlock(block_args, self._global_params, image_size=image_size))# Headin_channels = block_args.output_filters  # output of final blockout_channels = round_filters(1280, self._global_params)Conv2d = get_same_padding_conv2d(image_size=image_size)self._conv_head = Conv2d(in_channels, out_channels, kernel_size=1, bias=False)self._bn1 = nn.BatchNorm2d(num_features=out_channels, momentum=bn_mom, eps=bn_eps)# Final linear layerself._avg_pooling = nn.AdaptiveAvgPool2d(1)self._dropout = nn.Dropout(self._global_params.dropout_rate)self._fc = nn.Linear(out_channels, self._global_params.num_classes)self._swish = MemoryEfficientSwish()def set_swish(self, memory_efficient=True):"""Sets swish function as memory efficient (for training) or standard (for export).Args:memory_efficient (bool): Whether to use memory-efficient version of swish."""self._swish = MemoryEfficientSwish() if memory_efficient else Swish()for block in self._blocks:block.set_swish(memory_efficient)for block in self._blocks_branch_0:block.set_swish(memory_efficient)def extract_endpoints(self, inputs):"""Use convolution layer to extract featuresfrom reduction levels i in [1, 2, 3, 4, 5].Args:inputs (tensor): Input tensor.Returns:Dictionary of last intermediate featureswith reduction levels i in [1, 2, 3, 4, 5].Example:# >>> import torch# >>> from efficientnet.model import EfficientNet# >>> inputs = torch.rand(1, 3, 224, 224)# >>> model = EfficientNet.from_pretrained('efficientnet-b0')# >>> endpoints = model.extract_endpoints(inputs)# >>> print(endpoints['reduction_1'].shape)  # torch.Size([1, 16, 112, 112])# >>> print(endpoints['reduction_2'].shape)  # torch.Size([1, 24, 56, 56])# >>> print(endpoints['reduction_3'].shape)  # torch.Size([1, 40, 28, 28])# >>> print(endpoints['reduction_4'].shape)  # torch.Size([1, 112, 14, 14])# >>> print(endpoints['reduction_5'].shape)  # torch.Size([1, 1280, 7, 7])"""endpoints = dict()# Stemx = self._swish(self._bn0(self._conv_stem(inputs)))prev_x = x# Blocksfor idx, block in enumerate(self._blocks):drop_connect_rate = self._global_params.drop_connect_rateif drop_connect_rate:drop_connect_rate *= float(idx) / len(self._blocks)  # scale drop connect_ratex = block(x, drop_connect_rate=drop_connect_rate)if prev_x.size(2) > x.size(2):endpoints['reduction_{}'.format(len(endpoints) + 1)] = prev_xprev_x = x# Headx = self._swish(self._bn1(self._conv_head(x)))endpoints['reduction_{}'.format(len(endpoints) + 1)] = xreturn endpointsdef extract_features(self, inputs):"""use convolution layer to extract feature .Args:inputs (tensor): Input tensor.Returns:Output of the final convolutionlayer in the efficientnet model."""# Stemx = self._swish(self._bn0(self._conv_stem(inputs)))# Blocksfor idx, block in enumerate(self._blocks):drop_connect_rate = self._global_params.drop_connect_rateif drop_connect_rate:drop_connect_rate *= float(idx) / len(self._blocks)  # scale drop connect_ratex = block(x, drop_connect_rate=drop_connect_rate)# Headx = self._swish(self._bn1(self._conv_head(x)))return xdef gard_feature(self, inputs):# Stemx = self._swish(self._bn0(self._conv_stem(inputs)))# Blocksfor idx, block in enumerate(self._blocks):drop_connect_rate = self._global_params.drop_connect_rateif drop_connect_rate:drop_connect_rate *= float(idx) / (len(self._blocks) + len(self._blocks_branch_0))x = block(x, drop_connect_rate=drop_connect_rate)return xdef fc_share(self, inputs, fc_out, f_con, f_bn, blocks_n):# Blocksx = inputsfor idx, block in enumerate(blocks_n):drop_connect_rate = self._global_params.drop_connect_rateif drop_connect_rate:drop_connect_rate *= float(len(self._blocks) + idx - 1) / (len(self._blocks) + len(self._blocks_branch_0))x = block(x, drop_connect_rate=drop_connect_rate)# Headx = self._swish(f_bn(f_con(x)))# Pooling and final linear layerx = self._avg_pooling(x)if self._global_params.include_top:x = x.flatten(start_dim=1)x = self._dropout(x)x = fc_out(x)return xdef forward(self, inputs):"""EfficientNet's forward function.Calls extract_features to extract features, applies final linear layer, and returns logits.Args:inputs (tensor): Input tensor.Returns:Output of this model after processing."""# # Convolution layers# x = self.extract_features(inputs)# # Pooling and final linear layer# x = self._avg_pooling(x)# if self._global_params.include_top:#     x = x.flatten(start_dim=1)#     x = self._dropout(x)#     x = self._fc(x)feature = self.gard_feature(inputs)x0 = self.fc_share(feature, self._fc, self._conv_head, self._bn1, self._blocks_branch_0)return x0# return pred_label@classmethoddef from_name(cls, model_name, in_channels=3, **override_params):"""create an efficientnet model according to name.Args:model_name (str): Name for efficientnet.in_channels (int): Input data's channel number.override_params (other key word params):Params to override model's global_params.Optional key:'width_coefficient', 'depth_coefficient','image_size', 'dropout_rate','num_classes', 'batch_norm_momentum','batch_norm_epsilon', 'drop_connect_rate','depth_divisor', 'min_depth'Returns:An efficientnet model."""cls._check_model_name_is_valid(model_name)blocks_args, global_params = get_model_params(model_name, override_params)model = cls(blocks_args, global_params)model._change_in_channels(in_channels)return model@classmethoddef from_pretrained(cls, model_name, weights_path=None, advprop=False,in_channels=3, num_classes=1000, **override_params):"""create an efficientnet model according to name.Args:model_name (str): Name for efficientnet.weights_path (None or str):str: path to pretrained weights file on the local disk.None: use pretrained weights downloaded from the Internet.advprop (bool):Whether to load pretrained weightstrained with advprop (valid when weights_path is None).in_channels (int): Input data's channel number.num_classes (int):Number of categories for classification.It controls the output size for final linear layer.override_params (other key word params):Params to override model's global_params.Optional key:'width_coefficient', 'depth_coefficient','image_size', 'dropout_rate','batch_norm_momentum','batch_norm_epsilon', 'drop_connect_rate','depth_divisor', 'min_depth'Returns:A pretrained efficientnet model."""model = cls.from_name(model_name, num_classes=num_classes, **override_params)load_pretrained_weights(model, model_name, weights_path=weights_path, load_fc=(num_classes == 1000),advprop=advprop)model._change_in_channels(in_channels)return model@classmethoddef get_image_size(cls, model_name):"""Get the input image size for a given efficientnet model.Args:model_name (str): Name for efficientnet.Returns:Input image size (resolution)."""cls._check_model_name_is_valid(model_name)_, _, res, _ = efficientnet_params(model_name)return res@classmethoddef _check_model_name_is_valid(cls, model_name):"""Validates model name.Args:model_name (str): Name for efficientnet.Returns:bool: Is a valid name or not."""if model_name not in VALID_MODELS:raise ValueError('model_name should be one of: ' + ', '.join(VALID_MODELS))def _change_in_channels(self, in_channels):"""Adjust model's first convolution layer to in_channels, if in_channels not equals 3.Args:in_channels (int): Input data's channel number."""if in_channels != 3:Conv2d = get_same_padding_conv2d(image_size=self._global_params.image_size)out_channels = round_filters(32, self._global_params)self._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False)

3.demo_0.py

from __future__ import print_function, divisionimport torch
from PIL import Image
from torch.autograd import Variable
from torchvision import datasets, transforms
import os
from model_0 import EfficientNet  # EfficientNet的使用需要倒入的库
import time
import shutildata_transforms = transforms.Compose([transforms.Resize(size=(112, 112)),# transforms.CenterCrop(input_size),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])if __name__ == "__main__":os.environ["CUDA_VISIBLE_DEVICES"] = "0"net = EfficientNet.from_name('efficientnet-b0')# net._fc = torch.nn.Linear(net._fc.in_features, 2)net._fc = torch.nn.Linear(net._fc.in_features, 10)# net._fc1 = torch.nn.Linear(net._fc1.in_features, 2)# net._fc2 = torch.nn.Linear(net._fc2.in_features, 3)net_weight = './net_054.pth'# model = torch.load(net_weight)# net.load_state_dict(model)model = torch.load(net_weight,map_location=torch.device('cpu'))   ######666net.load_state_dict(model,strict=False)                         ######666for name, param in net.named_parameters():if param.requires_grad == True:print("\t", name)device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# device = torch.device("cpu")# net.to(device)net = net.to(device)net.eval()img_dir = "./test_img"# img_dir = "F:/attribute/face_attribute/mask/no_mask/hat"# img_dir = "F:/attribute/face_attribute_resize/glasses/coloured/glasses2"# img_dir = "F:/attribute/face_attribute_resize/hat/hat/hat3"save_dir = img_dir + "_err"if not os.path.exists(save_dir):os.makedirs(save_dir)img_list = os.listdir(img_dir)# data_label_list = ["no", "yes", "dd"]## attribute_list = "occlusion"data_label_list = ["0white", "1red/pink","2black","3others","4yellow","5grey","6blue","7green","8purple","9blown"]# data_label_list = ["0", "1","2","3","4","5","6","7","8","9"]attribute_list = "colour"for img_name in img_list:# jpg_path = os.path.join(img_dir, img_name)jpg_path = img_dir + '/' + img_nameimg = Image.open(jpg_path)inputs = data_transforms(img)inputs.unsqueeze_(0)# use GPUinputs = inputs.to(device)# forwardwith torch.no_grad():outputs = net(inputs)# print(outputs)_, preds = torch.max(outputs.data, 1)# print(preds)pr_id = preds.item()print("--image:" + img_name, end="   ")print(attribute_list + ":" + str(pr_id), data_label_list[pr_id])# print(attribute_list + ":" + data_label_list[pr_id], outputs)# if pr_id != 1:#     print(img_name, pr_id)#     shutil.move(jpg_path, os.path.join(save_dir, img_name))# shutil.copy(jpg_path, os.path.join(save_dir, img_name))# # img_txt = "F:/attribute/face_attribute_resize/glasses/glasses_val_opt_test.txt"# # img_txt = "F:/attribute/face_attribute_resize/glasses/glasses_val_test.txt"# img_txt = "F:/attribute/face_attribute/generate_mask.txt"# with open(img_txt, 'r') as b_r:#     for jpg_data in b_r.readlines():  # 逐行读取数据#         box_ = jpg_data.strip()#         box_list = box_.split(" ")#         jpg_path = box_list[0]##         img = Image.open(jpg_path)#         inputs = data_transforms(img)#         inputs.unsqueeze_(0)##         # use GPU#         inputs = inputs.to(device)##         # forward#         outputs = net(inputs)#         _, preds = torch.max(outputs.data, 1)#         pr_id = preds.item()##         # print("--image:" + img_name, end="   ")#         # print(attribute_list + ":" + data_label_list[pr_id], outputs)#         if pr_id != int(box_list[1]):#             print(jpg_path, int(box_list[1]), "pre",  pr_id)#             # shutil.copy(jpg_path, os.path.join(save_dir, img_name))#             print(outputs.data)

efficient分类0第一个分支训练相关推荐

  1. 【五一创作】使用Resnet残差网络对图像进行分类(猫十二分类,模型定义、训练、保存、预测)(二)

    使用Resnet残差网络对图像进行分类 (猫十二分类,模型定义.训练.保存.预测)(二) 目录 (6).数据集划分 (7).训练集增强 (8).装载数据集 (9).初始化模型 (10).模型训练 (1 ...

  2. linux手写数字识别,OpenCV 3.0中的SVM训练 mnist 手写字体识别

    前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...

  3. 【五一创作】使用Resnet残差网络对图像进行分类(猫十二分类,模型定义、训练、保存、预测)(一)

    使用Resnet残差网络对图像进行分类 (猫十二分类,模型定义.训练.保存.预测)(一) 目录 一.项目简介 二.环境说明 1.安装库 2.导入需要的库 三.分类过程 (1).解压数据集 (2).相关 ...

  4. 训练、标注成本节省90%!华为云自动化AI开发平台ModelArts 3.0发布,从训练数据到模型落地一站式打通...

    鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 今年的华为,着实遭遇了不小的困难. 尤其是供应链,包括芯片方面的打击,让华为轮值董事长郭平坦承"的确对华为的生产.运营带来了很大困 ...

  5. 华为云平台使用手册_训练、标注成本节省90%!华为云自动化AI开发平台ModelArts 3.0发布,从训练数据到模型落地一站式打通...

    鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 今年的华为,着实遭遇了不小的困难. 尤其是供应链,包括芯片方面的打击,让华为轮值董事长郭平坦承"的确对华为的生产.运营带来了很大困 ...

  6. [Pytorch系列-61]:循环神经网络 - 中文新闻文本分类详解-3-CNN网络训练与评估代码详解

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  7. 估算带卷积核二分类0,3的网络的收敛时间和迭代次数

    制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...

  8. 天池零基础入门NLP竞赛实战:Task4-基于深度学习的文本分类3-基于Bert预训练和微调进行文本分类

    Task4-基于深度学习的文本分类3-基于Bert预训练和微调进行文本分类 因为天池这个比赛的数据集是脱敏的,无法利用其它已经预训练好的模型,所以需要针对这个数据集自己从头预训练一个模型. 我们利用H ...

  9. 小偷能获取的最大金额 环形小区 [分类讨论第一家是否能偷]

    题目 有一个环形的小区,每家有一定的金额,使用nums[]数组表示,小偷进了小区进行偷取. 小偷偷了一家后,与这家相邻的家就不能再偷了,请问小偷能偷取的最大金额是多少? 思路 若小区只是一排,那题目就 ...

最新文章

  1. 轻松学习Ionic (二) 为Android项目集成Crosswalk(更新官方命令行工具)
  2. Android PullToRefresh (ListView GridView 下拉刷新) 使用详解
  3. strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove
  4. Linux chmod给文件加执行X权限
  5. *【ZOJ - 3703】Happy Programming Contest(带优先级的01背包)
  6. 让你的产品更懂世界:如何提升场景文本识别中的语言模型
  7. Android 应用开发---App 移动应用中九种导航设计总结及其优缺点分
  8. httpservletrequest 设置请求头_大部分程序员不知道的 Servelt3 异步请求,原来这么简单?
  9. linux mint关于web开发的相关环境配置
  10. 普通html优化处理,iOS 数据优化之处理HTML字符串
  11. [安卓] 2、使用2中方法做按钮监听和图片按钮使用
  12. 如何在Eclipse中从XSD生成XML
  13. NekoHTML学习笔记
  14. 人人,金山西山居,腾讯互娱,微信,网易游戏offer及面经(转)
  15. python实现爬虫收集图片 花瓣网_Python爬虫日记七:批量抓取花瓣网高清美图并保存...
  16. Swift高仿喜马拉雅APP之一Charles抓包、图片资源获取等
  17. 房屋户型图设计工具Room Arranger for Mac
  18. vue lic在element-ui中使用阿里巴巴矢量图标库iconfont图标
  19. 错过了淘宝、拼多多,今年的电商风口抖音小店无货源你能抓住吗?
  20. 前序、中序、后序遍历

热门文章

  1. 计算机网络安全防护体系研究
  2. NS2中802.11代码深入理解—packet传输的流程 (转帖)
  3. vs2008\drivers\opengl_2.h.c_opengl基本功能介绍+示例
  4. Ubuntu使用远程桌面
  5. [翻译]震荡波蠕虫技术分析(振荡波蠕虫技术分析)
  6. 培训沙龙准备事项-看板记录
  7. 牛逼!硬核图解 Tomcat 整体架构
  8. 高性能 Java 应用层网关设计实践
  9. 大型电商网站详情页是如何支撑亿级流量访问的?
  10. Angular 富文本编辑之路的探索