Pytorch深度学习快速入门(中)

news2024/11/17 13:28:57

Pytorch深度学习快速入门(中)

  • 一、Containers(神经网络的基本骨架)
    • (一)Module 的使用
    • (二)Sequential 的使用<搭建小实战>
  • 二、Convolution Layers(卷积层)
    • (一)torch.nn.functional 中 conv2d 的使用
    • (二)torch.nn 中 Conv2d 的使用
  • 三、Pooling layers(池化层)
    • (一)池化层的介绍
    • (二)MaxPool2d 的使用
  • 四、Non-linear Activations(非线性激活)
    • (一)非线性激活的目的
    • (二)ReLU 与 Sigmoid 的使用
  • 五、Linear Layers(线性层)及其他层
    • (一)其他层简介
    • (二)Linear Layers(线性层/全连接层)— Linear 的使用
  • 六、损失函数&反向传播
    • (一)损失函数的作用&与反向传播的联系
    • (二)L1Loss、MSELoss、CrossEntropyLoss损失函数的使用
    • (三)如何在之前写的神经网络中用到损失函数&反向传播
  • 七、优化器
    • (一)官方文档解读
    • (二)如何在之前写的神经网络中用到优化器

一、Containers(神经网络的基本骨架)

(一)Module 的使用

在这里插入图片描述
在这里插入图片描述

import torch
from torch import nn

class Li(nn.Module):
	def __init__(self):
		super().__init__()

	def forward(self,input):
		output = input + 1
		return output

li = Li() # 用模板创建出了一个神经网络
x = torch.tensor(1.0)  # 创建一个标量张量,其值为 1.0
# 张量是python中各种维度数据形式的统称,0维就是一个数,1维是数组,2维是矩阵,3维是空间矩阵
output = li(x)
print(output)  # 输出本来是2.0,但系统会自动忽略后面无意义的0,输出2.

(二)Sequential 的使用<搭建小实战>

Sequential 的作用:让代码更加简洁

在这里插入图片描述

# 卷积核通道数 == 输入图像的通道数
# 这是因为卷积操作是逐通道进行的,然后(可选地)通过某种方式(如求和或加权和)将各通道的结果合并
# 输出通道数 == 卷积核个数
import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter


class Li(nn.Module):
	def __init__(self):
		super().__init__()
		# 法一:奇数卷积核把中心格子对准图片第一个格子,卷积核在格子外有两层就padding=2
		# 法二:如果前后尺寸不变,padding=(kernelsize-1)/2,kernelsize为卷积核(过滤器)的尺寸

		# self.conv1 = Conv2d(3,32,5,padding=2)
		# self.maxpool1 = MaxPool2d(2)
		# self.conv2 = Conv2d(32,32,5,padding=2)
		# self.maxpool2 = MaxPool2d(2)
		# self.conv3 = Conv2d(32,64,5,padding=2)
		# self.maxpool3 = MaxPool2d(2)
		# self.flatten = Flatten() # 实质上用1x1的kernel做卷积(全卷积网络)
		# self.linear1 = Linear(1024,64)
		# self.linear2 = Linear(64,10)

		self.model1 = Sequential(
			# 输出32通道是因为发生了32次卷积,输出大小不变是因为有填充边
			# kernel的内容不一样可以理解为不同的特征抓取 --> 一个核会产生一个channel
			# 层数多是为了获取更多的特征而不是偏向某一特征,深度深(在模型不退化的前提下) --> 能提取高级、复杂的特征
			Conv2d(3,32,5,padding=2),
			MaxPool2d(2),
			Conv2d(32, 32, 5, padding=2),
			MaxPool2d(2),
			Conv2d(32, 64, 5, padding=2),
			MaxPool2d(2),
			Flatten(),
			Linear(1024, 64),
			Linear(64, 10)
			# 最后一个线性层的输出往往会经过一个softmax激活函数,以将每个元素转化成表示概率的值
		)

	def forward(self,x):
		# x = self.conv1(x)
		# x = self.maxpool1(x)
		# x = self.conv2(x)
		# x = self.maxpool2(x)
		# x = self.conv3(x)
		# x = self.maxpool3(x)
		# x = self.flatten(x)
		# x = self.linear1(x)
		# x = self.linear2(x)

		x = self.model1(x)
		return x

li = Li()
print(li)
# 检验网络的书写是否正确,不写就算网络结构写错了,也不会报错
input = torch.ones((64,3,32,32))

# 可视化方式 1
output = li(input)
print(output.shape)
# 可视化方式 2
writer = SummaryWriter("./logs_seq")
writer.add_graph(li,input)
writer.close()

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


二、Convolution Layers(卷积层)

在这里插入图片描述

(一)torch.nn.functional 中 conv2d 的使用

在这里插入图片描述

import torch
import torch.nn.functional as F

# Tensor可以传入 size/具体数值/其他的 tensor 来构建一个 tensor
# tensor只能传入数据(可根据所传进行 dtype 设置)
input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])

# 卷积核一开始的大小是自己设置的,卷积核上的每一个位置相当于权重 w,其具体值正是需要学习的
kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

# 只取一个样本->batch_size(样本数量)==1  二维矩阵->channel(图像的通道数)==1
# 4维:[图片数,图层数,宽,高]
input = torch.reshape(input,(1,1,5,5))
kernel = torch.reshape(kernel,(1,1,3,3))

print(input.shape)
print(kernel.shape)

output1 = F.conv2d(input,kernel,stride=1)
print(output1)

output2 = F.conv2d(input,kernel,stride=2)
print(output2)

# padding   
# eg.把 5x5填充成 6x6(用0填充),5x5的边缘数据可以多用几次,以平均利用数据,更好的保留边缘特征,
# 防止某些像素点被多次进行特征提取,导致某些点的作用过于放大了
output3 = F.conv2d(input,kernel,stride=1,padding=1)
print(output3)

在这里插入图片描述

(二)torch.nn 中 Conv2d 的使用

在这里插入图片描述
在这里插入图片描述

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# "./data.txt"存在当前目录
# "../data.txt"存在上一级目录
dataset = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=64)

# 卷积核个数 == 输出通道数
class Li(nn.Module):
	def __init__(self):
		super().__init__()
		self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

	def forward(self,x):
		x = self.conv1(x)
		return x

li = Li()

writer = SummaryWriter("./logs")
step = 0
for data in dataloader:
	imgs,targets = data
	output = li(imgs)
	print(imgs.shape)
	print(output.shape)
	# torch.Size([64, 3, 32, 32])
	writer.add_images("input",imgs,step)
	# torch.Size([64, 6, 30, 30])
	# 直接输不出来 channel=6 的图 --> reshape一下,拼接图片数
	output = torch.reshape(output,(-1,3,30,30)) # -1是一个占位符,表示让Pytorch自动计算该维度的大小
	writer.add_images("output",output,step)
	step = step + 1

在这里插入图片描述

在这里插入图片描述


三、Pooling layers(池化层)

(一)池化层的介绍

在这里插入图片描述

(1)池化层的特点

  1. 没有需要学习的参数
  2. 通道数保持不变
  3. 对微小位置的变化具有鲁棒性
  4. 使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。本质是降采样,可以大幅减少网络的参数

(2)最大池化的目的

  1. 保留输入的重要特征,但同时减小数据量,减小计算压力
  2. 防止过拟合

(3)卷积和池化的区别

卷积:提取特征 <----> 池化:降低特征数据量

(二)MaxPool2d 的使用

在这里插入图片描述

import torch
from torch import nn
from torch.nn import MaxPool2d

input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]],dtype=torch.float32)  
# dtype即datatype,不加这一句会报错:"max_pool2d" not implemented for 'Long'
# float类型和 float6 4类型是一样的,都需要 64个 bits,而 float32 只需要 32个 bits
input = torch.reshape(input,(-1,1,5,5))
print(input.shape)

class Li(nn.Module):
	def __init__(self):
		super().__init__()
		# 池化中默认的 stride 和卷积核一个大小
		# dilatioon(膨胀):空洞卷积
		# ceil_mode:True(核部分覆盖->保留)、False(核部分覆盖->舍弃),默认为 False
		self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)

	def forward(self, input):
		output = self.maxpool1(input)
		return output

li = Li()
output = li(input)
print(output)

在这里插入图片描述

import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10("./dataset",train=False,download=True,transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset,batch_size=64)

class Li(nn.Module):
	def __init__(self):
		super().__init__()
		self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)

	def forward(self, input):
		output = self.maxpool1(input)
		return output

li = Li()

writer = SummaryWriter("logs_maxpool")

step = 0
for data in dataloader:
	imgs,targets = data
	writer.add_images("input",imgs,step)
	output = li(imgs)
	writer.add_images("output",output,step)
	step = step + 1

writer.close()

在这里插入图片描述


四、Non-linear Activations(非线性激活)

(一)非线性激活的目的

激活后就变弯了,弯曲线可以拟合十分复杂的曲线,提高泛化能力

(二)ReLU 与 Sigmoid 的使用

import torch
from torch import nn
from torch.nn import ReLU

input = torch.tensor([[1,-0.5],
                      [-1,3]]) # 有负值的原因:梯度下降,反向传播
input = torch.reshape(input,(-1,1,2,2))
print(input.shape)

class Li(nn.Module):
	def __init__(self):
		super().__init__()
		# inplace(在不在原来的位置替换)
		# ==True:会更改传入的数据(更改器方法),反之不会更改原数据(访问器方法),默认是 False
		self.relu1 = ReLU()

	def forward(self,input):
		output = self.relu1(input)
		return output

li = Li()
output = li(input)
print(output)

在这里插入图片描述

import torchvision
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10("./dataset",train=False,download=True,
                                        transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset,batch_size=64)

class Li(nn.Module):
	def __init__(self):
		super().__init__()
		self.relu1 = ReLU()
		# 三个通道的取值都是 0 ~ 255,用 ReLU 等于没有变化,用 Sigmoid 才能映射到 0 ~ 1 的区间
		self.sigmoid1 = Sigmoid()

	def forward(self,input):
		output = self.sigmoid1(input)
		return output

li = Li()

writer = SummaryWriter("./logs_relu")  # Alt+回车:导入库
step = 0
for data in dataloader:
	imgs,targets = data
	writer.add_images("input",imgs,global_step=step)
	output = li(imgs)
	writer.add_images("output",output,global_step=step)
	step = step + 1

writer.close()

在这里插入图片描述


五、Linear Layers(线性层)及其他层

(一)其他层简介

(二)Linear Layers(线性层/全连接层)— Linear 的使用


在这里插入图片描述

import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10("./dataset",train=False,
									   transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=64,drop_last=True)
# 舍弃掉最后一组不满足数量的批次,不然会报错: mat1 and mat2 shapes cannot be multiplied (1x49152 and 196608x10)

class Li(nn.Module):
	def __init__(self):
		super().__init__()
		self.linear1 = Linear(196608,10)

	def forward(self,input):
		output = self.linear1(input)
		return output

li = Li()

for data in dataloader:
	imgs,targets = data
	print(imgs.shape)
	# output = torch.reshape(imgs,(1,1,1,-1))  # [1,1,1,196608]
	output = torch.flatten(imgs) # 摊平 -> 才可作为全连接的输入
	print(output.shape)
	output = li(output)
	print(output.shape)

# regulation(正则化):用于惩罚较高复杂度的拟合函数,防止过拟合,加速训练
# normalization(标准化/归一化)
# Embedding(嵌入层):存 NPL 中 token 向量

在这里插入图片描述
现在我们会自己去搭建一个网络模型了,但有的时候,我们还可以用Pytorch给我们提供的一些网络模型
在这里插入图片描述


六、损失函数&反向传播

(一)损失函数的作用&与反向传播的联系

(1)损失函数

  1. 计算实际输出和目标之间的差距
  2. 为我们更新输出提供一定的依据(反向传播),即有了损失,才能计算梯度,进而才能更新参数,趋向最优

(2)反向传播

反向传播是用来计算梯度的,给神经网络中每一个需要调优的参数,即给卷积层中每一个卷积核,设置一个梯度,根据梯度来更新参数,实现 Loss 最小化
因为是从 loss 开始推导参数,和网络的顺序相反,所以叫反向传播,梯度的理解可以直接当成“斜率”
在这里插入图片描述

(二)L1Loss、MSELoss、CrossEntropyLoss损失函数的使用

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

# 注:计算机 log 默认以 e 为底,计算器 log 默认以 10 为底
import torch
from torch import nn
from torch.nn import L1Loss, MSELoss

inputs = torch.tensor([1,2,3],dtype=torch.float32)
targets = torch.tensor([1,2,5],dtype=torch.float32)
# tensor 产生时会自带维度,reshape 是为了保证维度符合你想使用函数的特定要求
inputs = torch.reshape(inputs,(1,1,1,3))
targets = torch.reshape(targets,(1,1,1,3))

loss = L1Loss(reduction='sum')
result = loss(inputs,targets)

# mean squared error (均方误差)
loss_mse = MSELoss()
result_mse = loss_mse(inputs,targets)

print(result)
print(result_mse)

# 这里不是概率,只是一个评估分数,后续要经过 softmax (正则化)(激活层) 之后,输出的才是概率,加起来才为 1
x = torch.tensor([0.1,0.2,0.3])
# 代表 x 中需要计算元素 loss 的位置(要计算损失函数的类别),又 batch size==1,这里就没再指定了
y = torch.tensor([1])
x = torch.reshape(x,(1,3))  # (batch size,number of classes)
loss_cross = nn.CrossEntropyLoss()
result_cross = loss_cross(x,y)
print(result_cross)

# 神经网络的两大类主题:回归分类,一般 mse 用于回归,crossentroy 用于分类
# 每个优化器会对应一个优化函数,不同优化函数对应不同损失函数

在这里插入图片描述

(三)如何在之前写的神经网络中用到损失函数&反向传播

在这里插入图片描述

import torchvision
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10("./dataset",train=False,
									   transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=1)

class Li(nn.Module):
	def __init__(self):
		super().__init__()
		self.model1 = Sequential(
			Conv2d(3,32,5,padding=2),
			MaxPool2d(2),
			Conv2d(32, 32, 5, padding=2),
			MaxPool2d(2),
			Conv2d(32, 64, 5, padding=2),
			MaxPool2d(2),
			Flatten(),
			Linear(1024, 64),
			Linear(64, 10)
		)

	def forward(self,x):
		x = self.model1(x)
		return x

loss = nn.CrossEntropyLoss()
li = Li()
for data in dataloader:
	imgs,targets = data
	outputs = li(imgs)
	# 可以先看一下 outputs 和 targets 长什么样,看选择什么样的损失函数
	# print(outputs)
	# print(targets)
	result_loss = loss(outputs,targets)
	# print(result_loss)
	result_loss.backward()
	# outputs 是由卷积核计算出来的,result_loss 是由 outputs 计算的,所以 result_loss 是卷积核中的参数的一个函数

在这里插入图片描述


七、优化器

(一)官方文档解读

在这里插入图片描述
在这里插入图片描述

(二)如何在之前写的神经网络中用到优化器

import torch
import torchvision
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10("./dataset",train=False,
									   transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=1)

class Li(nn.Module):
	def __init__(self):
		super().__init__()
		self.model1 = Sequential(
			Conv2d(3,32,5,padding=2),
			MaxPool2d(2),
			Conv2d(32, 32, 5, padding=2),
			MaxPool2d(2),
			Conv2d(32, 64, 5, padding=2),
			MaxPool2d(2),
			Flatten(),
			Linear(1024, 64),
			Linear(64, 10)
		)

	def forward(self,x):
		x = self.model1(x)
		return x

loss = nn.CrossEntropyLoss()
li = Li()
# lr(learning rate):
# 大 -> 训练的模型很不稳定(一开始)
# 小 -> 模型训练的慢(学到后面),如过后面还用大,模型直接跑过极小值点了
optim = torch.optim.SGD(li.parameters(),lr=0.01)
# 一般要对数据进行多轮学习
for epoch in range(20):
	# 关注每一轮中整体的 loss
	running_loss = 0.0
	for data in dataloader:
		imgs,targets = data
		output = li(imgs)
		result_loss = loss(output,targets)

		optim.zero_grad() # 要清零,上一次计算的梯度对这一次的梯度是没用的,梯度每次计算都会累积,会越来越大
		result_loss.backward()  # 计算每个参数对应的梯度
		optim.step() # 对权重的每个参数进行更新调优
		running_loss = running_loss + result_loss
	print(running_loss)

在这里插入图片描述
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1955993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

加密货币赋能跨境电商:PayPal供应链金融服务如何引领行业新趋势

跨境电商行业近年来呈现出爆发式增长&#xff0c;随着全球化贸易壁垒的降低和数字经济的快速发展&#xff0c;越来越多的商家和消费者跨越国界进行交易。根据eMarketer的数据&#xff0c;全球跨境电商交易额在2023年已超过4万亿美元&#xff0c;并预计在未来几年内仍将保持两位…

Golang | Leetcode Golang题解之第301题删除无效的括号

题目&#xff1a; 题解&#xff1a; func checkValid(str string, lmask, rmask int, left, right []int) bool {cnt : 0pos1, pos2 : 0, 0for i : range str {if pos1 < len(left) && i left[pos1] {if lmask>>pos1&1 0 {cnt}pos1} else if pos2 <…

403 forbidden (13: Permission denied)

403 forbidden (13: Permission denied) 目录 403 forbidden (13: Permission denied) 【常见模块错误】 【解决方案】 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者…

手撕Leetcode个人笔记【第二周-数组-链表】

2. 两数相加 中等 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;…

初识HTML文件,创建自己的第一个网页!

本文旨在初步介绍HTML&#xff08;超文本标记语言&#xff09;&#xff0c;帮助读者理解HTML中的相关术语及概念&#xff0c;并使读者在完成本文的阅读后可以快速上手编写一个属于自己的简易网页。 一、HTML介绍 HTML(全称HyperText Markup Language&#xff0c;超文本标记语言…

探索Python的进度条神器:tqdm

文章目录 探索Python的进度条神器&#xff1a;tqdm一、背二、tqdm简介三、安装tqdm四、tqdm的五个简单使用示例五、tqdm在不同场景下的应用六、常见问题及解决方案七、总结 探索Python的进度条神器&#xff1a;tqdm 一、背 景&#xff1a;为什么选择tqdm&#xff1f; 在Python…

扫雷游戏小程序

目录 一.文件 1.头文件 2.源文件 二.游戏界面和执行(test.c) 三.函数实现(void game部分,源文件game.c) 1.定义雷二维数组和展示二维数组 2.初始化地雷数组 3.初始化显示的数组 4.显示当前的情况 5.随机放置地雷 6.排雷 ps:深度优先遍历数组 四.结束 一.文件 1.头…

基于图卷积神经网络(GCN)的高光谱图像分类详细教程(含python代码)

目录 一、背景 二、基于卷积神经网络的代码实现 1、安装依赖库 2、建立图卷积神经网络 3、建立数据的边 4、训练模型 5、可视化 三、项目代码 一、背景 图卷积神经网络&#xff08;Graph Convolutional Networks, GCNs&#xff09;在高光谱图像分类中是一种有效的方法…

Unity + Hybridclr + Addressable + 微信小程序 热更新报错

报错时机&#xff1a; Generate All 怎么All 死活就是报错 生成微信小程序&#xff0c;并启动后 报错内容&#xff1a; MissingMethodException:AoT generic method notinstantiated in aot.assembly:Unity.ResourceManager:dll, 原因&#xff1a; Hybridclr 开发文档 解…

【人工智能】深度剖析:Midjourney与Stable Diffusion的全面对比

文章目录 &#x1f34a;1 如何选择合适的AI绘画工具1.1 个人需求选择1.2 比较工具特点1.3 社区和资源 &#x1f34a;2 Midjourney VS Stable Diffusion&#xff1a;深度对比与剖析 2.1 使用费用对比 2.2 使用便捷性与系统兼容性对比 2.3 开源与闭源对比 2.4 图片质量对比 2.5 上…

MATLAB基础应用精讲-【数模应用】Poisson 回归分析(附R语言代码实现)

目录 前言 知识储备 基于泊松回归、负二项回归模型 数据分布介绍 模型介绍 模型的选择 案例介绍 算法原理 泊松回归 数学模型 适用条件 参数估计与假设检验 SPSSAU Poisson 回归案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解…

【探索Linux】P.42(传输层 —— TCP面向字节流 | TCP粘包问题 | TCP异常情况 )

阅读导航 引言一、TCP面向字节流二、TCP粘包问题1. 粘包原因2. 粘包类型3. 粘包的影响4. 解决粘包的方法5. 对于UDP协议来说, 是否也存在 "粘包问题" 呢? 三、TCP异常情况温馨提示 引言 继上篇深入剖析TCP协议的拥塞控制、延迟应答和捎带应答之后&#xff0c;本文将…

TCP 协议的 time_wait 超时时间

优质博文&#xff1a;IT-BLOG-CN 灵感来源 Time_Wait 产生的时机 TCP四次挥手的流程 如上所知&#xff1a;客户端在收到服务端第三次FIN挥手后&#xff0c;就会进入TIME_WAIT状态&#xff0c;开启时长为2MSL的定时器。 【1】MSL是Maximum Segment Lifetime报文最大生存时间…

【六】集群管理工具

1. 群控命令 查看java程序的运行状态是最常用的指令。首先在ubuntu1输入该find命令&#xff0c;查找jps位置&#xff0c;需要首先完成java jdk的安装和配置。 find / -name jps回显如下&#xff0c;jps的位置确定了。rootubuntu1:/usr/local/bin# find / -name jps /usr/loca…

C语言 | Leetcode C语言题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; int lengthOfLIS(int* nums, int numsSize) {if(numsSize<1)return numsSize;int dp[numsSize],result1;for(int i0;i<numsSize;i){dp[i]1;}for(int i0;i<numsSize;i){printf("%d ",dp[i]);}for(int i1;i<numsSize;i…

科普文:万字详解Kafka基本原理和应用

一、Kafka 简介 1. 消息引擎系统ABC Apache Kafka是一款开源的消息引擎系统&#xff0c;也是一个分布式流处理平台。除此之外&#xff0c;Kafka还能够被用作分布式存储系统&#xff08;极少&#xff09;。 A. 常见的两种消息引擎系统传输协议&#xff08;即用什么方式把消息…

git 、shell脚本

git 文件版本控制 安装git yum -y install git 创建仓库 将文件提交到暂存 git add . #将暂存区域的文件提交仓库 git commit -m "说明" #推送到远程仓库 git push #获取远程仓库的更新 git pull #克隆远程仓库 git clone #分支&#xff0c;提高代码的灵活性 #检查分…

模板-树上点差分

题目链接&#xff1a;松鼠的新家 图解&#xff1a; 模板&#xff1a; #include <bits/stdc.h> #define int long long using namespace std; const int inf 0x3f3f3f3f3f3f3f3f; const int N 3e55; int n; vector<int>g[N]; int d[N],fa[N][35],dep[N]; int a[…

Java | Leetcode Java题解之第301题删除无效的括号

题目&#xff1a; 题解&#xff1a; class Solution {public List<String> removeInvalidParentheses(String s) {int lremove 0;int rremove 0;List<Integer> left new ArrayList<Integer>();List<Integer> right new ArrayList<Integer>(…

DS1302时钟芯片全解析——概况,性能,MCU连接,样例代码

DS1302概述&#xff1a; 数据&#xff1a; DS1302是一个可充电实时时钟芯片&#xff0c;包含时钟&#xff08;24小时格式或12小时格式&#xff09;、日历&#xff08;年&#xff0c;月&#xff0c;日&#xff0c;星期&#xff09;、31字节RAM&#xff08;断电数据丢失&#x…