基于 paddlepaddle 的多标签分类实验

最近自己基于paddlepaddle做了一系列实验和工作,这里跟大家分享一下一个简单的多标签分类实验,希望对大家有帮助。

这里仿照各个网盘APP、相册APP的智能分类功能做了一个简易版的智能相册分类实验。与单标签的图像分类任务不同,由于一张相片可能属于多个目标类别,所以在进行图像分类时,需要将相片所属的所有类别找出,这一类图像分类任务也称为多标签分类任务。



图1 智能相册分类示意图

接下来就进入到具体的实验环节,首先导入所有环境:

# coding=utf-8
# 导入环境
import os
import math
import random
import matplotlib.pyplot as plt
# 在notebook中使用matplotlib.pyplot绘图时,需要添加该命令进行显示
%matplotlib inline
import numpy as np
from PIL import Image
import cv2
from sklearn.metrics import hamming_loss, multilabel_confusion_matrix
from sklearn.preprocessing import binarize
from collections import OrderedDict
import paddle
from paddle.io import Dataset
import paddle.nn as nn
from paddle.nn import Conv2D, MaxPool2D, Linear, Dropout, BatchNorm, AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform
import paddle.nn.functional as F
from paddle.optimizer.lr import CosineAnnealingDecay
from paddle.regularizer import L2Decay
from paddle import ParamAttr

一、数据准备

1.1 数据准备

这里我在网上收集了包含20个常见的相片类别的图片数据并进行了标注,大家可以自己按照下面的格式整理自己的数据。其中,训练集共16706张图片,验证集共2168张图片,测试集共2117张图片。



图1 智能相册数据集示意图

20个类别包括:Vehicle, Sky, Food, Person, Building, Animal, Cartoons, Certificate, Electronic, Screenshot, BankCard, Mountain, Sea, Bill, Selfie, Night, Aircraft, Flower, Child, Ship

图像文件名图像标注信息
028012.png1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

使用PIL库,随机选取一张图片可视化,观察该数据集的图片数据。

img = Image.open('/home/aistudio/work/dataset/album/img/028012.png')
img = np.array(img)
plt.figure(figsize=(10, 10))
plt.imshow(img)

在这里插入图片描述

1.2 数据预处理

图像分类网络对输入图片的格式、大小有一定的要求,数据灌入模型前,需要对数据进行预处理操作,使图片满足网络训练以及预测的需要。另外,为了扩大训练数据集、抑制过拟合,提升模型的泛化能力,实验中还使用了几种基础的数据增广方法。

本实验的数据预处理共包括如下方法:

  • 图像解码:将图像转为Numpy格式;
  • 调整图片大小:将原图片中短边尺寸统一缩放到256;
  • 随机裁剪图像:从原始图像和注释图像中随机裁剪一个子图像。 如果目标裁切尺寸大于原始图像,则将添加右下角的填充。裁剪尺寸为[512, 512];
  • 随机翻转图像:以一定的概率水平翻转图像。这里使用0.5的概率进行图像翻转;
  • 图像裁剪:将图像的长宽统一裁剪为224×224,确保模型读入的图片数据大小统一;
  • 归一化(normalization):通过规范化手段,把神经网络每层中任意神经元的输入值分布改变成均值为0,方差为1的标准正太分布,使得最优解的寻优过程明显会变得平缓,训练过程更容易收敛;
  • 通道变换:图像的数据格式为[H, W, C](即高度、宽度和通道数),而神经网络使用的训练数据的格式为[C, H, W],因此需要对图像数据重新排列,例如[224, 224, 3]变为[3, 224, 224]。

下面分别介绍数据预处理方法的代码实现。

# 定义decode_image函数,将图片转为Numpy格式
def decode_image(img, to_rgb=True):data = np.frombuffer(img, dtype='uint8')img = cv2.imdecode(data, 1)if to_rgb:assert img.shape[2] == 3, 'invalid shape of image[%s]' % (img.shape)img = img[:, :, ::-1]return img
# 定义rand_crop_image函数,对图片进行随机裁剪
def rand_crop_image(img, size, scale=None, ratio=None, interpolation=-1):interpolation = interpolation if interpolation >= 0 else Noneif type(size) is int:size = (size, size)  # (h, w)else:size = sizescale = [0.08, 1.0] if scale is None else scaleratio = [3. / 4., 4. / 3.] if ratio is None else ratio# 在ratio范围内随机生成一个值作为宽高比aspect_ratio = math.sqrt(random.uniform(*ratio))w = 1. * aspect_ratioh = 1. / aspect_ratioimg_h, img_w = img.shape[:2]bound = min((float(img_w) / img_h) / (w**2),(float(img_h) / img_w) / (h**2))scale_max = min(scale[1], bound)scale_min = min(scale[0], bound)target_area = img_w * img_h * random.uniform(scale_min, scale_max)target_size = math.sqrt(target_area)# 得到裁剪框的宽和高w = int(target_size * w)h = int(target_size * h)# 随机生成裁剪框的左上角坐标i = random.randint(0, img_w - w)j = random.randint(0, img_h - h)# 裁剪该区域的图像作为新图片img = img[j:j + h, i:i + w, :]# 将裁剪后的图片缩放到指定大小if interpolation is None:return cv2.resize(img, size)else:return cv2.resize(img, size, interpolation=interpolation)
# 定义rand_flip_image函数,对图片进行随机翻转,其中通过flip_code指定翻转类型
# flip_code=1时为水平翻转;flip_code=0时为垂直翻转;flip_code=-1时同时进行水平和垂直翻转
def rand_flip_image(img, flip_code=1):assert flip_code in [-1, 0, 1], "flip_code should be a value in [-1, 0, 1]"# 使用opencv随机翻转图片if random.randint(0, 1) == 1:return cv2.flip(img, flip_code)else:return img
# 定义resize_image函数,对图片大小进行调整
def resize_image(img, size=None, resize_short=None, interpolation=-1):interpolation = interpolation if interpolation >= 0 else Noneif resize_short is not None and resize_short > 0:resize_short = resize_shortw = Noneh = Noneelif size is not None:resize_short = Nonew = size if type(size) is int else size[0]h = size if type(size) is int else size[1]else:raise ValueError("invalid params for ReisizeImage for '\'both 'size' and 'resize_short' are None")img_h, img_w = img.shape[:2]if resize_short is not None:percent = float(resize_short) / min(img_w, img_h)w = int(round(img_w * percent))h = int(round(img_h * percent))else:w = wh = hif interpolation is None:return cv2.resize(img, (w, h))else:return cv2.resize(img, (w, h), interpolation=interpolation)
# 定义crop_image函数,对图片进行裁剪
def crop_image(img, size):if type(size) is int:size = (size, size)else:size = size  # (h, w)w, h = sizeimg_h, img_w = img.shape[:2]w_start = (img_w - w) // 2h_start = (img_h - h) // 2w_end = w_start + wh_end = h_start + hreturn img[h_start:h_end, w_start:w_end, :]
# 定义normalize_image函数,对图片进行归一化
def normalize_image(img, scale=None, mean=None, std=None, order=''):if isinstance(scale, str):scale = eval(scale)scale = np.float32(scale if scale is not None else 1.0 / 255.0)mean = mean if mean is not None else [0.485, 0.456, 0.406]std = std if std is not None else [0.229, 0.224, 0.225]shape = (3, 1, 1) if order == 'chw' else (1, 1, 3)mean = np.array(mean).reshape(shape).astype('float32')std = np.array(std).reshape(shape).astype('float32')if isinstance(img, Image.Image):img = np.array(img)assert isinstance(img, np.ndarray), "invalid input 'img' in NormalizeImage"# 对图片进行归一化return (img.astype('float32') * scale - mean) / std
# 定义to_CHW_image函数,对图片进行通道变换,将原通道为‘hwc’的图像转为‘chw‘
def to_CHW_image(img):if isinstance(img, Image.Image):img = np.array(img)# 对图片进行通道变换return img.transpose((2, 0, 1))
# 图像预处理方法汇总
def transform(data, mode='train'):# 图像解码data = decode_image(data)if mode == 'train':# 随机裁剪data = rand_crop_image(data, 224)# 随机翻转data = rand_flip_image(data)else:# 图像缩放data = resize_image(data, resize_short=256)# 图像裁剪data = crop_image(data, size=224)# 标准化data = normalize_image(data, scale=1./255., mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])# 通道变换data = to_CHW_image(data)return data

1.3 批量数据读取

上面的代码仅展示了读取一张图片和预处理的方法,但在真实场景的模型训练与评估过程中,通常会使用批量数据读取和预处理的方式。

# 随即打乱数据顺序
def shuffle_lines(full_lines, seed=None):if seed is not None:np.random.RandomState(seed).shuffle(full_lines)else:np.random.shuffle(full_lines)return full_lines# 读取数据,如果是训练数据,随即打乱数据顺序
def get_file_list(file_list, mode='train'):with open(file_list) as flist:full_lines = [line.strip() for line in flist]if mode == "train":full_lines = shuffle_lines(full_lines)return full_lines
# 定义数据读取器
class AlbumDataset(Dataset):def __init__(self, data_dir, file_list, mode='train'):self.mode = modeself.full_lines = get_file_list(file_list, mode=self.mode)self.delimiter = '\t'self.num_samples = len(self.full_lines)self.data_dir = data_dirreturndef __getitem__(self, idx):try:line = self.full_lines[idx]img_path, label_str = line.split(self.delimiter)img_path = os.path.join(self.data_dir, img_path)with open(img_path, 'rb') as f:img = f.read()labels = label_str.split(',')labels = [int(i) for i in labels]transformed_img = transform(img, self.mode)return (transformed_img, np.array(labels).astype("float32"))except Exception as e:return self.__getitem__(random.randint(0, len(self)))def __len__(self):return self.num_samples

二、模型定义

这里使用 ResNet50_vd 进行多标签分类。

class ConvBNLayer(nn.Layer):def __init__(self,num_channels,num_filters,filter_size,stride=1,groups=1,is_vd_mode=False,act=None,lr_mult=1.0):super(ConvBNLayer, self).__init__()self.is_vd_mode = is_vd_modeself._pool2d_avg = AvgPool2D(kernel_size=2, stride=2, padding=0, ceil_mode=True)self._conv = Conv2D(in_channels=num_channels,out_channels=num_filters,kernel_size=filter_size,stride=stride,padding=(filter_size - 1) // 2,groups=groups,weight_attr=ParamAttr(learning_rate=lr_mult),bias_attr=False)self._batch_norm = BatchNorm(num_filters,act=act,param_attr=ParamAttr(learning_rate=lr_mult),bias_attr=ParamAttr(learning_rate=lr_mult))def forward(self, inputs):if self.is_vd_mode:inputs = self._pool2d_avg(inputs)y = self._conv(inputs)y = self._batch_norm(y)return yclass BottleneckBlock(nn.Layer):def __init__(self,num_channels,num_filters,stride,shortcut=True,if_first=False,lr_mult=1.0):super(BottleneckBlock, self).__init__()self.conv0 = ConvBNLayer(num_channels=num_channels,num_filters=num_filters,filter_size=1,act='relu',lr_mult=lr_mult)self.conv1 = ConvBNLayer(num_channels=num_filters,num_filters=num_filters,filter_size=3,stride=stride,act='relu',lr_mult=lr_mult)self.conv2 = ConvBNLayer(num_channels=num_filters,num_filters=num_filters * 4,filter_size=1,act=None,lr_mult=lr_mult)if not shortcut:self.short = ConvBNLayer(num_channels=num_channels,num_filters=num_filters * 4,filter_size=1,stride=1,is_vd_mode=False if if_first else True,lr_mult=lr_mult)self.shortcut = shortcutdef forward(self, inputs):y = self.conv0(inputs)conv1 = self.conv1(y)conv2 = self.conv2(conv1)if self.shortcut:short = inputselse:short = self.short(inputs)y = paddle.add(x=short, y=conv2)y = F.relu(y)return yclass BasicBlock(nn.Layer):def __init__(self,num_channels,num_filters,stride,shortcut=True,if_first=False,lr_mult=1.0):super(BasicBlock, self).__init__()self.stride = strideself.conv0 = ConvBNLayer(num_channels=num_channels,num_filters=num_filters,filter_size=3,stride=stride,act='relu',lr_mult=lr_mult)self.conv1 = ConvBNLayer(num_channels=num_filters,num_filters=num_filters,filter_size=3,act=None,lr_mult=lr_mult)if not shortcut:self.short = ConvBNLayer(num_channels=num_channels,num_filters=num_filters,filter_size=1,stride=1,is_vd_mode=False if if_first else True,lr_mult=lr_mult)self.shortcut = shortcutdef forward(self, inputs):y = self.conv0(inputs)conv1 = self.conv1(y)if self.shortcut:short = inputselse:short = self.short(inputs)y = paddle.add(x=short, y=conv1)y = F.relu(y)return yclass ResNet_vd(nn.Layer):def __init__(self,class_dim=20,lr_mult_list=[1.0, 1.0, 1.0, 1.0, 1.0]):super(ResNet_vd, self).__init__()self.lr_mult_list = lr_mult_listdepth = [3, 4, 6, 3]num_channels = [64, 256, 512, 1024]num_filters = [64, 128, 256, 512]self.conv1_1 = ConvBNLayer(num_channels=3,num_filters=32,filter_size=3,stride=2,act='relu',lr_mult=self.lr_mult_list[0])self.conv1_2 = ConvBNLayer(num_channels=32,num_filters=32,filter_size=3,stride=1,act='relu',lr_mult=self.lr_mult_list[0])self.conv1_3 = ConvBNLayer(num_channels=32,num_filters=64,filter_size=3,stride=1,act='relu',lr_mult=self.lr_mult_list[0])self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)self.block_list = []for block in range(len(depth)):shortcut = Falsefor i in range(depth[block]):bottleneck_block = self.add_sublayer('bb_%d_%d' % (block, i),BottleneckBlock(num_channels=num_channels[block]if i == 0 else num_filters[block] * 4,num_filters=num_filters[block],stride=2 if i == 0 and block != 0 else 1,shortcut=shortcut,if_first=block == i == 0,lr_mult=self.lr_mult_list[block + 1]))self.block_list.append(bottleneck_block)shortcut = Trueself.pool2d_avg = AdaptiveAvgPool2D(1)self.pool2d_avg_channels = num_channels[-1] * 2stdv = 1.0 / math.sqrt(self.pool2d_avg_channels * 1.0)self.out = Linear(self.pool2d_avg_channels,class_dim,weight_attr=ParamAttr(initializer=Uniform(-stdv, stdv)),bias_attr=ParamAttr())def forward(self, inputs):y = self.conv1_1(inputs)y = self.conv1_2(y)y = self.conv1_3(y)y = self.pool2d_max(y)for block in self.block_list:y = block(y)y = self.pool2d_avg(y)y = paddle.reshape(y, shape=[-1, self.pool2d_avg_channels])y = self.out(y)return y
model = ResNet_vd()

三、损失函数定义

class Loss(object):def __init__(self, class_dim=1000, epsilon=None):assert class_dim > 1, "class_dim=%d is not larger than 1" % (class_dim)self._class_dim = class_dimif epsilon is not None and epsilon >= 0.0 and epsilon <= 1.0:self._epsilon = epsilonself._label_smoothing = Trueelse:self._epsilon = Noneself._label_smoothing = Falsedef _labelsmoothing(self, target):if target.shape[-1] != self._class_dim:one_hot_target = F.one_hot(target, self._class_dim)else:one_hot_target = targetsoft_target = F.label_smooth(one_hot_target, epsilon=self._epsilon)soft_target = paddle.reshape(soft_target, shape=[-1, self._class_dim])return soft_targetdef _binary_crossentropy(self, input, target):if self._label_smoothing:target = self._labelsmoothing(target)cost = F.binary_cross_entropy_with_logits(logit=input, label=target)else:cost = F.binary_cross_entropy_with_logits(logit=input, label=target)avg_cost = paddle.mean(cost)return avg_costdef __call__(self, input, target):passclass MultiLabelLoss(Loss):def __init__(self, class_dim=20, epsilon=None):super(MultiLabelLoss, self).__init__(class_dim, epsilon)def __call__(self, input, target):cost = self._binary_crossentropy(input, target)return cost
multi_label_loss = MultiLabelLoss(epsilon=0.1)

四、模型训练

4.1 训练配置

(1)加载模型参数并微调。

通过下边的命令可以下载所需的预训练模型。

!wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_vd_pretrained.pdparams
# 也可以使用paddle提供的带蒸馏的模型
!wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_vd_ssld_pretrained.pdparams

使用预训练好的模型参数进行模型微调。

# 使用已有的预训练模型来初始化网络
def init_model(net, pretrained_model):if not (os.path.isdir(pretrained_model) or os.path.exists(pretrained_model + '.pdparams')):raise ValueError("Model pretrain path {} does not ""exists.".format(pretrained_model))param_state_dict = paddle.load(pretrained_model + ".pdparams")net.set_dict(param_state_dict)return
# 使用预训练权重初始化模型
init_model(model, 'ResNet50_vd_pretrained')

(2) 加载训练集和测试集数据

batch_size = 64DATADIR = 'album/img'
TRAIN_FILE_LIST = 'album/onehot_train.txt'
VAL_FILE_LIST = 'album/onehot_valid.txt'# 创建数据读取类
train_dataset = AlbumDataset(DATADIR, TRAIN_FILE_LIST, mode='train')
val_dataset = AlbumDataset(DATADIR, VAL_FILE_LIST, mode='valid')
# 组建batch
train_loader = paddle.io.DataLoader(train_dataset, batch_size=batch_size, num_workers=0, drop_last=True)
valid_loader = paddle.io.DataLoader(val_dataset, batch_size=batch_size, num_workers=0)

(3) 定义优化器

# 训练总轮数
epoch_num = 10
# 训练集样本总数
total_images = len(train_dataset)
# 每轮的batch数量
step_each_epoch = total_images // batch_size
# 学习率
lr = 0.07
# 使用 cosine annealing 的策略来动态调整学习率,初始学习率设置为0.001
learning_rate = CosineAnnealingDecay(lr, step_each_epoch * epoch_num)
# 使用Momentum优化器
optimizer = paddle.optimizer.Momentum(learning_rate=learning_rate,momentum=0.9,parameters=model.parameters(),weight_decay=L2Decay(0.000070))

(4) 定义评估指标
对于多标签分类问题,可以使用汉明距离以及top-1准确率来评估模型精度。

def accuracy_score(output, target):mcm = multilabel_confusion_matrix(target, output)tns = mcm[:, 0, 0]fns = mcm[:, 1, 0]tps = mcm[:, 1, 1]fps = mcm[:, 0, 1]accuracy = (sum(tps) + sum(tns)) / (sum(tps) + sum(tns) + sum(fns) + sum(fps))return accuracydef create_metric(out, label):fetchs = OrderedDict()metric_names = set()out = F.sigmoid(out)preds = binarize(out.numpy(), threshold=0.5)targets = label.numpy()ham_dist = paddle.to_tensor(hamming_loss(preds, targets))accuracy = paddle.to_tensor(accuracy_score(preds, targets))ham_dist_name = "hamming_distance"accuracy_name = "multilabel_accuracy"metric_names.add(ham_dist_name)metric_names.add(accuracy_name)fetchs[accuracy_name] = accuracyfetchs[ham_dist_name] = ham_distreturn fetchs

4.2 模型训练

# 定义训练过程
# 调用GPU进行运算
use_gpu = True
paddle.set_device('gpu:0') if use_gpu else paddle.set_device('cpu')print('start training ... ')
# 将模型切换到训练模式
model.train()# 训练模型 
for epoch in range(epoch_num):for batch_id, data in enumerate(train_loader()):x_data, y_data = dataimg = paddle.to_tensor(x_data)label = paddle.to_tensor(y_data.numpy().astype('float32').reshape(-1, 20))# 运行模型前向计算,得到预测值logits = model(img)# 计算损失函数loss = multi_label_loss(logits, label)if batch_id % 20 == 0:print("epoch: {}, batch_id: {}, loss is: {}".format(epoch, batch_id, loss.numpy()))# 反向传播,更新权重,清除梯度loss.backward()optimizer.step()optimizer.clear_grad()lr_value = optimizer._global_learning_rate().numpy()[0]learning_rate.step()# 每个epoch训练完成后,进行模型评估# 将模型切换到评估模式model.eval()accuracies = []losses = []for batch_id, data in enumerate(valid_loader()):x_data, y_data = dataimg = paddle.to_tensor(x_data)label = paddle.to_tensor(y_data.numpy().astype('float32').reshape(-1, 20))# 运行模型前向计算,得到预测值logits = model(img)# 计算损失函数loss = multi_label_loss(logits, label)metric = create_metric(logits, label)losses.append(loss.numpy())print("[validation] loss: {} hamming_distance: {} multilabel_accuracy: {}".format(loss.numpy(), metric['hamming_distance'].numpy(), metric['multilabel_accuracy'].numpy()))# 完成评估后,模型切换回训练模式继续训练model.train()
start training ... 
epoch: 0, batch_id: 0, loss is: [0.7192106]
epoch: 0, batch_id: 20, loss is: [0.24829534]
epoch: 0, batch_id: 40, loss is: [0.20408101]
epoch: 0, batch_id: 60, loss is: [0.19108313]
epoch: 0, batch_id: 80, loss is: [0.16176441]
epoch: 0, batch_id: 100, loss is: [0.14179903]
epoch: 0, batch_id: 120, loss is: [0.1749525]
epoch: 0, batch_id: 140, loss is: [0.13995571]
epoch: 0, batch_id: 160, loss is: [0.12687533]
epoch: 0, batch_id: 180, loss is: [0.14006634]
epoch: 0, batch_id: 200, loss is: [0.12756442]
epoch: 0, batch_id: 220, loss is: [0.14656875]
epoch: 0, batch_id: 240, loss is: [0.15922141]
epoch: 0, batch_id: 260, loss is: [0.11737509]
[validation] loss: [0.14424866] hamming_distance: [0.03928572] multilabel_accuracy: [0.9607143]
epoch: 1, batch_id: 0, loss is: [0.11617111]
epoch: 1, batch_id: 20, loss is: [0.12141372]
epoch: 1, batch_id: 40, loss is: [0.1454503]
epoch: 1, batch_id: 60, loss is: [0.147155]
epoch: 1, batch_id: 80, loss is: [0.1385282]
epoch: 1, batch_id: 100, loss is: [0.12295955]
epoch: 1, batch_id: 120, loss is: [0.14739689]
epoch: 1, batch_id: 140, loss is: [0.13650046]
epoch: 1, batch_id: 160, loss is: [0.11932946]
epoch: 1, batch_id: 180, loss is: [0.12400924]
epoch: 1, batch_id: 200, loss is: [0.10366694]
epoch: 1, batch_id: 220, loss is: [0.13126066]
epoch: 1, batch_id: 240, loss is: [0.1284022]
epoch: 1, batch_id: 260, loss is: [0.11365855]
[validation] loss: [0.13109535] hamming_distance: [0.03571429] multilabel_accuracy: [0.96428573]
epoch: 2, batch_id: 0, loss is: [0.111964]
epoch: 2, batch_id: 20, loss is: [0.11162999]
epoch: 2, batch_id: 40, loss is: [0.12943123]
epoch: 2, batch_id: 60, loss is: [0.1452783]
epoch: 2, batch_id: 80, loss is: [0.12580377]
epoch: 2, batch_id: 100, loss is: [0.11047614]
epoch: 2, batch_id: 120, loss is: [0.13516384]
epoch: 2, batch_id: 140, loss is: [0.11171752]
epoch: 2, batch_id: 160, loss is: [0.12167928]
epoch: 2, batch_id: 180, loss is: [0.12258511]
epoch: 2, batch_id: 200, loss is: [0.09977267]
epoch: 2, batch_id: 220, loss is: [0.11836746]
epoch: 2, batch_id: 240, loss is: [0.13338491]
epoch: 2, batch_id: 260, loss is: [0.11356007]
[validation] loss: [0.12784383] hamming_distance: [0.03571429] multilabel_accuracy: [0.96428573]
epoch: 3, batch_id: 0, loss is: [0.12162372]
epoch: 3, batch_id: 20, loss is: [0.11657746]
epoch: 3, batch_id: 40, loss is: [0.12935811]
epoch: 3, batch_id: 60, loss is: [0.13975267]
epoch: 3, batch_id: 80, loss is: [0.13158603]
epoch: 3, batch_id: 100, loss is: [0.1125318]
epoch: 3, batch_id: 120, loss is: [0.12533425]
epoch: 3, batch_id: 140, loss is: [0.10992051]
epoch: 3, batch_id: 160, loss is: [0.1161565]
epoch: 3, batch_id: 180, loss is: [0.10817074]
epoch: 3, batch_id: 200, loss is: [0.10297374]
epoch: 3, batch_id: 220, loss is: [0.12469847]
epoch: 3, batch_id: 240, loss is: [0.11957179]
epoch: 3, batch_id: 260, loss is: [0.11390025]
[validation] loss: [0.12930362] hamming_distance: [0.03214286] multilabel_accuracy: [0.9678571]
epoch: 4, batch_id: 0, loss is: [0.11296538]
epoch: 4, batch_id: 20, loss is: [0.10746139]
epoch: 4, batch_id: 40, loss is: [0.12223774]
epoch: 4, batch_id: 60, loss is: [0.12957215]
epoch: 4, batch_id: 80, loss is: [0.12120795]
epoch: 4, batch_id: 100, loss is: [0.10759816]
epoch: 4, batch_id: 120, loss is: [0.10706748]
epoch: 4, batch_id: 140, loss is: [0.10441463]
epoch: 4, batch_id: 160, loss is: [0.12018487]
epoch: 4, batch_id: 180, loss is: [0.1068358]
epoch: 4, batch_id: 200, loss is: [0.09596813]
epoch: 4, batch_id: 220, loss is: [0.10846743]
epoch: 4, batch_id: 240, loss is: [0.11947981]
epoch: 4, batch_id: 260, loss is: [0.10540524]
[validation] loss: [0.12597199] hamming_distance: [0.03482143] multilabel_accuracy: [0.96517855]
epoch: 5, batch_id: 0, loss is: [0.1053249]
epoch: 5, batch_id: 20, loss is: [0.09972227]
epoch: 5, batch_id: 40, loss is: [0.1135644]
epoch: 5, batch_id: 60, loss is: [0.12807007]
epoch: 5, batch_id: 80, loss is: [0.11112165]
epoch: 5, batch_id: 100, loss is: [0.10442357]
epoch: 5, batch_id: 120, loss is: [0.10723296]
epoch: 5, batch_id: 140, loss is: [0.09574118]
epoch: 5, batch_id: 160, loss is: [0.10538233]
epoch: 5, batch_id: 180, loss is: [0.09416173]
epoch: 5, batch_id: 200, loss is: [0.09502217]
epoch: 5, batch_id: 220, loss is: [0.11428049]
epoch: 5, batch_id: 240, loss is: [0.10403752]
epoch: 5, batch_id: 260, loss is: [0.1097267]
[validation] loss: [0.12121929] hamming_distance: [0.03303571] multilabel_accuracy: [0.9669643]
epoch: 6, batch_id: 0, loss is: [0.10973155]
epoch: 6, batch_id: 40, loss is: [0.10586993]
epoch: 6, batch_id: 60, loss is: [0.12340867]
epoch: 6, batch_id: 80, loss is: [0.10952523]
epoch: 6, batch_id: 100, loss is: [0.1043926]
epoch: 6, batch_id: 120, loss is: [0.10537393]
epoch: 6, batch_id: 140, loss is: [0.10136109]
epoch: 6, batch_id: 160, loss is: [0.10438278]
epoch: 6, batch_id: 180, loss is: [0.10190848]
epoch: 6, batch_id: 200, loss is: [0.08585998]
epoch: 6, batch_id: 220, loss is: [0.09801853]
epoch: 6, batch_id: 240, loss is: [0.1061273]
epoch: 6, batch_id: 260, loss is: [0.09472618]
[validation] loss: [0.11974805] hamming_distance: [0.02589286] multilabel_accuracy: [0.97410715]
epoch: 7, batch_id: 0, loss is: [0.10242014]
epoch: 7, batch_id: 20, loss is: [0.09664041]
epoch: 7, batch_id: 40, loss is: [0.11024401]
epoch: 7, batch_id: 60, loss is: [0.11703146]
epoch: 7, batch_id: 80, loss is: [0.10296616]
epoch: 7, batch_id: 100, loss is: [0.09473763]
epoch: 7, batch_id: 120, loss is: [0.11214614]
epoch: 7, batch_id: 140, loss is: [0.08823032]
epoch: 7, batch_id: 160, loss is: [0.10222819]
epoch: 7, batch_id: 180, loss is: [0.09796342]
epoch: 7, batch_id: 200, loss is: [0.09887124]
epoch: 7, batch_id: 220, loss is: [0.09719805]
epoch: 7, batch_id: 240, loss is: [0.09651403]
epoch: 7, batch_id: 260, loss is: [0.09195333]
[validation] loss: [0.11878593] hamming_distance: [0.02946429] multilabel_accuracy: [0.9705357]
epoch: 8, batch_id: 0, loss is: [0.09954296]
epoch: 8, batch_id: 20, loss is: [0.09171855]
epoch: 8, batch_id: 40, loss is: [0.09925689]
epoch: 8, batch_id: 60, loss is: [0.11354373]
epoch: 8, batch_id: 80, loss is: [0.10011038]
epoch: 8, batch_id: 100, loss is: [0.09674358]
epoch: 8, batch_id: 120, loss is: [0.10774907]
epoch: 8, batch_id: 140, loss is: [0.08995349]
epoch: 8, batch_id: 160, loss is: [0.10529572]
epoch: 8, batch_id: 180, loss is: [0.10399586]
epoch: 8, batch_id: 200, loss is: [0.08143127]
epoch: 8, batch_id: 220, loss is: [0.0980135]
epoch: 8, batch_id: 240, loss is: [0.1025499]
epoch: 8, batch_id: 260, loss is: [0.08864929]
[validation] loss: [0.11925511] hamming_distance: [0.02946429] multilabel_accuracy: [0.9705357]
epoch: 9, batch_id: 0, loss is: [0.10794401]
epoch: 9, batch_id: 20, loss is: [0.09459089]
epoch: 9, batch_id: 40, loss is: [0.10164409]
epoch: 9, batch_id: 60, loss is: [0.11481477]
epoch: 9, batch_id: 80, loss is: [0.0996296]
epoch: 9, batch_id: 100, loss is: [0.09542734]
epoch: 9, batch_id: 120, loss is: [0.10714017]
epoch: 9, batch_id: 140, loss is: [0.09121912]
epoch: 9, batch_id: 160, loss is: [0.10141321]
epoch: 9, batch_id: 180, loss is: [0.09824826]
epoch: 9, batch_id: 200, loss is: [0.08421607]
epoch: 9, batch_id: 220, loss is: [0.0978547]
epoch: 9, batch_id: 240, loss is: [0.10450318]
epoch: 9, batch_id: 260, loss is: [0.08492423]
[validation] loss: [0.119349] hamming_distance: [0.03035714] multilabel_accuracy: [0.9696429]

五、模型保存

# 保存模型参数
paddle.save(model.state_dict(), 'model.pdparams')

六、模型评估

use_gpu = True
paddle.set_device('gpu:0') if use_gpu else paddle.set_device('cpu')print('start evaluation .......')
model = ResNet_vd()
params_file_path="model.pdparams"
model_state_dict = paddle.load(params_file_path)
model.load_dict(model_state_dict)
model.eval()
accuracies = []
losses = []
for batch_id, data in enumerate(valid_loader()):x_data, y_data = dataimg = paddle.to_tensor(x_data)label = paddle.to_tensor(y_data.numpy().astype('float32').reshape(-1, 20))# 运行模型前向计算,得到预测值logits = model(img)# 计算损失函数loss = multi_label_loss(logits, label)metric = create_metric(logits, label)losses.append(loss.numpy())
print("[validation] loss: {} hamming_distance: {} multilabel_accuracy: {}".format(loss.numpy(), metric['hamming_distance'].numpy(), metric['multilabel_accuracy'].numpy()))

七、模型预测

def read_label_file(label_file_path):with open(label_file_path, 'r') as label_file:label_list = [line.split('\n')[0] for line in label_file.readlines()]return label_list
def get_random_data(test_file_path):with open(test_file_path) as test_file:lines = test_file.readlines()img_name, y_data = random.choice(lines).split('\t')labels = y_data.split(',')labels = [int(i) for i in labels]img_path = os.path.join('/home/aistudio/work/dataset/album/img', img_name)return img_path, labels
use_gpu = True
paddle.set_device('gpu:0') if use_gpu else paddle.set_device('cpu')model = ResNet_vd()
params_file_path="model.pdparams"
model_state_dict = paddle.load(params_file_path)
model.load_dict(model_state_dict)
model.eval()img_path, labels = get_random_data('/home/aistudio/work/dataset/album/onehot_test.txt')
with open(img_path, 'rb') as f:img = transform(f.read(), mode='test')
batch_img = np.expand_dims(img, 0)
input_tensor = paddle.to_tensor(batch_img)print('start evaluation .......')
logits = model(input_tensor)
outs = F.sigmoid(logits)
preds = binarize(outs.numpy(), threshold=0.5)[0]
label_list = read_label_file('/home/aistudio/work/dataset/album/album_labels.txt')
pred_labels = [label_list[i] for i in range(len(preds)) if preds[i]]
true_labels = [label_list[i] for i in range(len(labels)) if labels[i]]
print("The true category is {} and the predicted category is {}".format(true_labels, pred_labels))
img = Image.open(img_path)
img = np.array(img)
plt.figure(figsize=(5, 5))
plt.imshow(img)
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. python3+robotframework3+selenium3分层设计和截图及注意事项

    再说一下目前的主要环境信息和版本&#xff1a; 操作系统&#xff1a;win10 64位 python版本&#xff1a;3.9.0 RIDE版本&#xff1a;v2.0b2.dev1 robotframework-seleniumlibrary&#xff1a;3.141.0 selenium&#xff1a;3.141.0 pip&#xff1a;20.2.4 setuptools&am…...

    2024/4/5 1:55:22
  2. python3+robotframework+selenium3 浏览器兼容性测试

    robot framework 测试浏览器兼容性 目前ride已支持一下浏览器&#xff1a; firefox ie chrome safari 本次我们已win 10中的ie为例&#xff0c;来看看如何使用python3robotframeworkselenium3来进行浏览器兼容性测试 上图中黄色圈的地方默认什么都不写&#xff0c;是firefox浏…...

    2024/4/19 23:54:52
  3. 【设计模式】简单工厂模式

    微信搜索&#xff1a;码农StayUp 主页地址&#xff1a;https://gozhuyinglong.github.io 源码分享&#xff1a;https://github.com/gozhuyinglong/blog-demos 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是工厂模式的一种简单实现方式&#xff0c;它属于创建型…...

    2024/4/15 14:17:47
  4. 六省联考2017

    寿司餐厅 最大权闭合子图 因为每个点的权值只算一次&#xff0c;考虑转化为图 建图每个区间[l,r]向[l1,r]与[l,r-1]连边&#xff0c;点权为区间美味值&#xff0c;每个区间[i,i]点权为区间美味值-c&#xff0c;最后每种寿司向代表这种寿司的点连边&#xff0c;点权为m*id^2 …...

    2024/4/20 9:04:46
  5. 第四章~第五章 课后习题

    第四章——数据库安全性 数据库安全性{概述{不安全因素{非授权用户对数据库的恶意存取和破坏数据库中重要和敏感的数据被泄露安全环境的脆弱性安全标准安全性控制{用户身份鉴别存取控制自主存取控制方法授权&#xff1a;授予与收回数据库角色强制存取控制方法审计{审计事件审计…...

    2024/5/2 14:06:33
  6. 第二十四章 JavaSE专题之IO流详述

    1、文件 1.1、文件流 文件在程序中以流的形式来操作&#xff1b; 流&#xff1a;数据在数据源(文件)和程序(内存)之间经历的路径&#xff1b; &#xff08;1&#xff09;输入流&#xff1a;数据从数据源文件到程序文件的路径&#xff1b; &#xff08;2&#xff09;转换流&…...

    2024/5/2 0:19:54
  7. 特征提取与检测15-AKAZE局部匹配

    AKAZE局部匹配 AKAZE局部匹配介绍 代码演示 AKAZE局部匹配介绍 KAZE介绍 AKAZE介绍 AKAZE局部匹配介绍 AOS 构造尺度空间 Hessian矩阵特征点检测 方向指定基于一阶微分图像 描述子生成 与SIFT、SUFR比较 更加稳定 非线性尺度空间 AKAZE速度更加快 比较新的算法,只有OpenCV新…...

    2024/4/13 3:57:30
  8. 「springcloud 2021 系列」openfeign结合nacos进行声明式服务调用

    源码地址&#xff1a;https://github.com/langyastudio/langya-tech/tree/master/spring-cloud 从 SpringCloud 2020 版本开始 ribbon 默认被 移除&#xff0c;替代品为 spring-cloud-loadbalancer 工作流程 openFeign 服务调用&#xff08;spring cloud 2020 开始使用 spring…...

    2024/4/13 3:57:55
  9. win10上安装python3.9.0+robotframework

    win10上安装python3.9robotframeworkpython3.9.0下载安装robotframework安装wxpython安装ride安装python3.9.0下载安装 下载地址&#xff1a;python3.9.0下载地址 选择win10 64位安装文件&#xff1a; 安装&#xff1a;执行文件安装&#xff0c;勾选环境变量选项。 验证&#…...

    2024/4/8 19:42:42
  10. 修改文件mp4媒体创建日期

    修改文件相关日期 ​ 下载exiftool.exe 软件&#xff0c;并在相应文件下编辑*.bat文件内容如下&#xff1a; exiftool.exe “-FileCreateDate2022:02:10 10:55:45” “C:\Users\Administrator\Desktop\ExifTool\VID_20220210_120445.mp4” exiftool.exe “-CreateDate2022:0…...

    2024/5/2 15:31:48
  11. es 笔记 3

    ### only focus on use ### abstraction layer separate the representation ### Elasticsearch 版本基于7.10 - data streams 数据流&#xff0c;需要一个index template Each data stream requires a matching index template. The template contains the mappings and se…...

    2024/4/18 8:36:00
  12. 0x15 字符串

    一.字符串的基本知识 1.字符串&#xff1a;1.1 S:无特殊说明&#xff0c;字符串仅由26个小写字母a~z构成&#xff0c;并用大写字母表示一个字符串。1.2 |S|:表示一个字符串的长度。1.3 S[i]&#xff1a;表示字符串S的第i个位置的字母&#xff0c;下标从1开始。2.子串&#xff…...

    2024/4/13 3:57:40
  13. redis的持久化方式RDB和AOF的区别

    redis的持久化方式RDB和AOF的区别 1、前言 最近在项目中使用到Redis做缓存&#xff0c;方便多个业务进程之间共享数据。由于Redis的数据都存放在内存中&#xff0c;如果没有配置持久化&#xff0c;redis重启后数据就全丢失了&#xff0c;于是需要开启redis的持久化功能&#x…...

    2024/5/2 8:46:37
  14. IDEA集成微软TFS插件

    IDEA集成微软TFS插件 IDEA版本控制TFS的插件有两个 TFSAzure DevOps TFS 其中TFS已经停止更新&#xff0c;需要通过网页端下载离线安装。 最新的TFS插件版本只支持到IDEA2019.3的版本&#xff0c;同时缺少一些想要的功能&#xff0c;例如在添加.tfignore文件并配置后插件不…...

    2024/4/20 9:23:09
  15. 在项目中引用别人代码出现空指针,代码逻辑又很复杂,该怎么解决

    在项目中引用别人代码出现空指针&#xff0c;代码逻辑又很复杂&#xff0c;该怎么解决 我们在项目中会经常性得引用别人得代码进行复用&#xff0c;从而使得我们编写代码得效率变高&#xff0c;但是我们引用得代码本身也是有可能会出现错误的&#xff0c;与此同时&#xff0c;…...

    2024/4/13 3:57:50
  16. 什么是乐观锁和悲观锁

    1、乐观锁&#xff1a;就像它的名字一样&#xff0c;对于并发间操作产生的线程安全问题持乐观状态&#xff0c; 乐观锁认为竞争不总是会发生&#xff0c;因此它不需要持有锁&#xff0c;将比较-替换这两个动作作 为一个原子操作尝试去修改内存中的变量&#xff0c;如果失败则表…...

    2024/4/24 12:22:04
  17. html5表单上传控件Files筛选指定格式的文件,accept属性过滤excel文件

    1、允许上传文件数量 允许选择多个文件&#xff1a; 只允许上传一个文件&#xff1a; 2、上传指定的文件格式 这里的上传格式仅指打开上传弹窗选择文件时默认的文件格式&#xff0c;可手动修改成其它文件格式。 如果不限制上传图片的格式可写成&#xff1a;accept“image/*…...

    2024/4/25 18:36:49
  18. 外观设计模式

    一、模式介绍 适配器是做接口转换&#xff0c;解决的是原接口和目标接口不匹配的问题&#xff1b;外观模式做接口整合&#xff0c;解决的是多接口调用带来的问题。 1.1、定义 外观&#xff08;Facade&#xff09;模式又称门面模式&#xff0c;为子系统提供一组统一的接口&am…...

    2024/4/16 15:37:43
  19. 通用接口开放平台设计与实现——(41)API服务之基本数据验证

    上面说了使用职责链模式&#xff0c;实现了请求的处理&#xff0c;接下来说一下数据的验证。 ​ 为保证系统的稳定可靠运行&#xff0c;必须对输入的数据进行严格验证&#xff0c;防止一些非法的异常数据引发系统后续处理流程出错甚至崩溃。同时&#xff0c;对于验证失败的情况…...

    2024/4/13 3:57:35
  20. Python学习之函数的参数形式

    目录 1、普通参数&#xff1a;按照顺序依次赋值。 2、默认参数&#xff1a;给参数设置一个默认值&#xff0c;当这个参数不存在的时候&#xff0c;它会直接赋值为当前的默认值。 3、关键字参数&#xff1a;可以改变参数的顺序&#xff0c;提高代码的可对性。 4、不定长参数…...

    2024/4/14 4:47:34

最新文章

  1. 全栈开发之路——前端篇(2)文件、组件与setup引入

    全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 本文系该系列第二篇&#xff0c;主要将介绍各个文件的意义、组件结构与导入以及setup的引入。 目录 一、src外文件介绍.gitignore为git忽略文件env.d.ts用于识别其他文件index.htmljson文件vite.confi…...

    2024/5/2 19:32:01
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 3d representation的一些基本概念

    顶点&#xff08;Vertex&#xff09;&#xff1a;三维空间中的一个点&#xff0c;可以有多个属性&#xff0c;如位置坐标、颜色、纹理坐标和法线向量。它是构建三维几何形状的基本单元。 边&#xff08;Edge&#xff09;&#xff1a;连接两个顶点形成的直线段&#xff0c;它定…...

    2024/5/2 17:20:39
  4. 【JavaScript】如何在npm中切换源以及使用指定源安装依赖

    忘不掉的是什么我也不知道 想不起当年模样 看也看不到 去也去不了的地方 也许那老街的腔调是属于我的忧伤 嘴角那点微笑越来越勉强 忘不掉的是什么我也不知道 放不下熟悉片段 回头望一眼 已经很多年的时间 透过手指间看着天 我又回到那老街 靠在你们身边渐行渐远 …...

    2024/4/29 11:15:47
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57