细粒度:S3N源码解读——Selective Sparse Sampling for Fine-grained Image Recognition
细粒度:S3N源码解读——Selective Sparse Sampling for Fine-grained Image Recognition
- 综述
- S3N网络整体结构
- 初始化阶段
- 前向传播阶段
- 随机显著性采样
- 采样网格图的生成
- 方法函数
- 生成高斯核
- 计算稀疏注意力
- 峰值响应点的计算
- 均值滤波
综述
论文题目:《Selective Sparse Sampling for Fine-grained Image Recognition》
论文地址:http://openaccess.thecvf.com/content_ICCV_2019/papers/Ding_Selective_Sparse_Sampling_for_Fine-Grained_Image_Recognition_ICCV_2019_paper.pdf
源码地址(PyTorch版本):https://github.com/Yao-DD/S3N
针对领域:细粒度图像分类(FGVC)
关键词:细粒度识别、显著性采样
S3N网络整体结构
初始化阶段
def __init__(self, base_model, num_classes, task_input_size, base_ratio, radius, radius_inv):super(S3N, self).__init__()# 采用图的尺寸self.grid_size = 31# 用于对采样图的填充self.padding_size = 30# 采样图经过扩充后的长宽尺寸self.global_size = self.grid_size + 2*self.padding_size# 图片输入的尺寸,默认448self.input_size_net = task_input_size# 高斯核,对应论文公式(8)中的kgaussian_weights = torch.FloatTensor(makeGaussian(2*self.padding_size+1, fwhm = 13))# 基础的幅度self.base_ratio = base_ratio# radius与radius_inv为两个可学习的参数,对应论文中公式(5)里的β1,β2self.radius = ScaleLayer(radius)self.radius_inv = ScaleLayer(radius_inv)# 输入输出均为1的卷积运算,kernel_size为61*61,用于公式(7,8)的计算# 因为f,g中每个值都由原显著图每个点计算,并且求和得到self.filter = nn.Conv2d(1, 1, kernel_size=(2*self.padding_size+1,2*self.padding_size+1),bias=False)# 将卷积参数定义为高斯核参数,即公式中的kself.filter.weight[0].data[:,:,:] = gaussian_weights# 高斯核,对应论文中的距离核k,该卷积操作对应论文公式(8),乘积+求和# 初始化梯度矩阵,两张梯度图,分别代表x的梯度和y的梯度# 数值从-1到2均匀变化self.P_basis = torch.zeros(2,self.grid_size+2*self.padding_size, self.grid_size+2*self.padding_size)for k in range(2):for i in range(self.global_size):for j in range(self.global_size):self.P_basis[k,i,j] = k*(i-self.padding_size)/(self.grid_size-1.0)+(1.0-k)*(j-self.padding_size)/(self.grid_size-1.0)# 定义特征提取网络self.features = base_model.features# 得到特征提取网络最后输出的特征数量self.num_features = base_model.num_features# 定义原始分支全连接层self.raw_classifier = nn.Linear(2048, num_classes)# 用于将经过采样得到的图像,特征提取后再经过一次卷积,比原始图像多一次卷积操作,这里用于判别分支self.sampler_buffer = nn.Sequential(nn.Conv2d(2048, 2048, kernel_size=3, stride=2, padding=1, bias=False),nn.BatchNorm2d(2048),nn.ReLU(),)# 定义判别分支的分类器self.sampler_classifier = nn.Linear(2048, num_classes)# 互补分支的卷积,原理同判别分支一样self.sampler_buffer1 = nn.Sequential(nn.Conv2d(2048, 2048, kernel_size=3, stride=2, padding=1, bias=False),nn.BatchNorm2d(2048),nn.ReLU(),)# 定义互补分支的分类器self.sampler_classifier1 = nn.Linear(2048, num_classes)# 用于最终分类的分类器,输入三组概率,输出一组分类概率self.con_classifier = nn.Linear(int(self.num_features*3), num_classes)# 全局平均池化self.avg = nn.AdaptiveAvgPool2d(1)# 全局最大池化self.max_pool = nn.AdaptiveMaxPool2d(1)# 用于计算权重与特征图做点乘(卷积核为1*1),得到响应图self.map_origin = nn.Conv2d(2048, num_classes, 1, 1, 0)
前向传播阶段
参数解读:
input_x
:输入的图像
x_sampled_zoom
:判别分支图像
x_sampled_inv
:互补分支图像
def forward(self, input_x, p):# 首先,获取全连接层的权重参数和偏置参数,加载到卷积核为1*1的卷积层中,便于实现公式(1)的计算self.map_origin.weight.data.copy_(self.raw_classifier.weight.data.unsqueeze(-1).unsqueeze(-1))self.map_origin.bias.data.copy_(self.raw_classifier.bias.data)# 经过特征提取feature_raw = self.features(input_x)# 再经过全连接层agg_origin = self.raw_classifier(self.avg(feature_raw).view(-1, 2048))# 求响应图的过程不是可导的过程with torch.no_grad():# 权重与原特征图做点乘运算,再求和得到200张(以CUB数据集为例)响应图,最方便的运算就是卷积运算(卷积核大小为1)# 得到响应图之后,再进行放大操作# 放大到N*C*31*31,C为分类数class_response_maps = F.interpolate(self.map_origin(feature_raw), size=self.grid_size, mode='bilinear', align_corners=True)# 输入响应图域原始图像,得到判别分支图像和互补分支图像x_sampled_zoom, x_sampled_inv = self.generate_map(input_x, class_response_maps, p)# 首先将判别分支经过特征提取以及全连接层,得到分类概率feature_D = self.sampler_buffer(self.features(x_sampled_zoom))agg_sampler = self.sampler_classifier(self.avg(feature_D).view(-1, 2048))# 再将互补分支经过特征提取以及全连接层,得到分类概率feature_C = self.sampler_buffer1(self.features(x_sampled_inv))agg_sampler1 = self.sampler_classifier1(self.avg(feature_C).view(-1, 2048))# 将三个分支得到的分类概率(原始图像、判别图像、互补图像)融合,一块传入分类器进行分类,得到最终的分类概率aggregation = self.con_classifier(torch.cat([self.avg(feature_raw).view(-1, 2048), self.avg(feature_D).view(-1, 2048), self.avg(feature_C).view(-1, 2048)], 1))# 模型最后返回四个预测概率return aggregation, agg_origin, agg_sampler, agg_sampler1
随机显著性采样
参数解读:
p
:0为训练过程中的第一阶段,1为训练过程中的第二阶段或者测试过程中的第一阶段,2为测试过程中的第二阶段。第一阶段为训练初始阶段,第二阶段为训练后期。
xs
:代表鉴别分支的采样图
xs_inv
:代表互补分支的采样图
def generate_map(self, input_x, class_response_maps, p):# 得到尺寸N, C, H, W = class_response_maps.size()# class_response_maps求全局平均,再经过softmax就相当于得到了预测概率(和原来相比,只是换了个顺序,最后的结果是一样的)# 再将预测分数排序score_pred, sort_number = torch.sort(F.softmax(F.adaptive_avg_pool2d(class_response_maps, 1), dim=1), dim=1, descending=True)# 前五名预测概率做一个求交叉熵,得到H,对应论文公式(2)# H相当于是预测结果的可信度gate_score = (score_pred[:, 0:5]*torch.log(score_pred[:, 0:5])).sum(1)xs = []xs_inv = []# 按batch_size遍历for idx_i in range(N):# 根据H来判断,最终选择哪种计算方式,用于计算最终的响应图,对应论文公式(3)# 如果gate_score大,则说明最终的预测概率最大值非常大,即预测的可信度非常高# 代表第一张响应图就可以覆盖原图的有区分度的部分# 得到的decide_map维数为两维if gate_score[idx_i] > -0.2:decide_map = class_response_maps[idx_i, sort_number[idx_i, 0],:,:]# 否则,说明预测概率最大值不高,可信度不高# 第一张响应图不足以覆盖原图的有区分度的部分,用前五张图的均值替代else:decide_map = class_response_maps[idx_i, sort_number[idx_i, 0:5],:,:].mean(0)# 求得响应图的最大值和最小值点,用于归一化操作min_value, max_value = decide_map.min(), decide_map.max()# 响应图的归一化# 此时在每个批次中,decide_map代表一张图,大小为31*31,之前定义的decide_map = (decide_map-min_value)/(max_value-min_value)# _mean_filter相当于一个平均值运算,对输入的部分图像求平均值# peak_stimulation的作用是寻找峰值点,输入响应图与,具体解读见方法函数小节# peak_list为峰值点坐标,aggregation为峰值响应的平均值peak_list, aggregation = peak_stimulation(decide_map, win_size=3, peak_filter=_mean_filter)# 对每个响应图做压缩操作,压缩无用的维度,得到尺寸为31*31的二维响应图decide_map = decide_map.squeeze(0).squeeze(0)# 得到响应图的峰值点的数据大小,根据坐标点进行定位score = [decide_map[item[2], item[3]] for item in peak_list]# x是所有峰值响应点的横坐标x = [item[3] for item in peak_list]# y是所有峰值响应点的纵坐标y = [item[2] for item in peak_list]if score == []:# 如果没有峰值相应点,则无法计算Qd与Qc# 则他们均变为默认值temp = torch.zeros(1, 1, self.grid_size,self.grid_size).cuda()temp += self.base_ratio# xs与x_inv分别代表Qd与Qc的集合xs.append(temp)xs_inv.append(temp)continue# 峰值响应数量peak_num = torch.arange(len(score))# 下面的操作对应论文中的公式(4)(5)(6)# temp对应Qd,temp_w对应Qc# 均预设为基础的幅度temp = self.base_ratiotemp_w = self.base_ratioif p == 0:# 当刚开始训练的时候(训练次数小于20)p=0,此时区域响应还不是很明显# 图像的响应值并不能确定信息是否丰富,因此不设置阈值加以区分# 求Qd、Qc的时候用所有的响应图求for i in peak_num:# 首先求取A,即论文中公式(5),然后再做一个求和操作# self.radius(torch.sqrt(score[i]))表示将输入(响应值)与一个可学习的参数相乘# kernel_generate即高斯核的计算,输入可学习的参数、响应图大小、峰值响应坐标点,得到Ai# 得到Ai后,再进行求和操作,将利用所有峰值得到的Ai进行求和,最终得到Q,即得到采样图temp += score[i] * kernel_generate(self.radius(torch.sqrt(score[i])), H, (x[i].item(), y[i].item())).unsqueeze(0).unsqueeze(0).cuda()temp_w += 1/score[i] * \kernel_generate(self.radius_inv(torch.sqrt(score[i])), H, (x[i].item(), y[i].item())).unsqueeze(0).unsqueeze(0).cuda()elif p == 1:for i in peak_num:# 随机在0,1内选一个阈值,进行对Td、Tc的分类# 由于阈值的随机引入,可以让训练过程保持动态化,提高了模型的稳定性rd = random.uniform(0, 1)# 如果大于阈值,代表为高响应区域的点,属于Td,否则属于Tc,对应论文中的公式(4)# 求Ai,和求Q的过程与p=0过程类似if score[i] > rd:temp += score[i] * kernel_generate(self.radius(torch.sqrt(score[i])), H, (x[i].item(), y[i].item())).unsqueeze(0).unsqueeze(0).cuda()else:temp_w += 1/score[i] * \kernel_generate(self.radius_inv(torch.sqrt(score[i])), H, (x[i].item(), y[i].item())).unsqueeze(0).unsqueeze(0).cuda()# 测试阶段由于只需要保证预测概率最高# 因此需要直接取两个极端值,将响应值最高的部分当成有区分度的部分,将响应值最低的部分当成补充部分# 这里与训练过程不同,训练过程的随机选择阈值是为了让训练保持动态化,提高模型稳定性,但测试阶段只要保持预测精度最高即可# 该部分只用于测试过程elif p == 2:# 得到响应值最高点处的索引,便于下面直接定位index = score.index(max(score))temp += score[index] * kernel_generate(self.radius(score[index]), H, (x[index].item(), y[index].item())).unsqueeze(0).unsqueeze(0).cuda()# 同上,得到响应值最低点处的索引index = score.index(min(score))temp_w += 1/score[index] * \kernel_generate(self.radius_inv(torch.sqrt(score[index])), H, (x[index].item(), y[index].item())).unsqueeze(0).unsqueeze(0).cuda()if type(temp) == float:# 如果是一个值(没计算高斯核,即没有峰值响应),则初始化一个矩阵,此时矩阵里的值全是基础值temp += torch.zeros(1, 1, self.grid_size,self.grid_size).cuda()# 存储得到的Qdxs.append(temp)# 下次操作类似if type(temp_w) == float:temp_w += torch.zeros(1, 1, self.grid_size,self.grid_size).cuda()xs_inv.append(temp_w)# 将所有batch的图像合并,得到所有的判别分支xs = torch.cat(xs, 0)# 将采样图做一个填充,便于下面对f,v的计算xs_hm = nn.ReplicationPad2d(self.padding_size)(xs)# 通过采样图,得到采样网格图,网格图具体生成过程的解读见显著采样小节grid = self.create_grid(xs_hm).to(input_x.device)# 利用得到的网格图对输入图像做一个网格采样,即显著采样过程x_sampled_zoom = F.grid_sample(input_x, grid)# 下面计算互补分支,与判别分支过程类似xs_inv = torch.cat(xs_inv, 0)xs_hm_inv = nn.ReplicationPad2d(self.padding_size)(xs_inv)grid_inv = self.create_grid(xs_hm_inv).to(input_x.device)x_sampled_inv = F.grid_sample(input_x, grid_inv)# 将经过显著采样得到的图像返回return x_sampled_zoom, x_sampled_inv
采样网格图的生成
def create_grid(self, x):# 输入:x 扩充后的采样图# 预先定义一个和采样图尺寸相同的全零矩阵P = torch.autograd.Variable(torch.zeros(1,2,self.grid_size+2*self.padding_size, self.grid_size+2*self.padding_size).cuda(),requires_grad=False)# 初始化为均匀的网格图P[0,:,:,:] = self.P_basis# 将P扩展维度,第一维度大小从1扩展到batch_size,即将所有batch的梯度图都做一个初始化P = P.expand(x.size(0),2,self.grid_size+2*self.padding_size, self.grid_size+2*self.padding_size)# 将输入进行堆叠,变成两张图,此时x_cat的尺寸为batch*2*91*91x_cat = torch.cat((x,x),1)# 卷积后得到的尺寸为batch*1*31*31,卷积核尺寸为61*61,这里卷积核参数被设置为高斯核,即公式(7,8)中的距离核k# 这里的卷积相当于论文中的公式(7,8)中的分母,采样图与距离核乘积再求和p_filter = self.filter(x)# 这里得到(2*batch)*1*91*91的矩阵,初始化的均匀网格图与采样图做点乘,相当于公式(7,8)中分子的一部分x_mul = torch.mul(P,x_cat).view(-1,1,self.global_size,self.global_size)# 这里得到batch*2*31*31的矩阵,再次利用卷积操作实现求和再相加,最终得到公式(7,8)中的分子all_filter = self.filter(x_mul).view(-1,2,self.grid_size,self.grid_size)# 将all_filter分离,分出x方向和y方向x_filter = all_filter[:,0,:,:].contiguous().view(-1,1,self.grid_size,self.grid_size)y_filter = all_filter[:,1,:,:].contiguous().view(-1,1,self.grid_size,self.grid_size)# 将结果相除,分别得到f与vx_filter = x_filter/p_filtery_filter = y_filter/p_filterxgrids = x_filter*2-1ygrids = y_filter*2-1# 范围控制到-1到1之间xgrids = torch.clamp(xgrids,min=-1,max=1)ygrids = torch.clamp(ygrids,min=-1,max=1)xgrids = xgrids.view(-1,1,self.grid_size,self.grid_size)ygrids = ygrids.view(-1,1,self.grid_size,self.grid_size)# 此时grid为batch*2*31*31,为采样网格grid = torch.cat((xgrids,ygrids),1)# 上采样,将梯度图放大grid = F.interpolate(grid, size=(self.input_size_net,self.input_size_net), mode='bilinear', align_corners=True)# 最终变成batch*448*448*2grid = torch.transpose(grid,1,2)grid = torch.transpose(grid,2,3)return grid
方法函数
生成高斯核
def makeGaussian(size, fwhm = 3, center=None):# x为0到60,一共61个数x = np.arange(0, size, 1, float)# np.newaxis表示增加一个维度# 此时y的维度为(61,1)y = x[:,np.newaxis]# 是否输入中心if center is None:x0 = y0 = size // 2else:x0 = center[0]y0 = center[1]# 计算高斯核return np.exp(-4*np.log(2) * ((x-x0)**2 + (y-y0)**2) / fwhm**2)
计算稀疏注意力
class KernelGenerator(nn.Module):def __init__(self, size, offset=None):super(KernelGenerator, self).__init__()# 响应图尺寸self.size = self._pair(size)# 生成网格点坐标矩阵xx, yy = np.meshgrid(np.arange(0, size), np.arange(0, size))if offset is None:# offset是响应值坐标点offset_x = offset_y = size // 2# 如果未指定坐标点,即无峰值的话,就以中心点为相应点else:offset_x, offset_y = self._pair(offset)# power指数计算,np.power(a,b),返回a^bself.factor = torch.from_numpy(-(np.power(xx - offset_x, 2) + np.power(yy - offset_y, 2)) / 2).float()# 求得相应点与周围点的距离,代表论文公式(5)中e的指数上分子的结果@staticmethoddef _pair(x):return (x, x) if isinstance(x, int) else xdef forward(self, theta):# 这里theta即可学习的参数,pow2代表e的指数上的分母pow2 = torch.pow(theta * self.size[0], 2)# kernel尺寸为31*31,为最终计算得到的Aikernel = 1.0 / (2 * np.pi * pow2) * torch.exp(self.factor.to(theta.device) / pow2)return kernel / kernel.max()
峰值响应点的计算
class PeakStimulation(Function):@staticmethoddef forward(ctx, input, return_aggregation, win_size, peak_filter):ctx.num_flags = 4# 窗口大小必须是奇数assert win_size % 2 == 1, 'Window size for peak finding must be odd.'# offset表示填充宽度,具体用法见下面调用过程offset = (win_size - 1) // 2# 定义二维填充函数padding = torch.nn.ConstantPad2d(offset, float('-inf'))# 对原图进行填充padded_maps = padding(input)# 得到填充图像后的尺寸batch_size, num_channels, h, w = padded_maps.size()# long()方法表示将数据转为in64型(长整型)# 先定义一个与扩充后图像大小相同的数组,然后再取出之间的元素视图(该视图指向元素,忽略扩充的部分)element_map = torch.arange(0, h * w).long().view(1, 1, h, w)[:, :, offset: -offset, offset: -offset]# 将数据放入和输入一样的地方中(同一个显卡,便于多卡训练)element_map = element_map.to(input.device)_, indices = F.max_pool2d(# indices大小为31*31,储存着周围极大值点的位置(该位置正好与之前创建的数组对应)padded_maps,kernel_size = win_size,stride = 1,return_indices = True)peak_map = (indices == element_map)# 找出局部最大值,即当前点就是周围的最大值点,也就是峰值点,计算方法很巧妙# 保存位置点if peak_filter:# 如果指定peak_filter为均值计算# 则下述操作代表峰值响应必须大于输入图片的均值mask = input >= peak_filter(input)peak_map = (peak_map & mask)# 返回peak_map非零元素的坐标,二维数组,第一维度大小是坐标点个数,第二维度是原数组的维数,在这里第二维度尺寸是4peak_list = torch.nonzero(peak_map)# mark_non_differentiable将输出标记为不可微# 即peak_list不可微ctx.mark_non_differentiable(peak_list)# 是否做一个聚集,默认是if return_aggregation:peak_map = peak_map.float()# 转化成0-1数,True对应1,False代表0# save_for_backward保存给定的张量,便于将来调用函数的反向传播ctx.save_for_backward(input, peak_map)# 第一返回峰值点的坐标,第二返回所有峰值点响应的平均值return peak_list, (input * peak_map).view(batch_size, num_channels, -1).sum(2) / \peak_map.view(batch_size, num_channels, -1).sum(2)else:return peak_list@staticmethoddef backward(ctx, grad_peak_list, grad_output):# 将之前存储的响应图和转化为0-1矩阵的峰值图提取出来,用于本阶段反向传播的计算input, peak_map, = ctx.saved_tensorsbatch_size, num_channels, _, _ = input.size()# 梯度与峰值图做点乘,得到峰值处的梯度,然后再除以峰值点的个数?grad_input = peak_map * grad_output.view(batch_size, num_channels, 1, 1)/ \(peak_map.view(batch_size, num_channels, -1).sum(2).view(batch_size, num_channels, 1, 1) + 1e-6)return (grad_input,) + (None,) * ctx.num_flags
均值滤波
def _mean_filter(input):batch_size, num_channels, h, w = input.size()# 求平均值threshold = torch.mean(input.view(batch_size, num_channels, h * w), dim=2)# contiguous返回连续的张量return threshold.contiguous().view(batch_size, num_channels, 1, 1)
以上仅是笔者的个人见解,若有错误,欢迎大家批评指正
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 再也不见,雅虎被中国市场击败
文|张书乐(人民网、人民邮电报专栏作者,互联网和游戏产业观察者) 对于80后,雅虎与杨致远曾经是互联网时代最初的偶像。 但这个偶像,在树立起来没几天,就在互联网泡沫中轰然倒塌。 此后20年中,…...
2024/4/15 7:45:27 - 中通全链路压测探索与实践
01 背景 目前在中通性能测试主要分为线上和线下压测两种方案,在反复实践过程中我们渐渐发现这两种方案都有着各自不足之处,且为压测工作带来了很多不便。以下就线上和线下压测的不足分析,谈谈中通是如何一步步改进压测方案并解决问题。 在线…...
2024/4/26 10:51:39 - 常见视频编码格式
H.26x系列编码(压缩) 概述: H.26X有H.261,H.262,H.263,H.263V2已经H.264,H.265,H.261基本上不再使用。其中H.262和H.264已经在MPEG系列中介绍,他们分别对应MPEG2的第二部和MPEG-4的第10部。 H.261 H.261其速率为64…...
2024/4/20 15:15:07 - [mbot_teleop-1] process has died [pid 3237, exit code 127, cmd /home/arise/sources/catkin_ws/src/mbo
在slam自主导航时候 启动键盘控制时候报错 错误: [mbot_teleop-1] process has died [pid 3237, exit code 127, cmd /home/arise/sources/catkin_ws/src/mbot_teleop/scripts/mbot_teleop.py __name:mbot_teleop __log:/home/arise/.ros/log/33712cb8-3c4c-11ec-…...
2024/4/24 7:26:34 - 推荐系统与搜索引擎的差异
转自:https://blog.csdn.net/cserchen/article/details/50422553 详细分析推荐系统和搜索引擎的差异陈运文从信息获取的角度来看,搜索和推荐是用户获取信息的两种主要手段。无论在互联网上,还是在线下的场景里,搜索和推荐这两种方式都大量并存,那么推荐系统和搜索引擎这两…...
2024/4/20 12:22:39 - cakephp 学习小结 6
cakephp 学习小结 61 把运行时,cake下部的debug信息改掉,可以这样把app\config\core.php的第43行* Development Mode:* 1: Errors and warnings shown, model caches refreshed, flash messages halted.* 2: As in 1, but also with full debug messages and SQL output.* …...
2024/4/15 7:46:17 - 双链表的创建与查看
//查看一个双链表 void Show_DLinkList(DLinkList &L) {DLinkList p L->next;while (p ! NULL){cout << p->data << endl;p p->next;}} //创建一个双链表 void C_DLinkList(DLinkList &L) {L (DLinkList)malloc(sizeof(DNode));L->next NU…...
2024/4/18 21:20:51 - linux下如何在指定的python环境下安装包
在linux中,进入anaconda的虚拟环境之后,使用pip并不一定会安装在当前环境下(和windows不太一样),而是安装在该pip对应的python版本里,pip对应的版本可以使用pip -V进行查看。 如何准确无误地将包安装在想要…...
2024/4/6 23:57:40 - 解决CUDA_ERROR_SYSTEM_DRIVER_MISMATCH
nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04:CUDA_ERROR_SYSTEM_DRIVER_MISMATCH问题查看解决问题 在运行一个调用cudnn库的程序时,运行时报错,错误就是:CUDA_ERROR_SYSTEM_DRIVER_MISMATCH。这个东西很无语。不知道原因是什么。我使用的d…...
2024/4/15 7:45:52 - 剑指 Offer 44. 数字序列中某一位的数字(找规律)
力扣链接 class Solution {public int findNthDigit(int n) {int digit 1;long start 1;long count 9;while (n > count) { // 1.n - count;digit 1;start * 10;count digit * start * 9;}long num start (n - 1) / digit; // 2.return Long.toString(num).charAt((…...
2024/4/26 5:08:09 - mysql查询某一天的数据
SELECT count(*) FROM person WHERE createTime between ‘2021-09-30 00:00:00’ and ‘2021-09-30 23:59:59’ SELECT * FROM person WHERE createTime between ‘2021-09-28 00:00:00’ and ‘2021-09-28 23:59:59’...
2024/4/26 21:09:38 - MyBatis 与 Hibernate 有哪些不同?
a、Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句,不过 mybatis 可以 通过 XML 或注解方式灵活配置要运行的 sql 语句,并将java 对象和 sql 语句映射生成最终执行的 sqlÿ…...
2024/4/25 6:03:27 - 循环方法总结
数组方法 Array forEach forEach循环, 没有返回值,没有break forEach 循环在所有元素调用完毕之前是不能停止的,它没有 break 语句,如果你必须要停止,可以尝试 try catch 语句,就是在要强制退出的时候,抛出…...
2024/4/15 7:46:12 - 中国下一代互联网(CNGI)建设市场投资前景预测与发展战略规划研究报告2021~2027年
第1章:下一代互联网的界定及发展环境剖析1.1 下一代互联网的界定及相关统计说明 1.1.1 IPv4面临的主要问题及IPv6发展的背景 (1)互联网与互联网协议 (2)互联网发展历程 (3)下一代网络发展趋势…...
2024/4/25 13:31:44 - IdentityServer4 引用类型ReferenceToken关闭HTTPS认证
How to close identityserver4 https? Identityserver4 强制生产环境使用https,走oidc协议,如果使用localhost报错..well-known/openid-configuration. HTTPS required.解决方法 官网文档注明 Jwt Token 关闭https验证 RequireHttpsMetadata false Reference …...
2024/4/20 17:21:36 - Angular Form (响应式Form) 学习笔记
Angular 响应式表单使用显式的、不可变的方式,管理表单在特定的时间点上的状态。对表单状态的每一次变更都会返回一个新的状态,这样可以在变化时维护模型的整体性。响应式表单是围绕 Observable 流构建的,表单的输入和值都是通过这些输入值组…...
2024/4/20 7:36:28 - 【maven】普通maven工程,如何生成一个包含三方jar包的fatjar
1.使用maven插件,onejar-maven-plugin pom配置如下: <plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5</version><conf…...
2024/4/24 16:53:26 - 面试笔记Glide
// Glide使用 RequestManager with Glide.with(this); RequestBuilder<Drawable> load with.load(url); load.into(iv); 为什么RequestManager能够管理生命周期? 是因为Glide通过RequestMangerRetriever创建一个无UI的Fragment,并将这个Fragment…...
2024/4/15 7:45:57 - 真题经典题整理
2000年 基于关键字比较大小排序算法中,快排是平均时间复杂度最优的n个顶点有向图,至少需要n条孤才能保证连通图(三角形三条边,矩形四条边)...
2024/4/19 13:15:46 - Spyder 打不开 anaconda prompt 提示 bad address
z问题:Spyder打开自动退出 定位问题: 1. Anaconda prompt 输入 spyder, 显示 Bad address (C:/projects\libzmq\src\epoll.cpp.100) Bad address (C:/projects\libzmq\src\epoll.cpp.100) Bad address (C:/projects\libzmq\src\epoll.cpp.100) 2. 百…...
2024/4/18 16:10:27
最新文章
- 安卓NetworkStatsManager使用及demo
目录 一、TrafficStats类简介二、demo示例 一、TrafficStats类简介 TrafficStats Android API 8提供了android.net.TrafficStats类。 通过此类能获取设备重启以来网络信息,部分函数如下所示: static long getMobileRxBytes() //获取通过移动数据网络…...
2024/4/26 21:20:01 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - uniapp原生下拉刷新在手机上不起作用
开启原生下拉刷新时,页面里使用了全屏高的scroll-view,向下拖动内容时,会优先触发scroll-view滚动而不是下拉刷新。 "enablePullDownRefresh": true, 这就可能会导致下拉刷新不起作用,这时候就需要做到取舍,…...
2024/4/18 23:22:03 - 【python】Flask Web框架
文章目录 WSGI(Web服务器网关接口)示例Web应用程序Web框架Flask框架创建项目安装Flask创建一个基本的 Flask 应用程序调试模式路由添加变量构造URLHTTP方法静态文件模板—— Jinja2模板文件(Template File)<...
2024/4/26 19:47:13 - Flink中几个关键问题总结
硬核!八张图搞懂 Flink 端到端精准一次处理语义 Exactly-once(深入原理,建议收藏) Flink可靠性的基石-checkpoint机制详细解析 硬核!一文学完Flink流计算常用算子(Flink算子大全)...
2024/4/22 13:36:18 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/25 18:38:39 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/25 18:39:23 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/25 18:39:22 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/25 18:39:22 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/25 18:39:20 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/25 16:48:44 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/26 16:00:35 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/25 4:19:21 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/25 18:39:12 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/25 18:38:58 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/25 18:38:57 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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