当前位置: 首页 > news >正文

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言

卷积神经网络(Convolutional Neural Networks,简称 CNNs)是一种深度学习架构,专门用于处理具有网格结构的数据,如图像、视频等。它们在计算机视觉领域取得了巨大成功,成为图像分类、目标检测、图像分割等任务的核心技术。
CNNs 的核心思想是利用卷积操作(convolution)来提取数据中的局部特征,并通过层次化的结构逐步学习更复杂的模式。

一、卷积神经网络

卷积神经网络,主要用于处理具有网格结构的数据,一般有以下几个关键组成部分:

1.1 输入

输入层是网络的初始数据入口点。在基于图像的任务中,输入层代表图像的像素值。在以下示例中,假设我们正在处理大小为 28x28 像素的灰度图像。

from tensorflow.keras.layers import Inputinput_layer = Input(shape=(28, 28, 1))

1.2 卷积层

卷积层是 CNNs 的核心构建块。这些层通过对输入数据应用卷积操作来提取特征,例如边缘、纹理和模式。

from tensorflow.keras.layers import Conv2Dconv_layer = Conv2D(filters=32, kernel_size=(3, 3),activation='relu')(input_layer)

在卷积神经网络(CNNs)中,“核”和“滤波器”这两个术语经常可以互换使用,它们指的是同一个概念。让我们来剖析一下这两个术语的含义:

2.1 :核是卷积操作中使用的一个小矩阵。它是一组可学习的权重,应用于输入数据以生成输出特征图。核是使 CNNs 能够自动学习输入数据中空间层次特征的关键元素。在图像处理中,核可能是一个 3x3 或 5x5 的小矩阵。

2.2 滤波器:另一方面,滤波器是一组多个核。在大多数情况下,卷积层使用多个滤波器来捕获输入数据中的不同特征。每个滤波器都与输入进行卷积以生成特征图,网络通过在训练过程中调整这些滤波器的权重(参数)来学习提取各种模式。

在这个示例中,我们定义了一个具有 32 个滤波器的卷积层,每个滤波器的大小为 3x3。在训练过程中,神经网络会调整这 32 个滤波器的权重(参数),以从输入数据中学习不同的特征。让我们通过一个图像示例来看一下:

卷积机制

卷积机制。核形状(3x3)。图片来源:OpenGenus

总之,核是滑动或卷积穿过输入数据的小矩阵,而滤波器是一组这样的核,用于从输入中提取各种特征,从而使神经网络能够学习层次化的表示。

1.3 激活层(ReLU)

在卷积操作之后,通常会应用激活函数,通常是修正线性单元(ReLU),以逐元素地引入非线性。ReLU 有助于网络学习复杂的关系,并使模型更具表现力。完全取决于你的用例,你将使用哪种激活函数。在大多数情况下,研究人员使用 ReLU,也有一些其他激活函数可以使用,例如 Leaky ReLU、ELU。

ReLU 激活

ReLU 激活。来源:ResearchGate

在 Python 中实现修正线性单元(ReLU)函数非常简单。ReLU 是一种常用于神经网络的激活函数,用于引入非线性。以下是一个简单的 Python 实现:

def relu(x):return max(0, x)

1.4 池化层

池化层(例如 最大池化平均池化)会降低由卷积层生成的特征图的空间维度。例如,最大池化会从一组值中选择最大值,专注于最显著的特征。

最大池化 — 平均池化

最大池化 — 平均池化。来源:ResearchGate

池化层可以降低空间维度。最大池化通常被使用:

from tensorflow.keras.layers import MaxPooling2Dpooling_layer = MaxPooling2D(pool_size=(2, 2))(conv_layer)

1.5 全连接(密集)层

全连接层将一层中的每个神经元连接到下一层中的每个神经元。这些层通常位于网络的末端,将学到的特征转换为预测或类别概率。全连接层通常用于分类任务:

from tensorflow.keras.layers import Dense, Flattenflatten_layer = Flatten()(pooling_layer)
dense_layer = Dense(units=128, activation='relu')(flatten_layer)

1.6 Dropout 层

Dropout 层用于正则化,以防止过拟合。在训练过程中,随机神经元会被“丢弃”,即忽略它们,迫使网络学习更健壮和泛化的特征。它通过在训练过程中随机忽略输入单元的一部分来帮助防止过拟合:

Dropout 机制

Dropout 机制。来源:nagadakos

from tensorflow.keras.layers import Dropoutdropout_layer = Dropout(rate=0.5)(dense_layer)

1.7 批量归一化层

批量归一化(BN)是一种用于神经网络的技术,用于稳定和加速训练过程。它通过在训练过程中调整和缩放输入来归一化输入。批量归一化的数学细节涉及归一化、缩放和移动操作。让我们深入探讨批量归一化的数学原理。

假设我们有一个大小为 m 的小批量,包含 n 个特征。批量归一化的输入可以总结如下:

7.1. 计算均值:计算每个特征的小批量的均值 μ

均值计算

数组 X 的均值

这里,_xi_​ 表示小批量中第 i 个特征的值。

7.2. 计算方差:计算每个特征的小批量的方差 σ²

方差计算

方差计算

7.3. 归一化:通过减去均值并除以标准差 (σ) 来归一化输入:

归一化范围

这里,ϵ 是一个很小的常数,用于避免除以零。

7.4. 缩放和移动:引入可学习的参数 (γβ) 来缩放和移动归一化的值:

每个批次的缩放

这里,γ 是缩放参数,β 是移动参数。

批量归一化操作通常插入在神经网络层的激活函数之前。它已被证明具有正则化效果,并可以减轻内部协变量偏移等问题,使训练更稳定、更快。以下是一个简单的批量归一化代码,用于 CNN 或任何深度神经网络:

from tensorflow.keras.layers import BatchNormalizationbatch_norm_layer = BatchNormalization()(dropout_layer)

总之,批量归一化归一化输入,缩放和移动归一化的值,并引入可学习的参数,以便网络在训练过程中进行调整。批量归一化的使用已成为深度学习架构的标准实践。

1.8 展平层

展平层将多维特征图转换为一维向量,为输入到全连接层做准备。

flatten_layer = Flatten()(batch_norm_layer)

1.9 上采样层

上采样是一种用于深度学习的技术,用于增加特征图的空间分辨率。它通常用于图像分割和生成等任务。以下是常见上采样方法的简要描述:

9.1. 最近邻(NN)上采样:最近邻(NN)上采样,也称为通过复制或重复进行上采样,是一种简单直观的方法。在这种方法中,输入中的每个像素都会被复制或重复以生成更大的输出。虽然简单,但 NN 上采样可能会导致块状伪影和细节丢失,因为它不会在相邻像素之间进行插值。

最近邻上采样

9.2. 转置卷积(反卷积)上采样:转置卷积通常称为反卷积,是一种可学习的上采样方法。它涉及使用具有可学习参数的卷积操作来增加输入的空间维度。转置卷积层中的权重在优化过程中进行训练,允许网络学习特定于任务的上采样模式。

转置卷积上采样

import tensorflow as tf
from tensorflow.keras.layers import Conv2DTranspose# 转置卷积上采样
transposed_conv_upsampling = Conv2DTranspose(filters=32, kernel_size=(3, 3), strides=(2, 2), padding='same')

每种上采样方法都有其优势和权衡,选择取决于任务的具体需求和数据的特性。

二、填充和步长

填充和步长是卷积神经网络(CNNs)中的关键概念,它们会影响卷积操作后输出特征图的大小。让我们讨论三种类型的填充,并解释步长的概念。

2.1 有效填充(无填充)

在有效填充中,也称为无填充,输入在应用卷积操作之前不会添加任何额外的填充。因此,卷积操作仅在滤波器与输入完全重叠的地方进行。这通常会导致输出特征图的空间维度减小。

有效填充

from tensorflow.keras.layers import Conv2D# 有效填充
valid_padding_conv = Conv2D(filters=32, kernel_size=(3, 3),strides=(1, 1), padding='valid')

2.2 相同填充

相同填充确保输出特征图具有与输入相同的空间维度。它通过向输入添加零填充来实现,使得滤波器可以在输入上滑动而不会超出其边界。填充量会计算以保持维度相同。

相同填充

from tensorflow.keras.layers import Conv2D# 填充在 Keras 中
same_padding_conv = Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding='same')

2.4 步长

步长定义了滤波器在卷积过程中跨输入移动的步长。较大的步长会导致输出特征图的空间维度减小。步长可以调整以控制网络中的下采样程度。

from tensorflow.keras.layers import Conv2D# 示例:在 Keras 中带有步长的卷积
conv_with_stride = Conv2D(filters=32, kernel_size=(3, 3), strides=(2, 2), padding='same')

在这个示例中,步长设置为 (2, 2),表示滤波器在水平和垂直方向上每次移动两个像素。步长是一个关键参数,用于控制特征图的空间分辨率并影响网络的感受野。

三、图像分类

下面从头开始构建一个简单的卷积神经网络。来进行计算机视觉中最流行的分类任务之一:猫与狗分类

3.1 导入库

import tensorflow_datasets as tfds
import tensorflow as tf
from tensorflow.keras import layersimport keras
from keras.models import Sequential, Model
from keras.layers import Dense, Conv2D, Flatten, MaxPooling2D, GlobalAveragePooling2D
from keras.utils import plot_modelimport numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import cv2

3.2 加载数据:猫与狗数据集

!curl -O https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip
!unzip -q kagglecatsanddogs_5340.zip
!ls

下面的单元格将对图像进行预处理,并在输入到我们的模型之前创建批次。

def augment_images(image, label):# 转换为浮点数image = tf.cast(image, tf.float32)# 归一化像素值image = (image/255)# 调整大小为 300 x 300image = tf.image.resize(image, (300, 300))return image, label# 使用上述工具函数对图像进行预处理
augmented_training_data = train_data.map(augment_images)# 在训练前打乱并创建批次
train_batches = augmented_training_data.shuffle(1024).batch(32)

3.3 过滤损坏的图像

在处理大量真实世界的图像数据时,损坏的图像很常见。让我们过滤掉不包含“JFIF”字符串的损坏图像。

import osnum_skipped = 0
for folder_name in ("Cat", "Dog"):folder_path = os.path.join("PetImages", folder_name)for fname in os.listdir(folder_path):fpath = os.path.join(folder_path, fname)try:fobj = open(fpath, "rb")is_jfif = tf.compat.as_bytes("JFIF") in fobj.peek(10)finally:fobj.close()if not is_jfif:num_skipped += 1# 删除损坏的图像os.remove(fpath)print("Deleted %d images" % num_skipped)

3.4 生成 Dataset

image_size = (300, 300)
batch_size = 128train_ds, val_ds = tf.keras.utils.image_dataset_from_directory("PetImages",validation_split=0.2,subset="both",seed=1337,image_size=image_size,batch_size=batch_size,
)

3.5 可视化数据

以下是训练数据集中的前 9 张图像。正如你所看到的,标签 1 是“狗”,标签 0 是“猫”。

import matplotlib.pyplot as pltplt.figure(figsize=(6, 6))
for images, labels in train_ds.take(1):for i in range(9):ax = plt.subplot(3, 3, i + 1)plt.imshow(images[i].numpy().astype("uint8"))plt.title(int(labels[i]))plt.axis("off")

标注数据集

狗:1,猫:0

3.6 使用图像数据增强

当你没有一个大型图像数据集时,通过应用随机但现实的变换(如随机水平翻转或小随机旋转)来人为地引入样本多样性是一种很好的做法。这有助于让模型接触到训练数据的不同方面,同时减缓过拟合。

data_augmentation = keras.Sequential([layers.RandomFlip("horizontal"),layers.RandomRotation(0.1),]
)

让我们通过反复将 data_augmentation 应用于数据集中的第一张图像,来看看增强后的样本是什么样的:

plt.figure(figsize=(6, 6))
for images, _ in train_ds.take(1):for i in range(9):augmented_images = data_augmentation(images)ax = plt.subplot(3, 3, i + 1)plt.imshow(augmented_images[0].numpy().astype("uint8"))plt.axis("off")

图像增强

图像增强。(示例:翻转、旋转)

3.7 配置数据集以提高性能

让我们将数据增强应用于我们的训练数据集,并确保使用缓冲预取,以便我们可以在不阻塞 I/O 的情况下从磁盘获取数据。

# 将 `data_augmentation` 应用于训练图像。
train_ds = train_ds.map(lambda img, label: (data_augmentation(img), label),num_parallel_calls=tf.data.AUTOTUNE,
)
# 在 GPU 内存中预取样本有助于最大化 GPU 利用率。
train_ds = train_ds.prefetch(tf.data.AUTOTUNE)
val_ds = val_ds.prefetch(tf.data.AUTOTUNE)

3.8 构建分类器

这将看起来很熟悉,因为它几乎与我们之前构建的模型相同。关键区别在于输出只是一个单位,使用 Sigmoid 激活。这是因为我们只处理两个类别。

class CustomModel(Sequential):def __init__(self):super(CustomModel, self).__```pythonsuper(CustomModel, self).__init__()self.add(Conv2D(16, input_shape=(300, 300, 3), kernel_size=(3, 3), activation='relu', padding='same'))self.add(MaxPooling2D(pool_size=(2, 2)))self.add(Conv2D(32, kernel_size=(3, 3), activation='relu', padding='same'))self.add(MaxPooling2D(pool_size=(2, 2)))self.add(Conv2D(64, kernel_size=(3, 3), activation='relu', padding='same'))self.add(MaxPooling2D(pool_size=(2, 2)))self.add(Conv2D(128, kernel_size=(3, 3), activation='relu', padding='same'))self.add(GlobalAveragePooling2D())self.add(Dense(1, activation='sigmoid'))# 实例化自定义模型
model = CustomModel()# 显示模型摘要
model.summary()

模型的损失函数可以根据之前的设置进行调整,以适应两个类别的分类任务。为此,我们选择 binary_crossentropy

# 训练大约需要 30 分钟才能完成,如果使用 GPU 的话。
# 如果你的本地机器没有 GPU,可以免费使用 Google Colab 来获取 GPU 访问权限。model.compile(loss='binary_crossentropy',metrics=['accuracy'],optimizer=tf.keras.optimizers.RMSprop(lr=0.001))
model.fit(train_ds,epochs=25,validation_data=val_ds,)

3.9 测试模型

让我们下载一些图像,看看分类激活图是什么样子的。

!wget -O cat1.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/cat1.jpg
!wget -O cat2.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/cat2.jpg
!wget -O catanddog.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/catanddog.jpg
!wget -O dog1.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/dog1.jpg
!wget -O dog2.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/dog2.jpg
# 工具函数,用于预处理图像并显示分类激活图
def convert_and_classify(image):# 加载图像img = cv2.imread(image)# 在输入到模型之前对图像进行预处理img = cv2.resize(img, (300, 300)) / 255.0# 添加一个批次维度,因为模型需要它tensor_image = np.expand_dims(img, axis=0)# 获取特征和预测结果features, results = cam_model.predict(tensor_image)# 生成分类激活图show_cam(tensor_image, features, results)convert_and_classify('cat1.jpg')
convert_and_classify('cat2.jpg')
convert_and_classify('catanddog.jpg')
convert_and_classify('dog1.jpg')
convert_and_classify('dog2.jpg')

3.10 输出

在这里插入图片描述

相关文章:

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络(Convolutional Neural Networks,简称 CNNs)是一种深度学习架构,专门用于处理具有网格结构的数据,如图像、视频等。它们在计算机视觉领域取得了巨大成功,成为图像分类、目标检测、图像分…...

c++题目_翻译家

题目描述 grang是一个帅气的翻译家他的任务是把摩斯密码翻译成2进制数,他要上课所以想请你帮他一下,他会给你 一段摩斯密码有“.”和“-”组成让你输出个二进制数。 翻译规则是:不用管-,看每一个.有几个"."组成如果有奇…...

【解析 ECharts 图表样式继承与自定义】

解析 ECharts 图表样式继承与自定义 本文将详细介绍 ECharts 的样式继承机制,从其原理、演进到实际应用场景,并结合实际开发经验分享一些实战技巧,帮助开发者在构建数据可视化页面时实现更统一、灵活的样式管理与高效开发。 一、背景与来龙…...

Python IP解析器 ip2region使用

说明:最近需要在python项目内使用IP定位所在城市的需求,没有采用向外部ISP服务商API请求获取信息的方案,则翻了翻,在搞Java时很多的方案,在Python端反而可选择范围很小。 # 示例查询 ips ["106.38.188.214"…...

Java Stream 流的介绍

介绍 在 Java 8 中,引入了 Stream API,它为处理集合(如 List、Set 等)提供了一种更简洁、声明式的方式。Stream 流的设计目标是支持对数据集合的高效操作,尤其是能够进行链式操作、并行处理等,极大地提升了…...

C++从入门到入土(八)——多态的原理

目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中,我们介绍了C三大特性之一的多态,我们主要介绍了多态的构成条件,但是对于多态的原理我们探讨的是不够深入的,下面这这一篇文章,我们将…...

BFS,DFS带图详解+蓝桥杯算法题+经典例题

1.BFS和DFS的定义与实现方式 1.1 深度优先搜索(DFS) 基本概念:DFS 是一种用于遍历或搜索图或树的算法。它从起始节点开始,沿着一条路径尽可能深地探索下去,直到无法继续或者达到目标节点,然后回溯到上一个…...

【RHCE实验】搭建主从DNS、WEB等服务器

目录 需求 环境搭建 配置nfs服务器 配置web服务器 配置主从dns服务器 主dns服务器 从dns服务器 配置客户端 客户端测试 需求 客户端通过访问 www.nihao.com 后,能够通过 dns 域名解析,访问到 nginx 服务中由 nfs 共享的首页文件,内容…...

有哪些开源的智慧园区项目?

作为专注于数字孪生技术的开发者团队,我们一直在数字孪生圈分享开源项目。但最近一次与AI助手Deepseek的对话,却让我们“又惊又喜”。 ——当询问“有哪些开源的智慧园区项目”时,Deepseek的回答中竟包含了我们自己的开源项目! 这…...

prometheusalert对阿里云短信服务不适配问题处理

背景 想通过prometheusalert实现阿里云短信告警。结果在配置完altermanager和prometheusalert,以及阿里云短信服务中的各种签名和短信模板之后,在prometheusalert web ui上测试模板时一直报“模板变量JSON格式错误 或 JSON变量属性与模板占位符不一致”…...

NFC 碰一碰发视频源码搭建,支持OEM

一、引言 NFC(Near Field Communication)近场通信技术,以其便捷、快速的数据交互特性,正广泛应用于各个领域。其中,NFC 碰一碰发视频这一应用场景,为用户带来了新颖且高效的视频分享体验。想象一下&#x…...

浅谈鸿蒙跨平台开发框架ArkUI-X

之前写过使用uniapp的跨平台开发鸿蒙项目,今天分享一下开发体验更友好的跨平台开发框架ArkUI-X。 ArkUI-X看起来像是鸿蒙官方的框架,在DevEco中就可以安装和使用,而且会ArkUI就可以开发安卓和、iOS和鸿蒙三个平台的app,下面简单介…...

LLVM学习-- 构建和安装

一 LLVM版本 二 适用预构建的二进制文件安装LLVM 三 适用包管理器安装LLVM 四 从源码构建用于Linux的LLVM 五 从源码构建用于Windows和Visual Studio的LLVM 六 从源码构建用于MacOS 和XCode的LLVM 1.1 LLVM项目从10年前第一次发布到版本3.4,其SVN存储库包含了超过20…...

总结Solidity 的数据类型

数据类型 在 Solidity 中,类型系统非常丰富,主要分为 值类型(Value Types)和 引用类型(Reference Types)。此外,还有一些特殊类型和全局变量。 一.值类型 布尔型(bool&#xff09…...

C# 中泛型(Generics)‌的核心概念

在 C# 中,‌泛型(Generics)‌ 是一种强大的编程特性,允许你编写可重用、类型安全的代码,而无需为不同类型重复编写相似的逻辑。泛型的核心思想是‌参数化类型‌,即通过占位符(如 T)表…...

ubuntu 根据src 包从新打包

下边以onnxruntime示例: 1. 安装必要的依赖 确保你的系统已安装 devscripts、dpkg-dev 和 build-essential: sudo apt update sudo apt install devscripts dpkg-dev build-essential equivs2. 解压源码 进入存放源码包的目录,并解压: #c…...

如何启用 HTTPS 并配置免费的 SSL 证书

引言 HTTPS 已成为现代网站安全性的基础要求。通过 SSL/TLS 证书对数据进行加密,不仅可以保护用户隐私,还能提升搜索引擎排名并增强用户信任。本指南将详细介绍如何通过 Lets Encrypt(免费、自动化的证书颁发机构)为您的网站启用…...

Python数据与变量、进制转换、输入输出函数、基本运算,基础语法编程练习

第一节 数据与变量 程序 数据 指令 1.1 内置基本数据类型 (1)数值型 整数(int):用于表示整数,注意一点Python中int数据可以存储任意大小整数,不会像其他语言(C\C Java&#xff0…...

联邦学习(Federated Learning)

1. 概念 联邦学习(Federated Learning, FL)是一种分布式机器学习技术,它允许多个参与方(如设备、机构或企业)在不共享原始数据的情况下协同训练机器学习模型。联邦学习通过本地计算模型参数聚合的方式,保护…...

AI大模型核心原理(二)

一、人工智能的兴起。 1、前序。 艾伦麦席森图灵; 是计算机科学之父。 著名英国数学家、计算机科学家、逻辑学家和密码分析学家,被誉为计算机科学与人工智能之父。 阿兰・图灵(Alan Turing) 是译名(简称&#xff09…...

数据结构篇——线索二叉树

一、引入 遍历二叉树是按一定规则将二叉树结点排成线性序列,得到先序、中序或后序序列,本质是对非线性结构线性化,使结点(除首尾)在线性序列中有唯一前驱和后继;但以二叉链表作存储结构时,只能获…...

【蓝桥杯】742合唱队形(DP LIS)

思路 借这题复习一下LIS,实际上是LIS的升级版,求一个\/形或者/\行,用两次最长上升子串即可。 先从前往后求递增,再从后往前求递减。 先把满足要求的最长队形求出来,总人数减去队形人数就是要出列的数目。 code impo…...

MySQL二进制日志格式有哪几种

目录 一、二进制日志格式类型1. **STATEMENT 格式(SBR: Statement-Based Replication)**2. **ROW 格式(RBR: Row-Based Replication)**3. **MIXED 格式(混合模式)**二、二进制日志事件详解三、如何选择二进制日志格式?四、配置与查看二进制日志格式五、注意事项在 MySQL…...

VUE管理后台开发-vue-element-admin

# 克隆项目 git clone https://github.com/PanJiaChen/vue-element-admin.git # 进入项目目录 cd vue-element-admin # 安装依赖 npm install # 速度过慢可以使用下面方法进行指定下载镜像原 # 也可以使用nrm选择下载镜像原 # 建议不要用 cnpm 安装 会有各种诡异的bug 可以通…...

计算机网络原理

网络发展史 起初,计算机之间是相互独立的,分别完成不同的工作,效率较为低下.随着时代的发展,计算机开始协同完成任务,就有了网络互连.网络互连是指将多台计算机连接在一起,完成数据共享.根据网络互联的规模不同,可以划分为局域网和广域网.局域网,简称LAN.局域网内的主机可以互相…...

速盾:如何利用CDN静态加速匹配尾缀提升网站性能?

在当前数字化时代,网站性能对于用户体验至关重要。尤其是对于包含大量静态资源(如图片、CSS、JavaScript文件等)的网站来说,如何高效地管理和加速这些资源成为了一个重要课题。本文将介绍如何利用CDN静态加速匹配尾缀的方法来提升…...

【H2O2 | 软件开发】前端深拷贝的实现

目录 前言 开篇语 准备工作 正文 概述 JSON方法 递归 其他 结束语 前言 开篇语 本系列为短篇,每次讲述少量知识点,无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的,希望对诸位有所帮助。…...

C#语法基础总结

输入和输出 输入 Console.Read(); 从屏幕读取一个字符,并返回该字符所对应的整型数字 Console.ReadLine(); 从屏幕读取一串字符,并返回该字符串 输出 Console.WriteLine(); 输出内容,并换行 Console.Write(); 输出内容,不换行…...

《深度学习》—— 模型部署

文章目录 模型部署模型准备选择部署平台部署配置与服务化测试与验证优化与维护常用工具与框架Flask本地部署模型 模型部署 模型部署是将训练好的机器学习或深度学习模型投入实际生产环境,使其能够处理实时数据并提供预测或推理服务的过程。 模型准备 模型格式转换…...

E902基于bash与VCS的仿真环境建立

网上看见很多E902仿真的文章,但用到的编译器是类似于这种Xuantie-900-gcc-elf-newlib-x86_64-V3.0.1-20241120,而我按照相应的步骤与对应的编译器,仿真总会报错。后面将编译器换成riscv64-elf-x86_64-20210512,反而成功了。现在开…...

挖矿------获取以太坊测试币

文章目录 挖矿------获取以太坊测试币通过水龙头获取以太坊测试币了解Sepolia是什么?水龙头(Faucet)是什么?Gitcoin Passport是什么? 操作1.MetaMask钱包2.将MetaMask切换到Sepolia测试网络3.用MetaMask连接Gitcoin Pa…...

MySQL事务详解:从理论到实践,保障数据一致性

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、为什么需要事务?二、事务的四大特性(ACID)三、MySQL事务的使用方法1. 基本语法2. 自动提交的设置3. 保存点(…...

在家用台式机上部署 DeepSeek-R1:低成本高性能的 CPU 推理方案---不到 4 万元

近年来,随着大模型技术的飞速发展,开源模型如 DeepSeek-R1 的出现为技术爱好者提供了更多探索人工智能的机会。然而,这类模型动辄数百亿参数,传统意义上需要昂贵的 GPU 集群才能运行,让许多个人开发者望而却步。最近,腾讯玄武实验室基于 CPU 的硬件方案优化,成功将 Deep…...

神经网络量化3-全连接层实现量化

本节,我们模拟下全连接层实现量化,原理上为了方便计算,全连接矩阵采用动态量化的方法,而输入由于不断在变化,我们采用静态量化的方法,直接给出代码: import torch import numpy as np import m…...

12 File文件对象:创建、获取基本信息、遍历文件夹、查找文件;字符集的编解码 (黑马Java视频笔记)

文章目录 File >> 存储数据的方案1. 认识File2. File操作2.1 创建File对象2.2 File操作1)对文件对象的信息的操作2)文件/文件夹的创建/删除3)⭐⭐对文件夹的遍历 3. 方法递归3.1 认识递归3.2 递归算法及其执行流程1) 案例:2…...

【软件工程】03_软件需求分析

3.1 系统分析 1. 系统分析概述 系统分析是一组统称为计算机系统工程的活动。它着眼于所有的系统元素,而非仅仅局限于软件。系统分析主要探索软件项目的目标、市场预期、主要的技术指标等,其目的在于帮助决策者做出是否进行软件项目立项的决定。 2. 可行性分析(Feasibility …...

词向量+位置编码=语义+语序?Transformer如何让相加操作不丢失原意?

在Transformer模型中,词向量(Token Embedding)和位置编码(Position Encoding)通过相加的方式结合,而模型能够同时保留词本身的语义信息和位置信息,这主要得益于以下机制: 为什么相加…...

Spring(7)——MyBatis入门(1)

一、MyBatis入门 1.1 什么是MyBatis MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。 1.2 如何操作MyBatis 在application.properties进行配置 #驱动类名称 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #数据库连接的url spring.datasou…...

C语言文件操作入门

本节重点 理解文件的形式与基本概念二进制文件与文本文件文件的打开与关闭文件读写函数、文件缓冲区 正文开始--------------------------------------------------------------------------------------------------------------------- 一、为什么使用文件 程序运行时数据存…...

Java返回多个参数的方法

背景 在写代码的过程中,因有一些复杂的业务逻辑,需要返回多个结果。比如:需要增加一个true或者false,另外在加一个真正的结果值这样的类型。可能会有人用到数组以及Map等作为结果返回,当然这样确实是可以完成这样的功…...

微软开源神器OmniParser V2.0 介绍

微软开源的OmniParser V2.0是一款基于纯视觉技术的GUI智能体解析工具,旨在将用户界面(UI)截图转换为结构化数据,从而实现对计算机屏幕上的可交互元素的高效识别和操控。这一工具通过结合先进的视觉解析技术和大型语言模型&#xf…...

Java基础关键_023_IO流(一)

目 录 一、概述 二、分类 1.根据数据流向 2.根据读写数据形式 3.根据流在 IO 操作中的作用和实现方式 三、FileInputStream 1.说明 2.常用方法 (1)read() (2)read(byte[] b) (3)read(byte[] b, …...

Lora 中 怎么 实现 矩阵压缩

Lora 中 怎么 实现 矩阵压缩 1. 导入必要的库 import torch import re from datasets import Dataset from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, \get_cosine_schedule_with_warmup, EarlyStoppingCallback from peft...

lombok不起作用

xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.32</version> <scope>provided</scope> </dependency> - **作用**&#xff1a;引入 L…...

【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-1-常用命令速查表-集群健康检查、索引生命周期管理、故障诊断命令

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 附录-常用命令速查表 1-Elasticsearch 运维命令速查表&#xff08;集群健康检查、ILM管理、故障诊断&#xff09;一、集群健康检查与监控1.1 集群健康状态核心命令1.2 节点级健康诊断…...

探讨Deveco Studio常见问题及解决方案,分享快速排障方法

以下是针对 DevEco Studio 开发工具的常见问题、解决方案及快速排障方法&#xff0c;覆盖环境配置、编译运行、调试等多个环节&#xff0c;助您高效解决开发中的“拦路虎”。 一、环境配置问题 1. 安装失败或卡顿 现象&#xff1a; 安装时进度条卡住&#xff0c;或提示“Faile…...

Spring设计模式 八股速记 高层模块底层模块 依赖倒置原则 开闭原则 接口隔离原则

目录 高层模块底层模块 一、定义与核心思想 二、实现方式 三、优点与价值 四、典型应用场景 五、与其他原则的关系 示例说明 依赖倒置原则 一、定义与核心思想 二、实现方式 三、优点与价值 四、典型应用场景 五、与其他原则的关系 示例说明 自己理解 开闭原则 …...

RISCV虚拟化环境搭建

概要 本文记搭建 RISCV 虚拟化环境的流程。 整体架构 我们使用 QEMU 来模拟 RISCV 的各种硬件扩展环境&#xff0c;通过 QEMU 启动 Ubuntu 作为我们的 Host 来在 Host 之中通过 KVMTOOL 来运行 Guest&#xff0c;学习 RISCV 的虚拟化。 目前我的 X86_64 主机使用的是 Ubunt…...

数据结构——串、数组和广义表

串、数组和广义表 1. 串 1.1 串的定义 串(string)是由零个或多个字符组成的有限序列。一般记为 S a 1 a 2 . . . a n ( n ≥ 0 ) Sa_1a_2...a_n(n\geq0) Sa1​a2​...an​(n≥0) 其中&#xff0c;S是串名&#xff0c;单引号括起来的字符序列是串的值&#xff0c; a i a_i a…...

vue3 elementUi table自由渲染组件

文章目录 前言CustomTable如何使用tableColumn 属性h函数创建原生元素创建组件动态生成 前言 elementui中的table组件&#xff0c;表格中想要自由地渲染内容&#xff0c;是一种比较麻烦的事情&#xff0c;比如你表格中想要某一列插入一个button按钮&#xff0c;是不是要用插槽…...