一个案例熟悉使用pytorch
文章目录
- 1. 完整模型的训练套路
- 1.2 导入必要的包
- 1.3 准备数据集
- 1.3.1 使用公开数据集:
- 1.3.2 获取训练集、测试集长度:
- 1.3.3 利用 DataLoader来加载数据集
- 1.4 搭建神经网络
- 1.4.1 测试搭建的模型
- 1.4.2 创建用于训练的模型
- 1.5 定义损失函数和优化器
- 1.6 使用tensorboard(非必要)
- 1.7 定义早停策略等参数
- 1.8 训练模型
- 1.8.1 通过训练得到best_model
- 1.9 验证模型
- 1.9.1标签数据:
- 1.9.2 开始验证模型
- 导入必要的包:
- 读取图片(网上随便找的):
- 转换图像维度:
- 加载best_model
- 开始用模型预测
- 1.10 扩展知识
- 1.10.1 使用GPU加速的方法
- 1.10.2 使用早停策略
- 1.10.3 两种保存模型的方法
- 导包:
- 两种保存模型方式:
- 两种读取模型方式:
- 完整代码获取方式:
1. 完整模型的训练套路
任务:给图片做分类,飞机、鸟、狗、猫。。等共十种标签
ps:针对不同任务,只是在数据处理和模型搭建上有所不同而已,模型的训练流程套路都是一样的。
1.2 导入必要的包
import torchvision
from torch import nn
import torch
1.3 准备数据集
1.3.1 使用公开数据集:
# 准备数据集
train_data = torchvision.datasets.CIFAR10(root="../data",train=True,transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root="../data",train=False,transform=torchvision.transforms.ToTensor(),download=True)
1.3.2 获取训练集、测试集长度:
# length长度
train_data_size = len(train_data)
test_data_size = len(test_data)print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))
1.3.3 利用 DataLoader来加载数据集
# 利用 DataLoader来加载数据集
from torch.utils.data import DataLoader
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)
1.4 搭建神经网络
# 搭建神经网络
class MyModel(nn.Module):def __init__(self):super(MyModel,self).__init__()self.model = nn.Sequential(nn.Conv2d(3,32,5,1,2),nn.MaxPool2d(2),nn.Conv2d(32,32,5,1,2),nn.MaxPool2d(2),nn.Conv2d(32,64,5,1,2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64*4*4,64),nn.Linear(64,10))def forward(self,x):x = self.model(x)return x
1.4.1 测试搭建的模型
# 测试搭建的模型
model1 = MyModel()
input = torch.ones((64,3,32,32))
output = model1(input)
print(output.shape) #torch.Size([64, 10])
1.4.2 创建用于训练的模型
# 定义是否使用gpu加速的设备
# 支持gpu加速的pytorch版本,device = cuda:0,否则为cpu
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device) # cuda:0# 创建模型
model = MyModel()
# model.to(device) # 模型和损失函数不需要另外复制
model = model.to(device)
1.5 定义损失函数和优化器
# 损失函数
loss_fn = nn.CrossEntropyLoss() # 交叉熵,现在常用mse
loss_fn.to(device)learning_rate = 1e-2
# learning_rate = 0.01
# 优化器
optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate) #SGD,现在常用Adam
1.6 使用tensorboard(非必要)
# 使用tensorboard
from torch.utils.tensorboard.writer import SummaryWriter
# 添加tensorbord
writer = SummaryWriter("../logs_train")import time
import numpy as np
1.7 定义早停策略等参数
# 定义 Early Stopping 参数
early_stopping_patience = 3 # 如果 3 个 epoch 后性能没有改善,就停止训练
early_stopping_counter = 0
best_loss = float('inf') # 初始化为无穷大 # 初始化最好模型的性能为无穷大
best_valid_loss = float('inf')# 初始化好的准确率
best_accuracy = 0.00
1.8 训练模型
# 设置训练网络的一些参数# 记录测试的次数
total_test_step = 0# 训练的次数
epoch = 100start_time = time.time()
for i in range(epoch):print("----------------第{}轮训练开始----------------".format(i+1))# 训练步骤开始model.train() #训练模式,对DropOut等有用train_loss = []# 记录训练的次数iter_count = 0for data in train_dataloader:imgs,targets = dataimgs = imgs.to(device)targets = targets.to(device)outputs = model(imgs) # 调用模型计算输出值loss = loss_fn(outputs,targets) # 计算损失值train_loss.append(loss.item())# 优化器优化模型optimizer.zero_grad() # 梯度清零loss.backward() # 反向传播optimizer.step() # 优化参数iter_count = iter_count + 1 # 迭代次数if (iter_count %100 == 0):end_time = time.time()
# print("cost_time:",end_time-start_time)print("训练次数:{0},Loss:{1:.7f}".format(iter_count,loss.item()))writer.add_scalar("train_loss:",loss.item(),iter_count)train_loss = np.average(train_loss)print("第{0}轮训练结束".format(i+1))print("Epoch:{0} | Train_Loss:{1:.7f}\n".format(i+1,train_loss))# 测试步骤开始model.eval()# 测试模式print("第{0}轮测试开始:".format(i+1))test_loss = []test_accuracy = 0with torch.no_grad(): # 不计算梯度for data in test_dataloader:imgs,targets = dataimgs = imgs.to(device)targets = targets.to(device)outputs = model(imgs)loss = loss_fn(outputs,targets)test_loss.append(loss.item())accuracy = (outputs.argmax(1) == targets).sum()test_accuracy = test_accuracy+accuracytest_loss = np.average(test_loss)print("Epoch:{0} | Test_Loss:{1:.7f}".format(i+1,test_loss))test_accuracy = test_accuracy/test_data_sizeprint("Test_Accuracy:{0:.7f}".format(test_accuracy))writer.add_scalar("test_loss:",test_loss,total_test_step )writer.add_scalar("test_accuracy:",test_accuracy,total_test_step )total_test_step = total_test_step + 1# 每一轮保存模型# torch.save(model,"model_{}.pth".format(i+1))# torch.save(model.state_dict(),"model_{}.pth".format(i)) # 官方推荐的保存模型方法# # 如果当前模型在验证集上的性能更好,保存该模型 (以Loss为标准)# if test_loss < best_valid_loss: # best_valid_loss = test_loss # torch.save(model.state_dict(), './model/best_model.pth')# print("当前第{}轮模型为best_model,已保存!".format(i+1))# 以正确率为标准if best_accuracy < test_accuracy: best_accuracy = test_accuracy torch.save(model.state_dict(), './model/'+'ac_{0:.4f}_best_model.pth'.format(best_accuracy))print("当前第{}轮模型为best_model,已保存!".format(i+1))early_stopping_counter = 0 #只要模型有更新,早停patience就初始化为0else: #早停策略early_stopping_counter += 1 if early_stopping_counter >= early_stopping_patience: print("Early stopping at epoch {}".format(i+1)) breakprint("\n")writer.close()
训练过程展示(只给出两轮的信息):
…
1.8.1 通过训练得到best_model
我自得到的best_model :ac_0.6553_best_model.pth
准确率:0.65,还行,练手的项目,就不一一调参多次训练了
1.9 验证模型
1.9.1标签数据:
1.9.2 开始验证模型
导入必要的包:
from PIL import Image
import torchvision
import torch
读取图片(网上随便找的):
图1-dog1:
图2-dog2:
image_path = "./data/dog2.png"
image = Image.open(image_path)
image = image.convert('RGB')
转换图像维度:
transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])
image = transform(image)
print(image.shape) #torch.Size([3, 32, 32])
加载best_model
神经网络类:
from torch import nn
class MyModel(nn.Module):def __init__(self):super(MyModel,self).__init__()self.model = nn.Sequential(nn.Conv2d(3,32,5,1,2),nn.MaxPool2d(2),nn.Conv2d(32,32,5,1,2),nn.MaxPool2d(2),nn.Conv2d(32,64,5,1,2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64*4*4,64),nn.Linear(64,10))def forward(self,x):x = self.model(x)return x
因为我保存模型用了state_dict()
,(这样的模型小,省空间),所以加载模型需要以下这样加载,下文会给出保存模型的两种方法:
best_model = MyModel()
best_model.load_state_dict(torch.load("./best_model/ac_0.6553_best_model.pth"))
print(best_model)
输出:
MyModel((model): Sequential((0): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(4): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(6): Flatten(start_dim=1, end_dim=-1)(7): Linear(in_features=1024, out_features=64, bias=True)(8): Linear(in_features=64, out_features=10, bias=True))
)
开始用模型预测
再转换一下图片维度:
image = torch.reshape(image,(1,3,32,32))
best_model.eval()
with torch.no_grad():output = best_model(image)
print(output)
print(output.argmax(1)) # 取出预测最大概率的值
输出结果:由结果可知,预测的十个标签中,从0开始,第5个结果的值最大,查看标签数据知,序号5为dog,预测成功了
ps:我得到的这个模型,把图片dog1,预测成了猫
tensor([[ -3.7735, -9.3045, 6.1250, 2.3422, 4.8322, 11.0666, -2.2375,7.5186, -11.7261, -8.5249]])
tensor([5])
1.10 扩展知识
1.10.1 使用GPU加速的方法
GPU训练:
- 网络模型
- 数据(输入、标注)
- 损失函数
- .cuda
# 使用GPU训练
import torch device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 将模型移动到 GPU
model = model.to(device) # 将损失函数移动到 GPU
loss_fn = loss_fn.to(device)# 将输入数据移动到 GPU
inputs = inputs.to(device) # 将标签移动到 GPU
labels = labels.to(device)
# 命令行的方式查看显卡配置(在jupyter上)
!nvidia-smi
1.10.2 使用早停策略
# 使用早停策略
import torch
import torch.nn as nn
from torch.optim import Adam
from torch.utils.data import DataLoader, TensorDataset # 定义一个简单的模型
class SimpleModel(nn.Module): def __init__(self, input_dim, output_dim): super(SimpleModel, self).__init__() self.linear = nn.Linear(input_dim, output_dim) def forward(self, x): return self.linear(x) # 创建数据
input_dim = 10
output_dim = 1
x_train = torch.randn(100, input_dim)
y_train = torch.randn(100, output_dim)
dataset = TensorDataset(x_train, y_train)
dataloader = DataLoader(dataset, batch_size=10) # 初始化模型、损失函数和优化器
model = SimpleModel(input_dim, output_dim)
criterion = nn.MSELoss()
optimizer = Adam(model.parameters(), lr=0.01) # 定义 Early Stopping 参数
early_stopping_patience = 5 # 如果 5 个 epoch 后性能没有改善,就停止训练
early_stopping_counter = 0
best_loss = float('inf') # 初始化为无穷大 # 训练循环
for epoch in range(100): # 例如我们训练 100 个 epoch for inputs, targets in dataloader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() # 计算当前 epoch 的损失 current_loss = 0 with torch.no_grad(): for inputs, targets in dataloader: outputs = model(inputs) current_loss += criterion(outputs, targets).item() / len(dataloader) current_loss /= len(dataloader) # 检查是否应提前停止训练 if current_loss < best_loss: best_loss = current_loss early_stopping_counter = 0 else: early_stopping_counter += 1 if early_stopping_counter >= early_stopping_patience: print("Early stopping at epoch {}".format(epoch)) break
1.10.3 两种保存模型的方法
导包:
import torch
import torchvision
两种保存模型方式:
vgg16 = torchvision.models.vgg16(weights=None)# 保存方式1,模型结构+参数结构
torch.save(vgg16,"vgg16_method1.pth")# 保存方式2,模型参数(官方推荐)模型较小
torch.save(vgg16.state_dict(),"vgg16_method2.pth")
两种读取模型方式:
# 方式1
model1 = torch.load("vgg16_method1.pth")
# model1
# 方式2
model2 = torch.load("vgg16_method2.pth")
# model2 # 参数结构
# 将方式2 恢复成模型结构
vgg16 = torchvision.models.vgg16(weights=None)
vgg16.load_state_dict(torch.load("vgg16_method2.pth"))print(vgg16)
输出结果:
VGG((features): Sequential((0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): ReLU(inplace=True)(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(3): ReLU(inplace=True)(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(6): ReLU(inplace=True)(7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(8): ReLU(inplace=True)(9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(11): ReLU(inplace=True)(12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(13): ReLU(inplace=True)(14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(15): ReLU(inplace=True)(16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(18): ReLU(inplace=True)(19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(20): ReLU(inplace=True)(21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(22): ReLU(inplace=True)(23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(25): ReLU(inplace=True)(26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(27): ReLU(inplace=True)(28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(29): ReLU(inplace=True)(30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))(avgpool): AdaptiveAvgPool2d(output_size=(7, 7))(classifier): Sequential((0): Linear(in_features=25088, out_features=4096, bias=True)(1): ReLU(inplace=True)(2): Dropout(p=0.5, inplace=False)(3): Linear(in_features=4096, out_features=4096, bias=True)(4): ReLU(inplace=True)(5): Dropout(p=0.5, inplace=False)(6): Linear(in_features=4096, out_features=1000, bias=True))
)
完整代码获取方式:
点赞、收藏、加关注
加我vx:ls888726
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/50c0c5e38137cbfacb4ace7cda88e014.png)
一个案例熟悉使用pytorch
文章目录 1. 完整模型的训练套路1.2 导入必要的包1.3 准备数据集1.3.1 使用公开数据集:1.3.2 获取训练集、测试集长度:1.3.3 利用 DataLoader来加载数据集 1.4 搭建神经网络1.4.1 测试搭建的模型1.4.2 创建用于训练的模型 1.5 定义损失函数和优化器1.6 使…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL - limit 分页查询 (查询操作 五)
功能介绍:分页查询(limit)是一种常用的数据库查询技术,它允许我们从数据库表中按照指定的数量和顺序获取数据,它在处理大量数据时特别有用,可以提高查询效率并减少网络传输的数据 语法:SELECT …...
![](https://img-blog.csdnimg.cn/7e1cc8f59d974a7098e902939e11f197.png)
代码随想录笔记--动态规划篇
1--动态规划理论基础 动态规划经典问题:① 背包问题;② 打家劫舍;③ 股票问题; ④ 子序列问题; 动态规划五部曲: ① 确定 dp 数组及其下标的含义; ② 确定递推公式; ③ 确定 dp 数组…...
![](https://www.ngui.cc/images/no-images.jpg)
vue之vuex
Vuex 是 Vue.js 的一个状态管理模式和库,为应用中的所有组件提供了一个集中式的存储管理,并提供了一种强大的方式来管理应用的状态。Vuex 包含以下核心概念: State:定义了应用的状态,类似于组件中的 data。 Getters&a…...
![](https://www.ngui.cc/images/no-images.jpg)
ISO 26262 系列学习笔记 ———— ASIL定义(Automotive Safety Integration Level)
文章目录 介绍严重度(Severity)暴露概率(Probability of Exposure)可控性(Controllability) 介绍 如果没有另行说明,则应满足ASIL A、B、C和D各分条款的要求或建议。这些要求和建议参考了安全目…...
![](https://www.ngui.cc/images/no-images.jpg)
代码随想录 第8章 二叉树
1、理论知识 (1)、满二叉树 如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树。 (2)、完全二叉树 除了底层节点可能没有填满,其余每层的节点…...
![](https://img-blog.csdnimg.cn/94db4332b1b74a65b402bdfd4f3b45d4.png)
计算机网络工程师多选题系列——计算机网络
2 计算机网络 2.1 网络技术基础 题型1 TCP/IP与ISO模型的问题 TCP/IP由IETF制定,ISO由OSI制定; TCP/IP分为四层,分别是主机-网络层、互联网络层、传输层和应用层;OSI分为七层,分别是物理层、数据链路层、网络层(实…...
![](https://img-blog.csdnimg.cn/61149e5bddb74cb19b42acb7cd9e57af.png)
Zabbix5.0_介绍_组成架构_以及和prometheus的对比_大数据环境下的监控_网络_软件_设备监控_Zabbix工作笔记001
z 这里Zabbix可以实现采集 存储 展示 报警 但是 zabbix自带的,展示 和报警 没那么好看,我们可以用 grafana进行展示,然后我们用一个叫睿象云的来做告警展示, 会更丰富一点. 可以看到 看一下zabbix的介绍. 对zabbix的介绍,这个zabbix比较适合对服务器进行监控 这个是zabbix的…...
![](https://img-blog.csdnimg.cn/af212ca6dce84bc9b0086d6ab6ff4438.png)
Spring | 事件监听器应用与最佳实践
引言 在复杂的软件开发环境中,组件之间的通信和信息交流显得尤为重要。Spring框架,作为Java世界中最受欢迎的开发框架之一,提供了一种强大的事件监听器模型,使得组件间的通信变得更加灵活和解耦。本文主要探讨Spring事件监听器的…...
![](https://img-blog.csdnimg.cn/cf8b1e267e06491dac439a67f7e7e8b5.png)
正点原子lwIP学习笔记——NETCONN接口简介
1. NETCONN接口简介 NETCONN API 使用了操作系统的 IPC 机制, 对网络连接进行了抽象,使用同一的接口完成UDP和TCP连接。 NETCONN API接口是在RAW接口基础上延申出来的一套API接口 首先会调用netconn_new创建一个pcb控制块,其实际是一个宏定…...
![](https://img-blog.csdnimg.cn/1febcb560e4d46f684d4f7ac62a1b084.png)
PHP自动识别采集何意网址文章正文内容
在做PHP采集内容时,用过querylist采集组件,但是这个插件采集页面内容时,都必须要写个采集选择器。这样比较麻烦,每个文章页面都必须指定一条采集规则 。就开始着手找一个插件可以能自动识别任意文章url正文内容并采集的࿰…...
![](https://img-blog.csdnimg.cn/78d23cdb6527439293d8dce7d43ea762.png)
区块链实验室(27) - 区块链+物联网应用案例
分享最新的区块链物联网应用案例:HPCLS-BC...
![](https://img-blog.csdnimg.cn/img_convert/1a6a5e901dbaf09cea1cdd5a6e1ec468.png)
NPU上PyTorch模型训练问题案例
在昇腾AI处理器上训练PyTorch框架模型时,可能由于环境变量设置问题、训练脚本代码问题,导致打印出的堆栈报错与实际错误并不一致、脚本运行异常等问题,那么本期就分享几个关于PyTorch模型训练问题的典型案例,并给出原因分析及解决…...
![](https://img-blog.csdnimg.cn/f1f9ac2e99b046f4b39cca6ea99a1b8b.png)
出现 conda虚拟环境默认放在C盘 解决方法
目录 1. 问题所示2. 原理分析3. 解决方法3.1 方法一3.2 方法二1. 问题所示 通过conda配置虚拟环境的时候,由于安装在D盘下,但是配置的环境默认都给我放C盘 通过如下命令:conda env list,最后查看该环境的确在C盘下 2. 原理分析 究其根本原因,这是因为默认路径没有足够的…...
![](https://www.ngui.cc/images/no-images.jpg)
Ubuntu Postgresql开机自启动服务
1. 建立service文件 sudo vim /etc/systemd/system/postgresql.service2. postgresql service文件 [Unit] DescriptionPostgreSQL 14 database server Documentationman:postgres(1) Documentationhttp://www.postgresql.org/docs/14/static/ Afternetwork.target[Service] T…...
![](https://img-blog.csdnimg.cn/c0a6210e02404c27a18e62ffcc8a79cf.jpeg)
COTS即Commercial Off-The-Shelf 翻译为“商用现成品或技术”或者“商用货架产品”
COTS 使用“不再做修理或改进”的模式出售的商务产品 COTS即Commercial Off-The-Shelf 翻译为“商用现成品或技术”或者“商用货架产品”,指可以采购到的具有开放式标准定义的接口的软件或硬件产品,可以节省成本和时间。 中文名 商用现成品或技术 外文…...
![](https://img-blog.csdnimg.cn/899e0d1aef714f5dba348287bc21edbf.png)
idea开发Springboot出租车管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目
一、源码特点 springboot 出租车管理系统是一套完善的完整信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发), 系统具有完整的源代码和数据…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux nohup
nohup 命令用于在 Linux 中将命令或程序在后台运行,并且在终端关闭后仍然保持运行。 nohup命令 描述 nohup 命令用于将命令或程序以不受终端挂断影响的方式在后台运行。 语法 nohup command [arguments] &参数 command:要在后台运行的命令或程…...
![](https://img-blog.csdnimg.cn/e08b1237d6444be5a1af3fb0594c9396.png)
Linux 常见问题
1. 使用 sudo 命令时,提示 is not in the sudoers file. 是由于对应用户没有添加到 sudoers 文件中,可以在该文件中指定用户权限。运行以下命令即可打开该文件: visudo 添加上对应用户的权限 Ctrl x 退出保存即可。 2. Debian 新建的普通用…...
![](https://img-blog.csdnimg.cn/img_convert/f566a9271c8d00b1402576a7dfc7c10a.jpeg)
仕达利恩飞讯软件TPM设备管理项目正式启动,向数字化再迈一步
9月25日,仕达利恩(惠州)科技有限公司(以下简称“仕达利恩”)设备智能数采项目启动会成功召开,仕达利恩首席崔浩渊、杨翠琼次长携项目主要负责人共同出席本次启动会。为解决仕达利恩现阶段生产过程中的设备管理、设备配件仓管理以及…...
![](https://img-blog.csdnimg.cn/61f983ba65a34ad19ffdeb7f9df73518.png)
【算法】分治法
文章目录 概念原理和步骤代码示例 总结 概念 分治法(Divide and Conquer)是一种算法设计策略,其思想是将一个大问题划分为若干小规模的子问题,然后递归地解决每个子问题,并将它们的解合并起来以得到原始问题的解。分治…...
![](https://img-blog.csdnimg.cn/06141e8959bd480291fe8c147233c285.png)
Rabbit消息的可靠性
生产者重连 消费者重试 Confirm模式简介 消息的confirm确认机制,是指生产者投递消息后,到达了消息服务器Broker里面的exchange交换机,则会给生产者一个应答,生产者接收到应答,用来确定这条消息是否正常的发送到Broker…...
![](https://www.ngui.cc/images/no-images.jpg)
Java中的网络编程是什么?
Java中的网络编程是指使用Java编程语言进行网络通信的过程和技术。它允许Java程序在互联网或局域网上进行数据交换、通信和传输。 Java提供了许多类和接口,用于实现网络编程。主要的网络编程相关的类在java.net包中可以找到。以下是一些常用的类和接口:…...
![](https://www.ngui.cc/images/no-images.jpg)
Oracle 常用命令大全
数据库 ----数据库启动 & 关闭 启动数据库 SQL> startup nomount; SQL> alter database mount; SQL> alter database open;关闭数据库 SQL> shutdown immediate;更多内容请参考:Oracle数据库启动和关闭 ----连接数据库 登陆普通用…...
![](https://www.ngui.cc/images/no-images.jpg)
Mysql 开启ssl连接
本文是针对Mysql 5.7版本以上数据库 1. 检查当前SSL / TLS状态 我们将使用-h指定IPv4本地环回接口,以强制客户端与TCP连接,而不是使用本地套接字文件。 这将允许我们检查TCP连接的SSL状态: mysql -u root -p -h 127.0.0.1键入以下内容以显示SSL / TLS变量的状态: SHOW …...
![](https://www.ngui.cc/images/no-images.jpg)
Java Stream流对List集合进行分页
有一种情况,我们有时不便在数据库层面进行分页。我们知道Mybatis的startPage();方法也是对数据库进行limit操作,有没有一种方式,只对List集合进行分页呢? 当然有,我们可以使用Stream流的方式对List集合进行操作&#…...
![](https://img-blog.csdnimg.cn/5aec45b7381a46efb3bc485f06a3487b.png)
Docker(二)、linux环境Docker的部署以及构建镜像
linux环境Docker的部署以及构建镜像 一、docker部署1、快速部署常用的命令:1.1、demo-部署tomcat1.2、tomcat容器内部结构1.2.1、每个tomcat容器,都包含三个组件1.2.2、在容器内部执行命令 1.3、容器生命周期 二、Dockerfile构建镜像1、demo-Dockerfile自…...
![](https://img-blog.csdnimg.cn/3e49a937d1684227b5abfa0698a01666.png)
GEE错误——Image.select: Pattern ‘MDF‘ did not match any bands
问题 ImageCollection (Error) Collection query aborted after accumulating over 5000 elements. ImageCollection (268 elements) Mean DOD550: Layer error: ImageCollection.reduce: Error in map(ID=MCD19A2_A2001001_h15v17_061_2022161165308_01): Image.select: Patte…...
![](https://img-blog.csdnimg.cn/73dc3521e75e4409bebf0bfe2e890c93.png)
前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(四)
开始吧,做时间的主人! 把时间分给睡眠,分给书籍,分给运动, 分给花鸟树木和山川湖海, 分给你对这个世界的热爱, 而不是将自己浪费在无聊的人和事上。 思维导图 函数 为什么需要函数 <!DO…...
![](https://img-blog.csdnimg.cn/2087e30411ed4ec6ab6ce744d128f86f.png)
mysql超级聚合with rollup
超级聚合,是在group by的基础上,再次进行聚合。 它再次聚合的列,是select中没有用到聚合函数的列。 文章目录 例子1解释例子2表以及数据 例子1 mysql> SELECT year, country, product, SUM(profit) AS profitFROM salesGROUP BY year, c…...
怀柔建设网站公司/网站的优化
原创作品,出自 “深蓝的blog” 博客,深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/47143731 背景 近日有哥们问我如何实现多条数据以单条的方式插入到目标表里,为解决这个问题,下面来做个小实验。…...
![](https://yqfile.alicdn.com/img_50d2f0538e701e9c08b4c3452e8f2d79.png)
扬州品牌网站设计/友链购买有效果吗
这本书是2016年8月出版的,一年半之后再看,虽然AI风口已过,但是由此延伸而来的概念正在引导出更深的内涵。 何谓大数据?作者的观点是体量大、维度高、及时性强。 为了说明数据的威力,书中举了许多例子。印象最深的一个是…...
![](/images/no-images.jpg)
网站设计费用多少/营业推广是一种什么样的促销方式
Gitlab库已损坏前端显示500错误解决方法参考文章: (1)Gitlab库已损坏前端显示500错误解决方法 (2)https://www.cnblogs.com/zhanmeiliang/p/7298188.html 备忘一下。...
![](/images/no-images.jpg)
网站要多钱/百度网站的网址
zip:压缩:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b][-ll][-n][-t][-][压缩文件][文件...][-i][-x]解压:unzip[选项] 压缩文件名.zip选项:-x 文件列表解压缩文件,但不包括指定的file文件。-v 查看压缩文件目录,但不解压。…...
![](/images/no-images.jpg)
做网站自己装服务器/网络推广外包公司
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了…...
![](/images/no-images.jpg)
网站设计专业/河源seo
Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候…...