[Python] 从0到1实现一个简单的数字图像识别大模型

news2024/11/13 9:13:41

目录

前言介绍

神经网络

简单的神经网络

使用均方误差与正规方程实现神经网络

随机梯度下降与批量梯度下降实现神经网络

用更复杂的梯度下降实现一个神经网络

利用Sigmoid激活函数实现神经网络

使用 PyTorch 框架快速构建一个神经网络、

案例实战


前言介绍

        大模型的本质是机器学习, 机器学习的本质就是一种数学模型,而现在主流的大模型都是基于神经网络模型构建的数学模型,不论是基于卷积神经网络(CNN),还是循环神经网络(RNN),亦或者是Transformer神经网络等。‍‍‍‍‍‍‍‍所以所谓的大模型,就是一个很复杂的函数,训练它的样本集很大、参数很多。

        神经网络模型是一种基于人工神经元的数学模型,用于模拟人脑的神经网络结构和功能。 神经网络模型有很多层,每一层都有很多个神经元,每一层又是相互连接。每个神经元又由很多参数组成,平时我们常常所说的某个大模型有多少亿参数,就是指所有神经元加起来参数之和。参数越多,大模型的功能就越强大。

        

         一般情况下,大模型的参数是在网络架构时就设定好的,参数数量一般不会发生变化;但也有例外情况,比如动态神经网络就会对参数数量进行动态调整。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

        大模型训练的本质就是调整参数,训练的过程其实就是把训练数据输入到大模型中,然后模型根据这些数据对参数进行调整的过程,以求达到一个最优解。因为模型有多个神经层,所以训练数据从输入层进入大模型之后;需要在模型的多个神经层之间进行流转,而这个过程术语叫做正向传播。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

        数据从输入层,一层一层的传播到输出层,然后输出结果;但由于大模型刚开始就像一个小学生,所以它输出的结果往往不尽人意。‍‍‍‍‍‍‍‍所以,为了解决这个问题,大模型的输出结果需要跟实际结果进行匹配,术语叫做计算损失差,损失差越大说明输出结果越差。‍‍‍‍‍‍‍‍‍‍‍‍‍

        而有了损失差,说明当前的模型是有问题的;所以就需要对模型进行调整,这就是所谓的反向传播。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

神经网络

        大模型是基于神经网络构建的。接下来,我们将通过多种数学模型来实现神经网络的优化。

  • 简单的神经网络

         对于 ypi = w * xi 函数,其实是属于神经网络中的一层,w 是参数,大模型训练调整的就是这个参数。而 xi 和 ypi 在数学中是自变量和因变量,而在神经网络中,它是样本数据,是固定的,也叫训练数据。

        在训练中,不断的根据预测值和真实值,算出他们之间的误差,然后调整 w 的值,误差越小,代码模型预测能力越好。

 训练数据代码

import numpy as np

def get(count):
    # 生成count个0-1之间随机数
    xs = np.sort(np.random.rand(count))

    ys = []
    for x in xs:
        y = 1.5 * x + np.random.rand() / 10
        ys.append(y)
    ys = np.array(ys)

    # 变为负数
    # xs = xs * -1
    # ys = ys * -1

    return xs, ys

 神经网络代码

import matplotlib.pyplot as plot

import house

xs, ys = house.get(100)
w = 0.5
for i in range(100):
    xi = xs[i]
    yi = ys[i]

    ypi = w * xi  # 预测值  正向传播
    e = yi - ypi  # 误差
    w = w + e * xi  # 根据误差修改w  反向传播

    # 以下只是为了画出新预测函数对应的直线
    yps = w * xs  # 新的预测函数
    plot.clf()  # 清空重新绘制,这样就能看到动态效果
    plot.xlim(0, 1) #设置了 x 轴的显示范围
    plot.ylim(0, 1.6) #设置了 y 轴的显示范围
    plot.scatter(xs, ys) #绘制了一个散点图
    plot.plot(xs, yps) #绘制了一条折线图
    plot.pause(0.1) #暂停图形的显示 0.1 秒

plot.show() #显示当前绘制的图形

运行结果如下:

        通过运行结果可以看出,函数 ypi = w * xi 的直线不断的靠近散点样本数据,代表误差越来越小,预测能力也越来越好。

  •  使用均方误差与正规方程实现神经网络

           上面例子实现的简单的神经网络,是根据预测值和真实值,算出他们之间的误差,进而调整参数值,但受样本的数据影响很大,如果最后一个样本数据存在问题,就会导致整个训练过程报废。

        针对上面出现的问题,就可以使用均方误差和正规方程来解决,所谓均方误差,就是把所有的误差相加,再除以样本数。

        单个样本的误差计算方式为:(真实值-预测值​)²,用函数来表示就是 e = ( yi − w⋅xi )²,有人会很奇怪,误差为什么要加平方,其实是为了消除负值,那误差不是变大了?其实没关系,因为我们关注的是 w 这个参数值。

 将误差公式展开为:

这样,对于某个样本(xi,yi)而言,就可以通过上述公式来计算误差e了,我们稍微调整一下位置:

通过上述公式,可以看出,如果我们把w看成自变量,e看成因变量,xi和yi看成常量,那么其实就是一个一元二次函数,对应的就是一条抛物线。

而针对所有样本,我们要计算全部样本的整体误差,我们只需要计算所有样本的误差e,然后累计e,再除以样本个数就得到了全体样本的均方误差

        拆开后:

所以,针对全体样本的均方误差也是一个一元二次方程,也是一个抛物线,而且是开口向上的抛物线,所以抛物线的最低点就表示误差最小的点,而根据抛物线的最地方求解公式就能得到 。

而对应的抛物线的顶点就是所有样本的评价误差最小值。而根据抛物线的顶点坐标公式:

而w是自变量,所以最小w值为 -b/(2a),也就是

约分之后就是:

 而这就是正规方程。通过它就能直接得到误差e最小时的w值。

代码:

import matplotlib.pyplot as plot

import house

xs, ys = house.get(100)
ys[99] = 2

w = 0.5

sum_xy = 0
sum_xx = 0
for i in range(100):
    xi = xs[i]
    yi = ys[i]
    sum_xy += xi * yi
    sum_xx += xi * xi

w = sum_xy / sum_xx

yps = w * xs

plot.clf()
plot.xlim(0, 1)
plot.ylim(0, 1.6)
plot.scatter(xs, ys)
plot.plot(xs, yps)

plot.show()

  • 随机梯度下降与批量梯度下降实现神经网络

          使用均方误差与正规方程实现神经网络,虽然能很好解决因某个样本而导致训练的不准确,但需要对样本数据进行累加,如果样本量太多,就会过多占用服务器CPU,内存等资源,接下来使用梯度下降来解决这个问题。

        还是看误差抛物线,我们不直接取 w 的最低点计算,而且取 w 点的斜率 来不断地调整 w 值。让 w 值不断趋向于最低点。

              1.  抛物线上某个点的斜率如果小于0,那么表示在右边。

              2. 抛物线上某个点的斜率如果大于0,那么表示在左边。

              3. 抛物线上某个点的斜率如果等于0,那么表示在最低点。

误差抛物线图

那么某点的斜率该如何得出呢?实际上就是求导。

求导

假设抛物线上存在某点(w,e),那么该点的斜率为:

这样,我们就能知道某个w对应的斜率了。

其中:

对于给定的样本集而言,a,b的值是固定的,所以我们只需要不断调整 w 的值就可以了。对于 a 和 b 为什么等于上面两个值,大家可以上面 均方误差与正规方程那里。

那如何调整 w 的值呢?

        像我们上面所说的,抛物线上某一点的斜率小于 0 的话(参考上面误差抛物线图),那边代表在右边,这时我们只要增加 w 的值就可以,那增加多少呢?这时我们可以自己设置一个大小,步长越大,调整的越快,但是精确度越低,步长越小,调整的越慢,但是精确度越高。这个在深度学习中叫步长。调整公式如下:

w新 = w旧 - 步长 * 斜率

如果某一点上的斜率大于 0 的话,则相反,减小 w 的值就行。

代码实战 - 随机梯度下降

import matplotlib.pyplot as plot

import house

xs, ys = house.get(100)

alpha = 0.1  # 学习率,步长
w = 0.1
for i in range(100):
    xi = xs[i]
    yi = ys[i]

    # 斜率
    k = 2 * (xi ** 2) * w + (-2 * xi * yi)

    w = w - alpha * k  # k大于0,要减少w,k小于0,要增加w

    yps = w * xs  # 新的预测函数

    plot.clf()  # 清空重新绘制,这样就能看到动态效果
    plot.xlim(0, 1)
    plot.ylim(0, 1.6)
    plot.scatter(xs, ys)
    plot.plot(xs, yps)
    plot.pause(0.01)

plot.show()

上面代码一个一个的取样本的数据,如果你觉得慢,想批量的 取,可以使用mini批量梯度下降。

代码实战 - mini批量梯度下降

import matplotlib.pyplot as plot
import numpy

import house

xs, ys = house.get(100)

w = 0.1
alpha = 0.1  # 学习率,步长
for _ in range(50):
    # 每次取10个样本
    for i in range(0, 100, 10):
        xsi = xs[i::i + 10]
        ysi = ys[i::i + 10]

        a = numpy.sum(xsi ** 2) / 10
        b = -2 * numpy.sum(xsi * ysi) / 10

        k = 2 * a * w + b  # k表示w点的斜率

        w = w - alpha * k  # k大于0,要减少w,k小于0,要增加w

        yps = w * xs  # 新的预测函数

        plot.clf()  # 清空重新绘制,这样就能看到动态效果
        plot.xlim(0, 1)
        plot.ylim(0, 1.6)
        plot.scatter(xs, ys)
        plot.plot(xs, yps)
        plot.pause(0.01)

plot.show()

  • 用更复杂的梯度下降实现一个神经网络

        如果样本数据这样的话,我们该如何设计的神经网络?

前面我们设计的函数都是y = wx,而忽略了 b ,而对于上面的样本,我们就需要用到 b 这个参数。

w 决定了直线的倾斜,而 b 决定了 直线的高度。

那我们该如何设计,使得函数直线更贴近样本数据呢?

        我们还是可以使用梯度下降来解决,通过不断地调整 w 和 b 的值,找到整体误差最小的 w 和 b的值,均方误差公式:

将误差公式展开调整为:

我们可以把样本和 b 都看成常量,e 和 w 之间还是一条抛物线。

因为我们不仅需要调整 w 的值,还需要调整 b 的值, 此时我们需要同时对 w 和 b进行求导。然后进行梯度下降。

e 对 w 的导数:

e 对 b 的导数:

代码实战 :

import numpy as np


def get(count):
    # 生成count个0-1之间随机数
    xs = np.sort(np.random.rand(count))

    ys = []
    for x in xs:
        y = 1.5 * x + np.random.rand() / 10
        ys.append(y)
    ys = np.array(ys)

    # 变为负数
    # xs = xs * -1
    # ys = ys * -1

    # 倒置
    xs = np.flip(xs)

    return xs, ys
import matplotlib.pyplot as plot
import house

xs, ys = house.get(100)

plot.plot(xs, ys)

w = 0.1
b = 0.1
alpha = 0.1  # 学习率,步长

# 15表示epoch
for _ in range(15):
    for i in range(100):
        xi = xs[i]
        yi = ys[i]
        dw = 2 * (xi ** 2) * w + 2 * xi * (b - yi)
        db = 2 * b - 2 * (yi - w * xi)

        w = w - alpha * dw
        b = b - alpha * db

        yps = w * xs + b  # 新的预测函数

        plot.clf()  # 清空重新绘制,这样就能看到动态效果
        plot.xlim(0, 1)
        plot.ylim(0, 1.6)
        plot.scatter(xs, ys)
        plot.plot(xs, yps)
        plot.pause(0.01)

plot.show()

运行结果如下:

  •  利用Sigmoid激活函数实现神经网络

        如果样本又是怎么样的呢?

 像这种样本数据是这种分散的, 我们再用直接来设计我们神经网络是不行的,这时我们就需要曲线。

 我们可以直接用激活函数,常见的激活函数有:

 而我们上面的样本数据,可以用 Sigmoid 激活函数,Sigmoid 函数的公式是

 Sigmoid 函数图如下, 竟然是一条直线,真是让人惊呆了。不是说好了曲线吗?竟然不按套路出牌,这其实是 Sigmoid 函数很受样本数据的影响,对 x 的取值范围是有要求的,如果样本集太小的话,就像下面那样,展示出来是一条直线。

 

 那如何解决这个问题?

我们可以结合线性函数和sigmoid函数来解决这个问题:

  1. 保持样本集不变,将样本输入线性函数,得到线性函数的结果y
  2. 再把线性函数的输出结果,输入到 sigmoid 函数,得到 sigmoid 函数的结果 z
  3. 判断 z 和样本真实值之间的误差 e,通过不断调整线性函数的 w 和 b,使得误差 e 越来越小

在这个过程中,就能通过不断调整w和b的值,使得原本的样本x的值,经过线性函数后,得出的结果能符合sigmoid的范围。

线性函数为:

 Sigmoid 函数为:

 线性函数的值,需要传给 Sigmoid 函数,则预测函数为

 我们还是使用梯度下降的方式来找到误差最小的点,来调整 w 和 b 的值,也就是求 导。

均方误差:

 对于这种复杂函数的求导,我们可以做拆分

那么:

  • e对w的导数,为e对k的导数*k对t的导数*t对w的导数
  • e对b的导数,为e对k的导数*k对t的导数*t对b的导数

e对k的导数为:

k对t的导数为:

t对w的导数为:

t对b的导数为:

代码实战:

import numpy as np

def get(counts):
    xs = np.sort(np.random.rand(counts))
    ys = []
    for i in range(counts):
        if i < counts / 2:
            ys.append(0)  
        else:
            ys.append(1) 
    ys = np.array(ys)

    return xs, ys
import matplotlib.pyplot as plot
import numpy

import house

xs, ys = house.get(100)

w = 0.1
b = 0.1

for j in range(1000):
    for i in range(len(xs)):
        xi = xs[i]
        yi = ys[i]

        t = w * xi + b
        k = 1 / (1 + numpy.exp(-t))
        e = (yi - k) ** 2

        dedk = -2 * (yi - k)
        dkdt = k * (1 - k)
        dtdw = xi
        dtdb = 1

        dedw = dedk * dkdt * dtdw
        dedb = dedk * dkdt * dtdb

        alpha = 0.1  # 学习率,步长
        w = w - alpha * dedw
        b = b - alpha * dedb

    if (j % 100 == 0):
        yps = 1 / (1 + numpy.exp(-(w * xs + b)))  # 新的预测函数
        plot.clf()  # 清空重新绘制,这样就能看到动态效果
        plot.xlim(0, 1)
        plot.ylim(-0.2, 1.2)
        plot.scatter(xs, ys)
        plot.plot(xs, yps)
        plot.pause(0.01)

plot.show()

运行结果如下:

  •  使用 PyTorch 框架快速构建一个神经网络、

      上面创建神经网络的流程都好复杂,可以直接使用 PyTorch 框架,快速构建一个神经网络 , PyTorch 是 Python 语言开发的深度学习框架,专门针对 GPU加速的深度神经网络编程。

Github 地址:https://github.com/pytorch/pytorch

官网:https://pytorch.org/

论坛:https://discuss.pytorch.org/

代码实战:

import matplotlib.pyplot as plt
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader

# 数据
xs = np.array([0.00335400, 0.01282081, 0.03225714, 0.0418231, 0.06224218, 0.06963194,
               0.08320899, 0.08896305, 0.10781348, 0.12513706, 0.12787409, 0.15146274,
               0.16579344, 0.17624051, 0.18054, 0.19480951, 0.29320166, 0.29657286,
               0.31641167, 0.32839255, 0.33380987, 0.34495281, 0.37497198, 0.39868539,
               0.44614808, 0.46220023, 0.48874932, 0.51609881, 0.52824768, 0.54047126,
               0.54360899, 0.54395718, 0.55205861, 0.56033965, 0.57219896, 0.65985412,
               0.66736228, 0.67859612, 0.68135888, 0.68427166, 0.68967927, 0.73490296,
               0.76824992, 0.77612128, 0.79795515, 0.84028841, 0.90513846, 0.92928611,
               0.93766008, 0.9655463])
ys = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
               1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
               1, 1])

class CustomDataset(Dataset):
    def __init__(self, xs, ys):
        self.xs = torch.tensor(xs, dtype=torch.float32).view(-1, 1)
        self.ys = torch.tensor(ys, dtype=torch.float32).view(-1, 1)

    def __len__(self):
        return len(self.xs)

    def __getitem__(self, idx):
        return self.xs[idx], self.ys[idx]

# 模型定义
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.layer1 = nn.Linear(1, 3)
        self.layer2 = nn.Linear(3, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = self.sigmoid(self.layer1(x))
        x = self.sigmoid(self.layer2(x))
        return x

dataset = CustomDataset(xs, ys)
batch_size = 8
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

model = SimpleModel()


# 损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=1.0)

# 训练模型
epochs = 20000
for epoch in range(epochs):
    for batch_xs, batch_ys in dataloader:
        model.train()
        optimizer.zero_grad()
        outputs = model(batch_xs)
        loss = criterion(outputs, batch_ys)
        loss.backward()
        optimizer.step()
    if (epoch + 1) % 5000 == 0:
        print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item()}')

# 预测
model.eval()
with torch.no_grad():
    predictions = model(torch.tensor(xs, dtype=torch.float32).view(-1, 1)).numpy()

# 绘图
plt.scatter(xs, ys)
plt.plot(xs, predictions)
plt.show()

运行结果如下:

案例实战

自定义神经网络实现手写体数字图像识别

# 定义模型
import torch
from torch import nn


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 200)
        self.fc2 = nn.Linear(200, 200)
        self.fc3 = nn.Linear(200, 200)
        self.fc4 = nn.Linear(200, 10)

    def forward(self, x):
        x = x.view(-1, 784)  # 展平图像为一维向量
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = torch.relu(self.fc3(x))
        x = self.fc4(x)
        return x
import torch
import torch.nn as nn
import torch.optim as optim
from torch.nn.functional import one_hot
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

from net import Net

device = torch.device('cpu')

# 定义转换操作
transform = transforms.Compose([
    transforms.ToTensor()
])

# 加载MNIST数据集
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)

# 创建数据加载器
train_loader = DataLoader(dataset=train_dataset, batch_size=6000, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=1000, shuffle=False)


# 实例化模型
model = Net()
model = model.to(device)

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=1)

# 训练模型
for epoch in range(200):
    for i, (images, labels) in enumerate(train_loader):
        images = images.to(device)
        labels = labels.to(device)

        # 转换标签为one-hot编码
        labels = one_hot(labels, num_classes=10).float()

        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    print(f'Epoch [{epoch+1}/200], Loss: {loss.item():.4f}')

# 保存模型
torch.save(model.state_dict(), "best.pt")
import torch
from PIL import Image
from torchvision import transforms

from net import Net

device = torch.device('cpu')

model = Net()
model = model.to(device)

# 加载训练好的模型权重
model.load_state_dict(torch.load("best.pt"))

# 定义转换操作
transform = transforms.Compose([
    transforms.ToTensor()
])


def load_image(image_path):
    image = Image.open(image_path).convert('L')  # 转换为灰度图像
    image = transform(image)
    image = image.unsqueeze(0)  # 添加批次维度
    return image

# 从https://huggingface.co/datasets/ylecun/mnist?image-viewer=image-0-5F2BE6C77CB0003C82CE3E8D89EDAE0F36E709EC下载图片到项目中
image_path = './img.png'

image = load_image(image_path)
image = image.to(device)

model.eval()
with torch.no_grad():
    outputs = model(image)
    _, predicted = torch.max(outputs.data, 1)
    print(f'Predicted label: {predicted.item()}')

 运行结果如下:

Predicted label: 5

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

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

相关文章

python-网页自动化(二)

获取元素属性 1. 获取属性 以百度首页的logo为例&#xff0c;获取logo相关属性 <img hidefocus"true" id"s_lg_img" class"index-logo-src" src"//www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" width"270…

微服务-nacos

nacos-注册中心 启动 服务注册到nacos

【MIT 6.5840/6.824】In Search of an Understandable Consensus Algorithm 学习笔记

In Search of an Understandable Consensus Algorithm 1 Introduction2 Replicated state machines3 What’s wrong with Paxos?4 Designing for understandability5 The Raft consensus algorithm5.1 Raft basics5.2 Leader election5.3 Log replication5.4 Safety5.4.1 Elec…

知识付费最新版知识付费做的最好的平台,网创资源知识付费 知识付费网站搭建,搭建知识付费APP平台教学:在线教育系统源码。

目录 前言&#xff1a; 一、知识付费平台特点 二、知识付费平台功能 三、 知识付费小程序 前言&#xff1a; 知识付费小程序是一种在线学习平台&#xff0c;用户可以通过该小程序以一定的费用获取专业知识和技能。这些知识和技能可以来自行业专家、教育机构或个人创作者。知…

Docker 容器技术:简化 MySQL 主从复制部署与优化

文章目录 前言一、为什么基于Docker搭建&#xff1f;二、利用Docker搭建主从服务器2.1 配置Master&#xff08;主&#xff09;2.2 配置Slave&#xff08;从&#xff09;2.3 链接Master&#xff08;主&#xff09;和Slave&#xff08;从&#xff09;2.4 测试主从复制 三、常见问…

面试官:你有写过自定义指令吗?自定义指令的应用场景有哪些?

一、什么是指令 开始之前我们先学习一下指令系统这个词 指令系统是计算机硬件的语言系统&#xff0c;也叫机器语言&#xff0c;它是系统程序员看到的计算机的主要属性。因此指令系统表征了计算机的基本功能决定了机器所要求的能力 在vue中提供了一套为数据驱动视图更为方便的…

VMWARE VCENTER6.7 VCSA通过Web5480进行版本升级

VCENTER当前版本如下图 操作前先给VCENTER打一个快照&#xff0c;出问题可以立即回退 1、先下载VCSA镜像&#xff0c;并将VCSA镜像上传至DataStore中&#xff1b; 2、选中VCSA虚拟机&#xff0c;编辑配置 3、挂载新上传的VCSA镜像&#xff0c;一定要勾选“已连接”和“打开电源…

自定义string类

#include <iostream> #include <string> int main() { std::string str "Hello, World!"; // 使用 c_str() 将 std::string 转换为 C 风格字符串&#xff0c;并传递给 printf printf("The string is: %s\n", str.c_str()); // 尝试修改…

网络层 V(IPv6)【★★★★★★】

一、IPv6 的特点 IP 是互联网的核心协议。现在使用的 IP&#xff08;即 IPv4 ) 是在 20 世纪 70 年代末期设计的。互联网经过几十年的飞速发展&#xff0c;到 2011 年 2 月&#xff0c;IPv4 的地址已经耗尽&#xff0c; ISP 已经不能再申请到新的 IP 地址块了。我国在 2014 年…

全能与专精:探索未来AI模型的发展趋势与市场潜力

文章目录 每日一句正能量前言AI模型的全面评估和比较AI模型的专精化和可扩展性AI模型的合理使用和道德规范后记 每日一句正能量 一个人&#xff0c;如果没有经受过投资失败的痛楚&#xff0c;又怎么会看到绝望之后的海阔天空。很多时候&#xff0c;经历了人生中最艰难的事&…

告别繁琐切换,可道云teamOS让企业微信和钉钉无缝对接,爽到飞起

在当今快节奏的工作环境中&#xff0c;企业对于高效办公工具的需求日益增强。特别是企业微信和钉钉的普及&#xff0c;已成为许多企业日常沟通协作的基石。然而&#xff0c;传统企业网盘与这些平台的割裂&#xff0c;常常让工作流程变得繁琐。 幸运的是&#xff0c;teamOS的出…

vs2019编译opencv+contribute+gpu

1、提前准备 vs2019、opencv4.4.0、opencv-contribute4.4.0、CUDA Toolkit 11.8&#xff08;不能高于自己电脑的CUDA版本&#xff09;、CUDNN8.9.6 ps&#xff1a;先提前准备环境 1&#xff09;cmd中查看&#xff1a;nvidia-smi查看自己的显卡信息&#xff0c;不存在下述信息…

文本匹配任务(下)

文本匹配任务 1.文本匹配-深度学习1.1表示型1.1.1训练方式一1.1.2训练方式二&#xff08;Triplet Loss&#xff09; 1.2交互型1.3交互型和表示型对比 2.对比学习2.1图像中2.2NLP中 3.真实场景-海量向量查找3.1CD树3.1.1空间切割3.1.2Annoy 1.文本匹配-深度学习 简介&#xff1…

EasyExcel 文件导出 - 合并某些列值相同的行

文章目录 EasyExcel 文件导出 - 合并某些列值相同的行最终效果实现思路创建单元格合并的策略类使用 EasyExcel 文件导出 - 合并某些列值相同的行 在数据处理与文件导出的过程中&#xff0c;我们常常会遇到各种特定的需求。今天&#xff0c;我们就来探讨一下使用 EasyExcel 进行…

VsCode 联想路径配置

问题&#xff1a;举一个例子&#xff0c;引入文件 import store from ‘./store’&#xff0c;在输入 ./st 后会提示store。 配置路径别名后 webpack: {// 配置别名alias: {// 使用 表示 src 文件所在路径: path.resolve(__dirname, src)}}项目配置路径后输入 import store f…

JVM面试真题总结(一)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ Java主要是解释执行还是编译执行?请说明理由 Java既是解释执行的…

828华为云征文|部署私有云和文档管理系统 Kodcloud

828华为云征文&#xff5c;部署私有云和文档管理系统 Kodcloud 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 产品优势1.3 对比Flexus L实例和ECS 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Kodcloud3.1 Kodcloud 介绍3.2 Docker 环境…

Google数字车钥匙:引领汽车互动新纪元

在科技的浪潮中&#xff0c;Digital Car Key正以一种全新的姿态重塑我们与汽车的互动。告别传统的钥匙束缚&#xff0c;只需轻触手机应用&#xff0c;即可轻松掌控汽车。这一创新解决方案不仅大幅提升了安全性&#xff0c;更带来了前所未有的便捷&#xff0c;无论是城市通勤还是…

SSM校园兼职网站—计算机毕业设计源码25557

摘 要 当今人类社会已经进入信息全球化和全球信息化、网络化的高速发展阶段。丰富的网络信息已经成为人们工作、生活、学习中不可缺少的一部分。人们正在逐步适应和习惯于网上贸易、网上购物、网上支付、网上服务和网上娱乐等活动&#xff0c;人类的许多社会活动正在向网络化发…

Kafka【九】如何实现数据的幂等性操作

为了解决Kafka传输数据时&#xff0c;所产生的数据重复和乱序问题&#xff0c;Kafka引入了幂等性操作&#xff0c;所谓的幂等性&#xff0c;就是Producer同样的一条数据&#xff0c;无论向Kafka发送多少次&#xff0c;kafka都只会存储一条。注意&#xff0c;这里的同样的一条数…