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

news2024/11/26 10:41:11

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 pd

lables=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 Dataset

class CustomImageDataset(Dataset):
    def __init__(self):
#         获得所有的lables
        self.labels=pd.read_csv(annotations_file,header=None)
        self.imageDir=img_dire
        
    def __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):
    #         获得所有的lables
        self.labels=pd.read_csv(test_annotations_file,header=None)
        self.imageDir=img_dire

    def __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, 0
    with 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_batches
    correct /= size
    print(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()

        # Backpropagation
        loss.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])
<matplotlib.image.AxesImage at 0x1fabef58520>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测

可以看到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,5

image=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.coloradmin.cn/o/1554315.html

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

相关文章

亚马逊跨境电商迎来崭新时代,武汉星起航携手卖家共赴新征程

随着全球经济一体化的深入发展&#xff0c;跨境电商已成为推动国际贸易的重要力量。据最新数据显示&#xff0c;2023年中国跨境电商出口规模达到1.83万亿元&#xff0c;同比增长19.6%&#xff0c;增速远超电商行业整体水平。在这一背景下&#xff0c;2024年有望成为中国跨境电商…

ForkJoinPool、CAS原子操作

ForkJoinPool ForkJoinPool是由JDK1.7后提供多线程并行执行任务的框架。可以理解为一种特殊的线程池。 1.任务分割&#xff1a;Fork&#xff08;分岔&#xff09;&#xff0c;先把大的任务分割成足够小的子任务&#xff0c;如果子任务比较大的话还要对子任务进行继续分割。 …

构造器练习

练习一 题目 案例&#xff1a; (1)定义Student类,有4个属性&#xff1a;String name;int age;String school;String major;(2)定义Student类的3个构造器:- 第一个构造器Student(String n, int a)设置类的name和age属性&#xff1b; - 第二个构造器Student(String n, int a, St…

大话设计模式之策略模式

策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。这种模式定义了一族算法&#xff0c;将每个算法都封装起来&#xff0c;并且使它们之间可以互相替换。 在策略模式中&#xff0c;一个类的行为或其算法可以在运行时改变。这种模式包含以下角色&#xff1…

2024/3/29 IOday2

所有人&#xff0c;今日作业&#xff1a;用fwrite 和 fseek功能&#xff0c;将一张bmp格式的图片更改成 德国国旗 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {FILE* fpfopen("./rising_free…

android 集合总结

1 集合分类&#xff0c; collection和map两大类,Iterator接口是提供遍历任何Collection的接口&#xff0c;不是map 2 集合类的底层实现 hashset基于hashmap实现&#xff08;只不过HashSet里面的HashMap所有的value都是同一个Object而已&#xff09; treeset由红黑树实现 …

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍基于STC12C5A60S2系列1T 8051单片机通过单个按…

代码随想录刷题day38|斐波那契数爬楼梯最小花费爬楼梯

文章目录 day38学习内容一、动态规划理论基础1.1、动态规划理论基础的几个关键概念&#xff1a;1.2、动态规划五部曲 二、斐波那契数2.1、动态规划五部曲2.1.1、 确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.1.2、确定递推公式2.1.3、 dp数组如何初始化2.1.4、…

带你了解万向锁与欧拉角

万向锁与欧拉角 附赠自动驾驶学习资料和量产经验&#xff1a;链接 前言 上一篇中我们讲了欧拉角与旋转变化&#xff0c;最后留了一个悬念&#xff0c;就是欧拉角在俯仰角为90时会出现万向锁现象&#xff0c;这是欧拉角表征飞行器姿态的一个局限性&#xff0c;今天我们就来谈谈…

Spring-01

Spring 1.Spring是什么? spring是一个开源的Java应用框架&#xff0c;它提供了一套全面的基础设施支持 2.Spring框架的主要特点 1&#xff09;依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09; 2&#xff09;面向切面编程&#xff08;AOP&#xff09…

智慧旅游中数据可视化的革新作用

在数字化浪潮席卷全球的今天&#xff0c;数据可视化技术已成为链接信息与用户的重要桥梁&#xff0c;尤其在智慧旅游领域&#xff0c;它的作用更是日益凸显。随着智慧旅游的概念越来越被重视&#xff0c;数据可视化成为其提供高效、直观服务的关键手段之一。本文将探讨数据可视…

K8S安装和部署(kubeadmin安装1主2从)

这里用kubeadmin方式进行安装部署 1. 准备三台服务器 服务器地址 节点名称 192.168.190.200 master 主 192.168.190.201 node1 从 192.168.190.202 node2 从 2. 主机初始化&#xff08;所有主机&#xff09; 2.1根据规划设置主机名 #切换到192.168.190.200 hostnamectl…

每天五分钟卷积神经网络:如何基于滑动窗口技术完成目标的检测?

汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…

深入解析Java继承机制:面向对象编程的核心探究【Java面试题】

作为一名对技术充满热情的学习者&#xff0c;我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代&#xff0c;我远非专家&#xff0c;而是一位不断追求进步的旅行者。通过这篇博客&#xff0c;我想分享我在某个领域的学习经验&#xff0c;与大家共同探讨、共…

如何看待各省纷纷成立数据管理局?

截至2024年1月&#xff0c;我国今年已有11个省市级数据局揭牌成立&#xff0c;包括江苏省数据局、四川省数据局、内蒙古自治区政务服务与数据管理局、上海市数据局、云南省数据局、青海省数据局、河北省数据和政务服务局、湖南省数据局、广东省政务服务和数据管理局、天津市数据…

PCI总线管脚定义(引脚定义)

文章目录 1&#xff1a; 参考资料的链接2: 图片说明3&#xff1a;PCI文字说明每日好图 1&#xff1a; 参考资料的链接 PCI bus pinout PCI三种标准引脚信号定义 PCI bus pinout 2: 图片说明 A面和B面正反 PCI Universal Card 32/64 bit ----------------------------------…

docker 的mysql容器中没有mysqlbinlog

docker 的mysql容器中没有mysqlbinlog bug信息原因&#xff1a;阉割版mysql容器&#xff0c;构建者没有把mysqlbinlog当成必需工具&#xff0c;去掉了解决方法&#xff1a;验证成功删除无用的文件5.7开启binlog&#xff0c;&#xff08;8 的默认开启了&#xff09;5.7版本的mys…

【论文阅读】ELA: Efficient Local Attention for Deep Convolutional Neural Networks

&#xff08;ELA&#xff09;Efficient Local Attention for Deep Convolutional Neural Networks 论文链接&#xff1a;ELA: Efficient Local Attention for Deep Convolutional Neural Networks (arxiv.org) 作者&#xff1a;Wei Xu, Yi Wan 单位&#xff1a;兰州大学信息…

高效测量“芯”搭档 | ACM32激光测距仪应用方案

激光测距仪概述 激光测距仪是利用激光对目标的距离进行准确测定的仪器。激光测距仪在工作时向目标射出一束很细的激光&#xff0c;由光电元件接收目标反射的激光束&#xff0c;计时器测定激光束从发射到接收的时间&#xff0c;计算出从观测者到目标的距离。激光测距仪分为手持激…

4核8G服务器租用优惠价格418元一年,可买3年

京东云4C8G云服务器优惠价格418元1年、1899元三年&#xff0c;配置为&#xff1a;轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云主机优惠活动 atengyun.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如下图&#xff1a; 京东…