【动手学深度学习】使用块的网络(VGG)的研究详情

news2024/11/16 1:29:57

目录

🌊1. 研究目的

🌊2. 研究准备

🌊3. 研究内容

🌍3.1 多层感知机模型选择、欠拟合和过拟合

🌍3.2 练习

🌊4. 研究体会


🌊1. 研究目的

  • 理解块的网络结构;
  • 比较块的网络与传统浅层网络的性能差异;
  • 探究块的网络深度与性能之间的关系;
  • 研究块的网络在不同任务上的适用性。

🌊2. 研究准备

  • 根据GPU安装pytorch版本实现GPU运行研究代码;
  • 配置环境用来运行 Python、Jupyter Notebook和相关库等相关库。

🌊3. 研究内容

启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:


🌍3.1 使用块的网络(VGG)

(1)使用jupyter notebook新增的pytorch环境新建ipynb文件,完成基本数据操作的研究代码与练习结果如下:

VGG块

import torch
from torch import nn
from d2l import torch as d2l


def vgg_block(num_convs, in_channels, out_channels):
    layers = []
    for _ in range(num_convs):
        layers.append(nn.Conv2d(in_channels, out_channels,
                                kernel_size=3, padding=1))
        layers.append(nn.ReLU())
        in_channels = out_channels
    layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
    return nn.Sequential(*layers)

VGG网络

conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))

def vgg(conv_arch):
    conv_blks = []
    in_channels = 1
    # 卷积层部分
    for (num_convs, out_channels) in conv_arch:
        conv_blks.append(vgg_block(num_convs, in_channels, out_channels))
        in_channels = out_channels

    return nn.Sequential(
        *conv_blks, nn.Flatten(),
        # 全连接层部分
        nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),
        nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),
        nn.Linear(4096, 10))

net = vgg(conv_arch)

X = torch.randn(size=(1, 1, 224, 224))
for blk in net:
    X = blk(X)
    print(blk.__class__.__name__,'output shape:\t',X.shape)

训练模型

ratio = 4
small_conv_arch = [(pair[0], pair[1] // ratio) for pair in conv_arch]
net = vgg(small_conv_arch)

lr, num_epochs, batch_size = 0.05, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())


🌍3.2 练习

1.打印层的尺寸时,我们只看到8个结果,而不是11个结果。剩余的3层信息去哪了?

在VGG网络中,最后三个全连接层(nn.Linear)的输出尺寸没有被打印出来。这是因为在for循环中,只遍历了卷积层部分的模块,而没有遍历全连接层部分的模块。

为了打印出全连接层的输出尺寸,可以将全连接层的模块添加到一个列表中,然后在遍历网络的时候也打印出这些模块的输出尺寸。以下是修改后的代码:

import torch
import torch.nn as nn

# 定义 VGG 模型
def vgg(conv_arch):
    layers = []
    in_channels = 1
    for c, num_convs in conv_arch:
        layers.append(nn.Sequential(
            nn.Conv2d(in_channels, c, kernel_size=3, padding=1),
            nn.ReLU()
        ))
        in_channels = c
        for _ in range(num_convs - 1):
            layers.append(nn.Sequential(
                nn.Conv2d(c, c, kernel_size=3, padding=1),
                nn.ReLU()
            ))
        layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
    return nn.Sequential(*layers)

conv_arch = ((1, 1), (2, 2), (4, 2), (8, 2), (16, 2))

net = vgg(conv_arch)

X = torch.randn(size=(1, 1, 224, 224))
for blk in net:
    X = blk(X)
    print(blk.__class__.__name__, 'output shape:\t', X.shape)

# 获取卷积层的输出尺寸
_, channels, height, width = X.shape

# 添加全连接层模块到列表中
fc_layers = [
    nn.Flatten(),
    nn.Linear(channels * height * width, 4096),
    nn.ReLU(),
    nn.Dropout(0.5),
    nn.Linear(4096, 4096),
    nn.ReLU(),
    nn.Dropout(0.5),
    nn.Linear(4096, 10)
]

net = nn.Sequential(*net, *fc_layers)

# 打印全连接层的输出尺寸
for blk in fc_layers:
    X = blk(X)
    print(blk.__class__.__name__, 'output shape:\t', X.shape)

2.与AlexNet相比,VGG的计算要慢得多,而且它还需要更多的显存。分析出现这种情况的原因。
VGG相对于AlexNet而言,计算速度更慢、显存需求更高的主要原因如下:

  • 更深的网络结构: VGG网络相比AlexNet更深,它使用了更多的卷积层和全连接层。VGG的网络结构包含了多个连续的卷积层,导致了参数的数量增加和计算量的增加。相对于AlexNet的8层网络,VGG网络有16或19层,这导致了更多的计算和内存消耗。
  • 小尺寸的卷积核: VGG网络使用了较小的卷积核(3x3大小),而AlexNet则使用了更大的卷积核(11x11和5x5大小)。较小的卷积核意味着每个卷积层需要进行更多次的卷积运算来覆盖相同的感受野,从而增加了计算量。
  • 更多的参数: VGG网络具有更多的参数量。由于每个卷积层都使用了较小的卷积核,导致了更多的卷积核参数。此外,由于网络更深,全连接层的参数数量也更多。更多的参数需要更多的内存来存储,并且在计算过程中需要更多的计算量。
  • 更高的内存需求: VGG网络的深度和参数量的增加导致了更高的内存需求。在训练过程中,需要存储每一层的输出、梯度和参数,这会消耗大量的显存。较大的显存需求可能导致无法一次性加载更多的数据和模型,从而导致更多的显存读写操作和内存碎片化,进而影响计算速度。

3.尝试将Fashion-MNIST数据集图像的高度和宽度从224改为96。这对实验有什么影响?
将Fashion-MNIST数据集图像的高度和宽度从224改为96会对实验产生以下影响:

  • 模型性能下降: 缩小图像尺寸会导致图像的信息丢失和细节损失。VGG网络在设计时使用了较大的输入尺寸,以便更好地捕捉图像的细节和纹理。通过将图像尺寸缩小为96x96,模型可能无法有效地捕捉到原始图像中的细微特征,从而导致性能下降。
  • 空间分辨率减小: 图像尺寸从224x224缩小到96x96会导致空间分辨率的减小。较小的图像尺寸意味着每个像素代表的区域更大,图像中的细节信息被压缩。这可能会导致模型在进行物体边界检测、纹理识别等任务时表现不佳。
  • 减少计算和内存需求: 缩小图像尺寸可以减少模型的计算和内存需求。较小的输入图像尺寸意味着每个卷积层的特征图大小也会减小,从而减少了参数数量和计算量。此外,由于特征图大小减小,模型所需的内存也会相应减少。
  • 训练速度加快: 缩小图像尺寸可以加快训练速度。较小的输入图像尺寸意味着每个批次的数据量减少,从而减少了每个训练步骤的计算量和内存消耗。这可能导致更快的训练速度和更高的训练效率。
import torch
from torch import nn
from torchvision.transforms import ToTensor
from torchvision.datasets import FashionMNIST
from torch.utils.data import DataLoader

# 定义VGG块
def vgg_block(num_convs, in_channels, out_channels):
    layers = []
    for _ in range(num_convs):
        layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))
        layers.append(nn.ReLU())
        in_channels = out_channels
    layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
    return nn.Sequential(*layers)

# 定义VGG网络
class VGG(nn.Module):
    def __init__(self, conv_arch):
        super(VGG, self).__init__()
        self.conv_blocks = nn.Sequential()
        in_channels = 1
        for i, (num_convs, out_channels) in enumerate(conv_arch):
            self.conv_blocks.add_module(f'vgg_block{i+1}', vgg_block(num_convs, in_channels, out_channels))
            in_channels = out_channels
        self.fc_layers = nn.Sequential(
            nn.Linear(out_channels * 3 * 3, 4096),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(4096, 10)
        )

    def forward(self, x):
        x = self.conv_blocks(x)
        x = torch.flatten(x, start_dim=1)
        x = self.fc_layers(x)
        return x

# 将Fashion-MNIST图像尺寸缩小为96x96
transform = ToTensor()
train_dataset = FashionMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = FashionMNIST(root='./data', train=False, download=True, transform=transform)

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

# 定义VGG网络结构
conv_arch = [(1, 64), (1, 128), (2, 256), (2, 512), (2, 512)]
model = VGG(conv_arch)

# 训练和测试
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
criterion = nn.CrossEntropyLoss()

def train(model, train_loader, optimizer, criterion, device):
    model.train()
    train_loss = 0.0
    train_acc = 0.0
    for images, labels in train_loader:
        images = images.to(device)
        labels = labels.to(device)

        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        train_loss += loss.item() * images.size(0)
        _, preds = torch.max(outputs, 1)
        train_acc += torch.sum(preds == labels.data).item()

    train_loss /= len(train_loader.dataset)
    train_acc /= len(train_loader.dataset)
    return train_loss, train_acc

def test(model, test_loader, criterion, device):
    model.eval()
    test_loss = 0.0
    test_acc = 0.0
    with torch.no_grad():
        for images, labels in test_loader:
            images = images.to(device)
            labels = labels.to(device)

            outputs = model(images)
            loss = criterion(outputs, labels)

            test_loss += loss.item() * images.size(0)
            _, preds = torch.max(outputs, 1)
            test_acc += torch.sum(preds == labels.data).item()

    test_loss /= len(test_loader.dataset)
    test_acc /= len(test_loader.dataset)
    return test_loss, test_acc

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    train_loss, train_acc = train(model, train_loader, optimizer, criterion, device)
    test_loss, test_acc = test(model, test_loader, criterion, device)

    print(f'Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}, Train Accuracy: {train_acc:.4f}, '
          f'Test Loss: {test_loss:.4f}, Test Accuracy: {test_acc:.4f}')

# 输出样例
print("Sample outputs:")
model.eval()
with torch.no_grad():
    for images, labels in test_loader:
        images = images.to(device)
        labels = labels.to(device)

        outputs = model(images)
        _, preds = torch.max(outputs, 1)

        for i in range(images.size(0)):
            print(f"Predicted: {preds[i].item()}, Ground Truth: {labels[i].item()}")
        break  # 只输出一个批次的样例结果

在上面的代码中,定义了VGG网络结构,并在Fashion-MNIST数据集上进行了训练和测试。通过将图像尺寸从224缩小为96,可以看到模型的训练和推理速度可能会加快,但模型的性能可能会下降,因为图像的细节被压缩。这里使用了SGD优化器和交叉熵损失函数来训练模型,并输出了训练和测试的损失和准确率。最后输出了一个样例的预测结果,以查看模型的输出效果。请注意,实际训练过程可能需要更多的迭代次数和调整超参数以获得更好的性能。

4.请参考VGG论文 (Simonyan and Zisserman, 2014)中的表1构建其他常见模型,如VGG-16或VGG-19。
VGG-16:

import torch
from torch import nn
from torchvision.transforms import ToTensor
from torchvision.datasets import FashionMNIST
from torch.utils.data import DataLoader

# 定义VGG块
def vgg_block(num_convs, in_channels, out_channels):
    layers = []
    for _ in range(num_convs):
        layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))
        layers.append(nn.ReLU())
        in_channels = out_channels
    layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
    return nn.Sequential(*layers)

# 定义VGG-16网络
class VGG16(nn.Module):
    def __init__(self):
        super(VGG16, self).__init__()
        self.conv_blocks = nn.Sequential(
            vgg_block(2, 3, 64),
            vgg_block(2, 64, 128),
            vgg_block(3, 128, 256),
            vgg_block(3, 256, 512),
            vgg_block(3, 512, 512)
        )
        self.fc_layers = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 10)
        )

    def forward(self, x):
        x = self.conv_blocks(x)
        x = torch.flatten(x, start_dim=1)
        x = self.fc_layers(x)
        return x

# 将Fashion-MNIST图像转换为Tensor,并进行数据加载
transform = ToTensor()
train_dataset = FashionMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = FashionMNIST(root='./data', train=False, download=True, transform=transform)

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

# 创建VGG-16模型实例
model = VGG16()

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

# 将模型移动到GPU(如果可用)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    model.train()
    train_loss = 0.0
    train_acc = 0.0
    for images, labels in train_loader:
        images = images.to(device)
        labels = labels.to(device)

        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        train_loss += loss.item() * images.size(0)
        _, preds = torch.max(outputs, 1)
        train_acc += torch.sum(preds == labels.data).item()

    train_loss /= len(train_loader.dataset)
    train_acc /= len(train_loader.dataset)

    # 在测试集上评估模型
    model.eval()
    test_loss = 0.0
    test_acc = 0.0
    with torch.no_grad():
        for images, labels in test_loader:
            images = images.to(device)
            labels = labels.to(device)

            outputs = model(images)
            loss = criterion(outputs, labels)

            test_loss += loss.item() * images.size(0)
            _, preds = torch.max(outputs, 1)
            test_acc += torch.sum(preds == labels.data).item()

    test_loss /= len(test_loader.dataset)
    test_acc /= len(test_loader.dataset)

    print(f'Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}, Train Accuracy: {train_acc:.4f}, '
          f'Test Loss: {test_loss:.4f}, Test Accuracy: {test_acc:.4f}')

# 输出样例
print("Sample outputs:")
model.eval()
with torch.no_grad():
    for images, labels in test_loader:
        images = images.to(device)
        labels = labels.to(device)

        outputs = model(images)
        _, preds = torch.max(outputs, 1)

        for i in range(images.size(0)):
            print(f"Predicted: {preds[i].item()}, Ground Truth: {labels[i].item()}")
        break  # 只输出一个批次的样例结果

以上代码展示了包含数据加载和训练的完整代码,使用VGG-16模型对Fashion-MNIST数据集进行了训练和测试。训练过程中,模型在每个epoch中进行了训练和验证,并输出了训练和验证集上的损失和准确率。最后,展示了一个样例输出,显示了模型在测试集上的预测结果。

VGG-19:

import torch
from torch import nn
from torchvision.transforms import ToTensor
from torchvision.datasets import FashionMNIST
from torch.utils.data import DataLoader

# 定义VGG块
def vgg_block(num_convs, in_channels, out_channels):
    layers = []
    for _ in range(num_convs):
        layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))
        layers.append(nn.ReLU())
        in_channels = out_channels
    layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
    return nn.Sequential(*layers)

# 定义VGG-19网络
class VGG19(nn.Module):
    def __init__(self):
        super(VGG19, self).__init__()
        self.conv_blocks = nn.Sequential(
            vgg_block(2, 3, 64),
            vgg_block(2, 64, 128),
            vgg_block(4, 128, 256),
            vgg_block(4, 256, 512),
            vgg_block(4, 512, 512)
        )
        self.fc_layers = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 10)
        )

    def forward(self, x):
        x = self.conv_blocks(x)
        x = torch.flatten(x, start_dim=1)
        x = self.fc_layers(x)
        return x

# 将Fashion-MNIST图像转换为Tensor,并进行数据加载
transform = ToTensor()
train_dataset = FashionMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = FashionMNIST(root='./data', train=False, download=True, transform=transform)

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

# 创建VGG-19模型实例
model = VGG19()

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

# 将模型移动到GPU(如果可用)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    model.train()
    train_loss = 0.0
    train_acc = 0.0
    for images, labels in train_loader:
        images = images.to(device)
        labels = labels.to(device)

        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        train_loss += loss.item() * images.size(0)
        _, preds = torch.max(outputs, 1)
        train_acc += torch.sum(preds == labels.data).item()

    train_loss /= len(train_loader.dataset)
    train_acc /= len(train_loader.dataset)

    # 在测试集上评估模型
    model.eval()
    test_loss = 0.0
    test_acc = 0.0
    with torch.no_grad():
        for images, labels in test_loader:
            images = images.to(device)
            labels = labels.to(device)

            outputs = model(images)
            loss = criterion(outputs, labels)

            test_loss += loss.item() * images.size(0)
            _, preds = torch.max(outputs, 1)
            test_acc += torch.sum(preds == labels.data).item()

    test_loss /= len(test_loader.dataset)
    test_acc /= len(test_loader.dataset)

    print(f'Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}, Train Accuracy: {train_acc:.4f}, '
          f'Test Loss: {test_loss:.4f}, Test Accuracy: {test_acc:.4f}')

# 输出样例
print("Sample outputs:")
model.eval()
with torch.no_grad():
    for images, labels in test_loader:
        images = images.to(device)
        labels = labels.to(device)

        outputs = model(images)
        _, preds = torch.max(outputs, 1)

        for i in range(images.size(0)):
            print(f"Predicted: {preds[i].item()}, Ground Truth: {labels[i].item()}")
        break  # 只输出一个批次的样例结果


🌊4. 研究体会

在本次实验中,我采用了块的网络结构,具体来说是VGG(Visual Geometry Group)网络,进行了深入的研究和分析。通过实验,我对使用块的网络的性能和优势有了更深刻的理解,并在不同任务上的适用性方面进行了探索。

首先,块的网络结构给予了深度神经网络更强大的特征提取能力。通过将多个卷积层和池化层堆叠在一起形成块的方式,块的网络能够逐层地提取出越来越抽象的特征信息。这种层次化的特征提取过程有助于网络更好地理解和表示输入数据,提高模型的分类准确率。在实验中的结果表明,相比传统的浅层网络,块的网络在处理复杂的视觉任务时表现出更好的性能。

其次,通过实验发现,块的网络的深度与性能之间存在一定的关系。逐渐增加块的数量可以增加网络的深度,但并不意味着性能一定会线性提升。实验中,我逐步增加了VGG网络的块数,并观察了模型的性能变化。结果显示,在增加块的数量初期,性能得到了显著提升,但随着深度继续增加,性能的改善趋于平缓,甚至有时会出现性能下降的情况。这表明网络深度的增加并不是无限制地提高性能的唯一因素,适当的模型复杂度和正则化方法也需要考虑。对块的网络在不同任务上的适用性进行了研究。通过在不同的数据集上进行训练和测试,我发现块的网络在图像分类、目标检测和语义分割等多个视觉任务中都表现出很好的性能。这表明块的网络具有较强的泛化能力和适应性,能够应用于多个领域和应用场景。这对于深度学习的研究和应用具有重要的启示意义,也为实际应用中的图像分析和理解提供了有力支持。

实验发现块的网络结构具有良好的模块化和复用性,使得网络的设计和调整变得更加灵活和高效。通过将相同的卷积层和池化层堆叠在一起形成块,我可以轻松地调整网络的深度和宽度,而不需要对每一层都进行单独设计和调整。这种模块化的结构使得网络的搭建和调试更加高效,节省了大量的时间和资源。

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

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

相关文章

AI 入门指南二 :AI提示词(Prompt)

一,提示词的定义 提示词在中文中意为“触发”,在自然语言处理(NLP)的领域,它更接近于一个“心领神会”的概念,而非具有明确定义的术语。 简而言之,提示词是用户对大型语言模型的输入&#xff0…

Qt | Qt 资源简介(rcc、qmake)

1、资源系统是一种独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件(前面所讨论的数据都存储在外部设备中)。若应用程序始终需要一组特定的文件(比如图标),则非常有用。 2、资源系统基于 qmake,rcc(Qt 的资源编译器,用于把资源转换为 C++代码)和 QFile …

EE trade:通货膨胀对老百姓意味着什么

通货膨胀,是经济领域中的一个常见现象,对社会各阶层尤其是普通老百姓的生活产生了深远影响。理解通货膨胀对老百姓的真实含义,可以帮助我们更好地应对日常生活的变化与挑战。 1. 生活成本的上升 最直接的影响体现在生活成本上。通货膨胀会导致…

音频pop音的数学与物理解释

音频数据跳变太大的时候通常会有pop音,此时频谱上看pop音位置能量较高 音频中的“pop”音通常是由于信号的不连续性或瞬态变化造成的。这种不连续性的数学和物理原因可以从以下几个方面解释: 数学解释 信号不连续性 当音频信号发生突变时,…

Android完整备份:备份Android手机数据的4种最佳方法

如今,人们每天都依赖手机,丢失数据对我们所有人来说都是一个大麻烦。由于生活是不可预测的,没有人知道什么时候他的数据可能会被意外删除或丢失。因此,仔细备份手机数据非常重要。大多数主要智能手机平台都具有将数据备份到计算机…

C/C++学习路线

学习分享 C语言学习路线 视频:浙大翁恺C语言程序设计,当时学习C语言的时候感觉老师讲的很有意思,现在依然很受学生欢迎,播放量也很高,C语言主要需要学习数组,指针,结构体和函数等,…

爆肝三天,制作属于自己的地图——DAY1(地图数据整理)

爆肝第一天,地图数据整理 作者:御剑飞行 引言 本系列我将用三篇文章详细的讲述开源地图数据集、Mapmost Studio介绍、如何通过Mapmost Studio转为生成地图数据。 以下是常用的地图数据集。 Esri 开放数据中心 Esri开放数据中心包含来自全球5,000 多…

【AI基础】第四步:保姆喂饭级-langchain+chatglm2-6b+m3e-base

在第三步手动安装chatglm2-6b时,已经可以通过web进行交互。langchain重新封装了一下AI框架,提供更加友好的开发功能,类似于AI届的spring框架。langchain的安装过程也类似于上一步说的:【AI基础】第三步:纯天然手动安装…

SwiftUI知识点(一)

前言: Swift知识点,大至看完了,公司项目是Swift语言写的,后续苹果新出的SwiftUI,也需要学习一下 不知觉间,SwiftUI是19年出的,现在24年,5年前的东西了 学习的几个原因: …

概要设计说明书实际项目示例(原件直接套用Word)

1引言 1.1编写目的 1.2项目背景 1.3参考资料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4运行环境设计 2.5设计目标 3系统功能模块设计 3.1个人办公 3.2系统管理 4性能设计 4.1响应时间 4.2并发用户数 5接口设计 5.1接口设计原则 5.2接口实现方式 6运行设计…

【香橙派 AIpro 开发板】AI 应用部署测评:视频目标检测+Linux镜像+vscode远程连接+全细节试用

香橙派 AIpro 开发板 AI 应用部署测评 写在最前面一、开发板概述官方资料试用印象适用场景 二、详细开发前准备步骤1. 环境准备2. 环境搭建3. vscode安装ssh插件4. 香橙派 AIpro 添加连接配置5. 连接香橙派 AIpro6. SSH配置 二、详细开发步骤1. 登录 juypter lab2. 样例运行3. …

网络原理——http/https ---http(1)

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 网络原理 HTTP/HTTPS HTTP,全称为"超文本传输协议" HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议. 实际上,HTTP最新已经发展到 3.0 但是当前行业中主要使用的HT…

Java桥接模式

桥接模式 最重要的是 将 抽象 与 实现 解耦 , 通过组合 在 抽象 与 实现 之间搭建桥梁 ; 【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )-CSDN博客 桥接模式(Bridge Pattern)-(最通俗易懂的案例)_桥接模式 例子-…

【Linux】(三)—— 文件管理和软件安装

文件管理 Linux的文件管理是系统管理中的核心部分,它涉及到如何组织、访问、修改和保护文件及目录结构。 目录 文件管理基本概念常用命令查看和切换目录创建文件和目录删除文件和目录文件拷贝移动和重命名文件文件查看cat文件查看more查找文件查找文本 数据流和管道…

保姆级讲解 Mybatis的配置与管理

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“intern…

大厂真实面试题(一)

滴滴大数据sql 取出累计值与1000差值最小的记录 1.题目 已知有表t_cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 2.分析 本题主要是想找到累加值域1000差距最小的记录,也就是我们要对上述按照id进行排序并且累加,并…

华为如何造车?

引言 近年来,华为在智能汽车领域的布局备受关注,虽然华为创始人任正非曾多次表示华为不造车,但事实证明,华为在汽车产业链的深度参与已让人产生了“华为造车”的错觉。本文将探讨华为在汽车领域的发展历程,分析华为不…

F5G城市光网,助力“一网通城”筑基数字中国

《淮南子》中说,“临河而羡鱼,不如归家织网”。 这句话在后世比喻为做任何事情都需要提前做好准备,有了合适的工具,牢固的基础,各种难题也会迎刃而解。 如今,数字中国发展建设如火如荼,各项任务…

AI绘画软件深度测评:精选四款高效自动生成工具

随着人工智能技术的飞速发展,AI绘画软件已经成为艺术创作和设计领域的新宠。它们不仅能够提供无限的创意灵感,还能大幅提升工作效率。在经过对几十种AI绘画软件的测试后,我们特别推荐以下四款高效自动生成工具——Midjourney、Stable Diffusi…

Android Studio 下载 | 安装 | 下载 SDK | 中文插件 | 卸载

文章目录 下载安装包安装下载 SDK中文插件卸载 下载安装包 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 点击下载 Android Studio。 在协议最下方勾选同意(第一次用最好还是看一眼),再点击 Dowload Android Stu…