java-pytorch 使用手动下载FashionMNIST数据集进行测试

news/2024/6/24 9:13:03/文章来源:https://blog.csdn.net/m0_60688978/article/details/137152572

java-pytorch 使用手动下载FashionMNIST数据集进行测试

    • 先定义训练数据和测试数据的位置
    • 查看一下读取到的标签数据格式
    • 使用loc和iloc访问下数据,便于下面操作
    • 使用read_image函数查看下图片的数据大小
    • 开始写数据集
    • 使用DataLoader去加载我们自己的数据
      • 看下加载后的dataloader数据形状
      • 循环查看下dataloader每个数据的信息
    • 写一个简单的模型,由Linear组成
    • 定义损失函数和优化器
    • 编写测试和训练方法
    • 开始训练
    • 保存模型
    • 加载模型
    • 使用加载的模型进行预测
      • 图片处理
    • 预测
    • 其他
      • 图片灰度处理转tensor
      • 测试某一张图片

  1. 手动下载FashionMNIST数据集,通过https://blog.csdn.net/m0_60688978/article/details/137085740转换为实际的图片和标注
  2. 目的是为了模拟实际业务中,我们往往需要自己采集图片数据和打标签的过程
  3. 因为FashionMNIST数据集图片是28x28,和对应的一个图片和类型的记录文件output.txt

先定义训练数据和测试数据的位置

annotations_file="../data/imageandlableTrain/output.txt"
img_dire="../data/imageandlableTrain"test_img_dire="../data/imageandlableTest"
test_annotations_file="../data/imageandlableTest/output.txt"

查看一下读取到的标签数据格式

import pandas as pdlables=pd.read_csv(annotations_file,header=None)
lables.head(10)
01
0Ankleboot1.jpg9
1T-shirttop2.jpg0
2T-shirttop3.jpg0
3Dress4.jpg3
4T-shirttop5.jpg0
5Pullover6.jpg2
6Sneaker7.jpg7
7Pullover8.jpg2
8Sandal9.jpg5
9Sandal10.jpg5

使用loc和iloc访问下数据,便于下面操作

imageName,lable=lables.loc[3,:]
imageName,lable
('Dress4.jpg', 3)
lables.iloc[2,1]
0

使用read_image函数查看下图片的数据大小

from torchvision.io import read_image
image1=read_image("../data/imageandlableTrain/T-shirttop2.jpg")
type(image1),image1.size(),image1[0].size(),image1
(torch.Tensor,torch.Size([3, 28, 28]),torch.Size([28, 28]),tensor([[[ 0,  0,  1,  ...,  1,  8,  0],[13,  0,  0,  ..., 10,  0,  0],[ 0,  0, 22,  ..., 10,  0,  1],...,[ 0,  0,  0,  ...,  0,  0,  0],[ 0,  0,  0,  ...,  0,  0,  0],[ 0,  0,  0,  ...,  0,  0,  0]],[[ 0,  0,  1,  ...,  1,  8,  0],[13,  0,  0,  ..., 10,  0,  0],[ 0,  0, 22,  ..., 10,  0,  1],...,[ 0,  0,  0,  ...,  0,  0,  0],[ 0,  0,  0,  ...,  0,  0,  0],[ 0,  0,  0,  ...,  0,  0,  0]],[[ 0,  0,  1,  ...,  1,  8,  0],[13,  0,  0,  ..., 10,  0,  0],[ 0,  0, 22,  ..., 10,  0,  1],...,[ 0,  0,  0,  ...,  0,  0,  0],[ 0,  0,  0,  ...,  0,  0,  0],[ 0,  0,  0,  ...,  0,  0,  0]]], dtype=torch.uint8))

开始写数据集

思路很简单,初始化的时候,将output.txt的数据读出来,然后在__getitem__返回单一图片的tensor数据和标签

这里需要注意的是:read_image的结果数据size是torch.Size([3, 28, 28]),而模型需要的[28,28],因此要返回image[0]

from torchvision.io import read_image
from torch.utils.data import Datasetclass CustomImageDataset(Dataset):def __init__(self):
#         获得所有的lablesself.labels=pd.read_csv(annotations_file,header=None)self.imageDir=img_diredef __len__(self):return len(self.labels)def __getitem__(self, idx):imageName,lable=self.labels.loc[idx,:]image=read_image("{}/{}".format(img_dire,imageName))image=image[0]return image,lable
class CustomImageDatasetTest(Dataset):def __init__(self):#         获得所有的lablesself.labels=pd.read_csv(test_annotations_file,header=None)self.imageDir=img_diredef __len__(self):return len(self.labels)def __getitem__(self, idx):imageName,lable=self.labels.loc[idx,:]image=read_image("{}/{}".format(test_img_dire,imageName))image=image[0]return image,lable

使用DataLoader去加载我们自己的数据

from torch.utils.data import DataLoader
train_dataloader = DataLoader(CustomImageDataset(), batch_size=2)
len(train_dataloader)
30000
test_dataloader = DataLoader(CustomImageDatasetTest(), batch_size=2)
len(test_dataloader)
5000

看下加载后的dataloader数据形状

for X, y in train_dataloader:print(f"Shape of X [N, C, H, W]: {X.shape}")print(f"Shape of y: {y.shape} {y.dtype}")break
Shape of X [N, C, H, W]: torch.Size([2, 28, 28])
Shape of y: torch.Size([2]) torch.int64

循环查看下dataloader每个数据的信息

for batch, (X, y) in enumerate(train_dataloader):print(X,batch,X.size(),y,type(y))if batch==2:break
---------------------------------------------------------------------------NameError                                 Traceback (most recent call last)Cell In[35], line 1
----> 1 for batch, (X, y) in enumerate(train_dataloader):2     print(X,batch,X.size(),y,type(y))3     if batch==2:NameError: name 'train_dataloader' is not defined

写一个简单的模型,由Linear组成

import os
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
class NeuralNetwork(nn.Module):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.linear_relu_stack = nn.Sequential(nn.Linear(28*28, 512),nn.ReLU(),nn.Linear(512, 512),nn.ReLU(),nn.Linear(512, 10),)def forward(self, x):x = self.flatten(x)logits = self.linear_relu_stack(x)return logits
model = NeuralNetwork().to("cpu")
print(model)
NeuralNetwork((flatten): Flatten(start_dim=1, end_dim=-1)(linear_relu_stack): Sequential((0): Linear(in_features=784, out_features=512, bias=True)(1): ReLU()(2): Linear(in_features=512, out_features=512, bias=True)(3): ReLU()(4): Linear(in_features=512, out_features=10, bias=True))
)

定义损失函数和优化器

这里重点关注学利率,太低会爆

loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

编写测试和训练方法

测试方法思路也很简单,就是在测试数据中逐一把数据传入到模型中,累计损失和正确率

这里要注意的是正确率的统计,就是预测正确的?累加(pred.argmax(1) == y).type(torch.float).sum().item()



训练思路:固定套路,直接copy

# 测试方法
def test(dataloader, model, loss_fn):size = len(dataloader.dataset)num_batches = len(dataloader)model.eval()test_loss, correct = 0, 0with torch.no_grad():for X, y in dataloader:
#             X, y = X.to(device), y.to(device)pred = model(X.float().unsqueeze(1))test_loss += loss_fn(pred, y).item()correct += (pred.argmax(1) == y).type(torch.float).sum().item()test_loss /= num_batchescorrect /= sizeprint(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")
def train():for batch,(onedatas,lable) in enumerate(train_dataloader):model.train()pred=model(onedatas.float().unsqueeze(1))loss=loss_fn(pred,lable)lossitem=loss.item()# Backpropagationloss.backward()optimizer.step()optimizer.zero_grad()if batch % 100:print(f"loss {lossitem},batch is {batch}")

开始训练

思路就是套路照搬即可

#  训练
for t in range(10):print(f"Epoch {t+1}\n-------------------------------")train()test(test_dataloader, model, loss_fn)
print("Done!")

保存模型

# save model
torch.save(model.state_dict(),"model.pth")
print("Saved Model State to model.pth")
Saved Model State to model.pth
print(model)
NeuralNetwork((flatten): Flatten(start_dim=1, end_dim=-1)(linear_relu_stack): Sequential((0): Linear(in_features=784, out_features=512, bias=True)(1): ReLU()(2): Linear(in_features=512, out_features=512, bias=True)(3): ReLU()(4): Linear(in_features=512, out_features=10, bias=True))
)

加载模型

model = NeuralNetwork().to("cpu")
model.load_state_dict(torch.load("model.pth"))
<All keys matched successfully>

使用加载的模型进行预测

图片处理

  1. 要求灰度 2. 要求28*28 3. 数据是tensor
from PIL import Image# 打开原始图片
image = Image.open('lianxie.jpg')# 调整图片大小
new_size = (28,28) # 新的宽高像素值
resized_image = image.resize(new_size)# 转换成灰度图像
grayscaled_image = resized_image.convert("L")
grayscaled_image
transform_d = transforms.Compose([transforms.ToTensor()
])
image_t = transform_d(grayscaled_image)
plt.imshow(image_t[0])

预测

可以看到output的最大值下表是5,即是预测结果,预实际相符

output=model(image_t)
output
tensor([[ 0.1207, -0.4304,  0.2356,  0.2038,  0.2823, -0.2736,  0.4910, -0.0614,-0.1314, -0.4034]], grad_fn=<AddmmBackward0>)

其他

图片灰度处理转tensor

import torch
import torchvision.transforms as transforms
from PIL import Image# 定义转换管道
grayscale_transform = transforms.Grayscale(num_output_channels=1)  # 灰度转换
tensor_transform = transforms.ToTensor()  # Tensor转换
resized_transform=transforms.Resize((28,28))# 读取图片
image = Image.open("lianxie.jpg")# 应用转换
gray_image = grayscale_transform(image)resized_gray_tensor = resized_transform(gray_image)
gray_tensor = tensor_transform(resized_gray_tensor)gray_tensor,gray_tensor.size()
output=model(gray_tensor)
output
tensor([[ 0.1208, -0.4305,  0.2355,  0.2039,  0.2823, -0.2737,  0.4913, -0.0619,-0.1308, -0.4036]], grad_fn=<AddmmBackward0>)

测试某一张图片

# 排查# Sandal13.jpg,5
# Sandal14.jpg,5image=read_image("{}/Sandal13.jpg".format(img_dire))imageData=image[0].unsqueeze(0)
print("unsqueeze: ",imageData)
print("unsqueeze after size : ",imageData.size())print("original size: ",image.size())output=model(imageData.float())print("output content is ",output)# argmax取值最大的下标
print(output.argmax(1))
# 结论
# 减少学习率即可
unsqueeze:  tensor([[[  0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   0,   0,   3,   8,5,   0,   0,   0,   0,   0,   5,   0,   0,   3,   0,   4,   0,   0],[  0,   0,   0,   0,   0,   0,   0,   0,   2,   1,   0,   0,   0,   0,0,   0,   3,   5,   1,   1,   6,   1,   0,   0,   4,   0,   0,   4],[  0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   0,   6,  12,   6,1,   3,   0,   1,   0,   0,   0,   1,   1,   0,   0,   0,   0,   4],[  0,   0,   0,   0,   0,   0,   0,   0,   7,   1,   0,   1,   1,   0,0,   0,   0,   0,   2,   0,   0,   0,   5,   3,   0,   2,   8,   0],[  0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   7,   0,   0,   0,5,  11,   2,   0,   6,   9,   0,   0,   3,   0,   7,   6,   5,   0],[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   5,   5,0,   0,   7,   0,   0,   9,   2,   0,   4,   0,   0,   0,   0,   0],[  0,   0,   0,   0,   0,   0,   0,   0,   9,   0,   0,   1,   0,   0,3,  29,  62,   3,   0,   3,   0,   0,   6,   0,   0,  20,   9,   0],[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   9,   0,   0,96, 209, 143,  51,   1,   3,   0,   0,   6,   0,   2,  76,  57,   0],[  6,   0,   5,   7,   4,   0,   0,   7,   4,   0,   0,  11,  19, 167,218, 176, 197, 184,   0,   5,   0,  11, 121, 134, 152, 117,  75,   0],[  0,   0,   0,   0,   6,   0,   4,   0,   0,   0,   0,   7,  56, 219,168, 160, 204, 246,  95,  31, 105, 175, 199, 115,  18,   0,   5,   0],[  0,   7,   2,   8,  18,   0,   2,   8,   0,   5,   2,   0,   1, 182,245, 152, 158, 185, 235, 200, 175,  78,   8,  17,  23,   2,  13,   0],[  0,  15,   0,   0,   0,  16,   5,   0,   4,   0,  21,  14,  11,  48,230, 251, 240, 185, 221,  71,   0,  10,   0,   0,   0,   0,  12,   0],[  3,   0,   0,  31,   0,   0,  25, 120, 194,   0,   0,   0,   0,  19,171, 225, 230, 205, 222, 150,   8,   0,   1,  37,  42,  43,  61,  38],[  4,   7,   0,   0,   2, 140, 194, 186, 201, 165,  13,   0,  11,   0,0,  89, 135, 208, 180, 241, 178, 124, 132, 135, 161, 141, 143, 113],[  0,   3,   0,   0,   2, 107, 235, 196, 167, 219,  18,   8,  11,   0,6,  49, 203, 221, 137, 170, 112,  65,  59,  75,  52,  55,  80,  59],[  9,  13,   3,   2,   0,  11, 184, 127,   5, 197, 111,   0,  14,  97,109, 127, 148, 100,  89,  93,  64, 126, 106, 115,  87, 105, 115,  53],[ 40, 109, 121, 120, 106,  91, 198, 207, 121, 187, 255, 127, 126,  96,110,  71,  60,  93,  73,  74,  74,  73,  93,  60,  85,  82,  99,  40],[ 41,  72,  36,  56,  64,  78,  99,  69,  92,  92, 109,  51,  76,  75,84,  79, 104, 102,  74,  94,  94,  76, 105, 107,  60,  63,  87,  22],[ 21,  95,  88, 115,  84, 105,  82,  83,  61,  64,  79,  88,  94,  89,72,  88,  98,  92,  75, 103, 102,  72,  87,  92, 103,  99, 105,  14],[ 17,  84,  79,  90,  66, 104,  73,  97,  75,  95,  96,  91,  75,  78,74,  94,  59,  75,  70,  80,  81,  74,  81,  66,  47,  54,  70,   0],[  0,  78, 122, 127, 108, 109,  70,  90,  93, 102,  94,  85, 103, 115,128, 129, 132, 146, 136, 126, 133, 154, 173, 164, 180, 153, 110,   9],[  0,   4,   6,  21,  70, 108, 103, 108, 105, 103,  95,  86,  98,  61,54,  37,  13,   7,   0,   0,   0,   8,  23,  31,  17,  21,  15,   0],[  0,   6,   2,   2,   0,   0,   0,   5,   0,   8,   0,   0,   5,   0,0,   0,  10,   0,   1,   3,   2,   0,   0,   4,   0,   9,   0,   0],[  0,   1,   0,  16,   0,   0,   3,   1,   0,  15,   0,   0,   2,   3,10,   0,   0,   0,   3,   0,   0,   3,   0,   0,   0,  10,   0,   9],[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0],[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0]]],dtype=torch.uint8)
unsqueeze after size :  torch.Size([1, 28, 28])
original size:  torch.Size([3, 28, 28])
output content is  tensor([[-6.7115,  1.3163, -7.2377, -1.6586,  2.7382,  3.2748, -6.3696, -0.6497,-7.3979, -1.4042]], grad_fn=<AddmmBackward0>)
tensor([5])

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

只出现一次的数字 II

题目链接 只出现一次的数字 II 题目描述 注意点 nums中&#xff0c;除某个元素仅出现一次外&#xff0c;其余每个元素都恰出现三次设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题 解答思路 本题与只出现一次的数字的数字类似&#xff0c;区别是重复的数字会…

Golang 哈希表底层实现原理

1、本文讨论Golang的哈希表 Golang哈希表的实现&#xff0c;底层数据结构是数组单链表&#xff0c;链表节点由8个key、value和键的高八位组成的。为了方便理解&#xff0c;先简单看一个图快速理解。 我们来看一下Golang哈希表的结构体定义 简单介绍一下结构体中几个关键的…

RK3568驱动指南|第十四篇 单总线-第157章 DS18B20驱动框架编写

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

验证码项目(java实现)

1、Kaptcha详细配置 配置项 配置说明 默认值 kaptcha.border 图⽚边框&#xff0c;合法值&#xff1a;yes , no yes kaptcha.border.color 边框颜⾊&#xff0c;合法值&#xff1a; r,g,b (and optional alpha) 或者 white,black,blue black kaptcha.image.width 图⽚宽 200…

【MATLAB源码-第28期】基于matlab的16QAM定时同步仿真,采用gardner算法,Costa锁相环。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交幅度调制&#xff08;QAM&#xff0c;Quadrature Amplitude Modulation&#xff09;是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度&#xff08;π/2&#xff09;的正弦波&#xff0c;因此…

Docker安装教程

1. 安装yum 你的虚拟机需要联网以及yum哦~~ yum -y install docker-ce 1.1 NO package docker-ce available 在执行以上命令时出现以下错误。 NO package docker-ce available. Error: Nothing to do 解决方法&#xff1a; (1) 更新yum&#xff0c;使用yum -y upgrade(耗…

qt窗口的应用与pyinstaller打包APP操作

3月29日 qt打包APP操作 1 先在windows shell 中下载打包软件Pylnstaller pip install pyinstaller2 先进入py项目所在的位置&#xff0c;再执行以下代码(我用的qt版本是PySide6可以根据自己的情况修改) pyinstaller s02.py --noconsole --hidden-import PySide6.QtXml3 因为…

Junit深入讲解(JAVA单元测试框架)

1、此处用的是Junit5&#xff0c;此处pom文件需要引的依赖是 <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.1</version><scope>test</scope></depende…

Windows部署VisualSVN服务端结合Cpolar实现公网访问内网管理界面

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

蓝桥杯速成5-AD/DA模数转换

一、原理图 上图可知该芯片使用的是iic时序&#xff0c;而不是51单片机的xpt2046时序&#xff0c;iic我们都很熟悉了吧 并且大赛还提供了我们iic底层驱动代码 左上角有AIN0-4四个转换输入通道&#xff0c;和AOUT一个输出通道&#xff0c;由控制字节选择 地址字节&#xff1a;0x…

交通标志识别项目 | 基于Tensorflow+SSD实现道路交通标志识别

项目应用场景 面向智能驾驶或自动驾驶场景道路道路交通标志的识别&#xff0c;在交通标志识别的基础上为下一步的智能决策提供前提 项目效果&#xff1a; 项目细节 > 具体参见项目 README.md (1) 安装依赖 Python3.5、TensorFlow v0.12.0、Pickle、OpenCV-Python、Matplotl…

如何在Ubuntu系统部署Z-blog博客结合cpolar实现无公网IP访问本地网站

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

Rust 机器学习图形库 petgraph

一、介绍 Petgraph 是一个开源的图数据结构库&#xff0c;提供了非常丰富的图形类型和算法&#xff0c;并且支持将图形以 Graphviz 格式输出&#xff0c;还允许你为图的节点和边赋予任意类型的数据&#xff0c;从而能够灵活地处理和表示复杂的数据关系。 Petgraph 支持边的方…

FFmpeg 详解

FFmpeg 详解 FFmpeg 详解整体结构不同下载版本的区别常用库常用函数初始化封装格式解码器 版本对比组件注册方式对比FFmpeg 3.x 组件注册方式FFmpeg 4.x 组件注册方式 结构体比对函数对比avcodec_decode_video2()vcodec_encode_video2() 数据结构结构体分析AVFormatContextAVIn…

安全SCDN的威胁情报库对DDOS防护有什么好处

目前网络攻击事件频频发生&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击已成为各种企业&#xff08;小到区域性小公司大到各种跨国公司&#xff09;的主要威胁&#xff0c;DDoS 攻击可能会对企业造成重大损害和破坏&#xff0c;比如对目标公司的业务造成产生不利…

什么是ISP住宅IP?相比于普通IP它的优势是什么?

什么是ISP住宅IP&#xff1f; ISP住宅IP是指由互联网服务提供商&#xff08;ISP&#xff09;分配给住宅用户的IP地址。它是用户在家庭网络环境中连接互联网的标识符&#xff0c;通常用于上网浏览、数据传输等活动。ISP住宅IP可以是动态分配的&#xff0c;即每次连接时都可能会…

HarmonyOS 应用开发之PageAbility组件

PageAbility组件概述 PageAbility是包含UI、提供展示UI能力的应用组件&#xff0c;主要用于与用户交互。 开发者通过DevEco Studio开发平台创建PageAbility时&#xff0c;DevEco Studio会自动创建相关模板代码。PageAbility相关能力通过单独的featureAbility实现&#xff0c;…

每天五分钟深度学习:神经网络和深度学习有什么样的关系?

本文重点 神经网络是一种模拟人脑神经元连接方式的计算模型&#xff0c;通过大量神经元之间的连接和权重调整&#xff0c;实现对输入数据的处理和分析。而深度学习则是神经网络的一种特殊形式&#xff0c;它通过构建深层次的神经网络结构&#xff0c;实现对复杂数据的深度学习…

mongodb sharding分片模式的集群数据库,日志治理缺失导致写入数据库报错MongoWriteConcernException的问题总结(下)

一、接着上文 上文介绍了mongodb sharding的分片集群搭建&#xff0c;本文侧重于讲述日志治理。 这里使用linux自带的日志治理工具logrotate&#xff0c;无论是哪个端口的进程&#xff0c;其日志治理方式类似。 查看/data目录下的文件大小&#xff0c; du -hs *二、Logrota…

Docker_介绍

Docker概念介绍 1. Docker架构 从上图得知&#xff0c;Docker分为三部分&#xff0c;客户端&#xff0c;Docker服务端&#xff0c;仓库。 1.1 客户端 平常我们使用的就是客户端&#xff0c;通过客户端命令和Docker引擎进行交互 Docker 是一个客户端-服务器&#xff08;C/S&…