【PyTorch与深度学习】4、PyTorch的Dataset与DataLoader详细使用教程

课程地址
最近做实验发现自己还是基础框架上掌握得不好,于是开始重学一遍PyTorch框架,这个是课程笔记,这个课还是讲的简略,我半小时的课听了一个半小时。

1. Dataset与DataLoader

Dataset类是处理单个训练样本的,也就是它是实现如何从磁盘中读取训练数据集,包括它的标签,还会做一些数据预处理,最后变成x和y的训练对象。(构建数据集)
DataLoader:我们通过Dataset读取数据集以后,再通过DataLoader将其变为随机梯度下降算法所需要的mini-batch的形式,它会对多个样本组合成一个mini-batch,它也可能在每个周期以后对数据进行一个打乱,甚至它可能会将数据固定地保存在GPU中。

【提问】在深度学习领域,何为mini-batch
【GPT回答】在深度学习领域,mini-batch是指将训练数据集分成小批量进行训练的一种技术。通常情况下,训练数据集很大,一次性将全部数据用于训练会占用大量内存并且计算量巨大。因此,将数据分成小批量进行训练是一种有效的方法。mini-batch训练允许模型在每次迭代中使用部分数据,以逐渐优化模型参数。在每个迭代步骤中,模型接收一批输入数据,计算损失函数,并通过反向传播更新模型参数以减小损失。这一过程反复进行直到达到停止条件,例如达到指定的迭代次数或损失函数收敛到某个阈值。使用mini-batch训练可以提高模型训练的效率和稳定性,同时还可以充分利用计算资源。在深度学习里,mini-batch就像是一批批小份的训练数据,而不是一次性放进去的整份大餐。相当于你在学习时,不是一口吞下整本书,而是分成小段小段地消化。这样做有助于模型更高效地学习和优化参数,也更容易掌握。

1.1 利用torchvision库导入官方内置数据集

下面是官方给的例子,使用torchvision导入FashionMNIST数据集,torchvision库中的datasets中就有FashionMNIST数据集

【提问】FashionMNIST数据集是什么数据集?
【GPT回答】FashionMNIST数据集是一个常用的机器学习和深度学习领域的数据集,用于图像分类任务。它包含了10个类别的灰度服装图片,每个类别有6000张图片,总共包含了60000张图片。这些类别包括了衬衫、裤子、套衫、裙子、外套、凉鞋、衬衫、运动鞋和背包。FashionMNIST的图像大小都是28x28像素,相对于传统的手写数字数据集MNIST,FashionMNIST提供了更具挑战性的图像分类任务。这个数据集被广泛用于测试和比较不同机器学习和深度学习模型的性能。

import torch
from torch.utils.data import Dataset  # 引入PyTorch的Dataset模块
from torchvision import datasets  # 引入PyTorch的datasets模块
from torchvision.transforms import ToTensor  # 引入PyTorch的ToTensor转换
import matplotlib.pyplot as plt  # 引入matplotlib.pyplot库用于可视化

# 加载FashionMNIST训练数据集,并将其转换为Tensor格式
training_data = datasets.FashionMNIST(
    root="data",  # 数据集存储的根目录
    train=True,   # 指定加载训练数据集
    download=True,  # 如果数据不存在,是否下载
    transform=ToTensor()  # 将数据转换为Tensor格式
)

# 加载FashionMNIST测试数据集,并将其转换为Tensor格式
test_data = datasets.FashionMNIST(
    root="data",  # 数据集存储的根目录
    train=False,  # 指定加载测试数据集
    download=True,  # 如果数据不存在,是否下载
    transform=ToTensor()  # 将数据转换为Tensor格式
)

如果电脑中没有下载过这个数据集,则执行这些代码会自动下载FashionMNIST数据集

最后会下载到项目路径的根目录的data文件夹(如果没有data文件夹,将自动创建)

然后我们要对数据集做一个可视化,还要接着刚才的代码下面继续写:

# 接刚才的代码,对这个数据集做一个可视化
# 下面这段代码用于可视化FashionMNIST数据集中的随机样本图像,并在图像上显示对应的类别名称。
# 定义一个字典,用于将类别标签索引映射为可读的类别名称
labels_map = {
    0: "T-Shirt",
    1: "Trouser",
    2: "Pullover",
    3: "Dress",
    4: "Coat",
    5: "Sandal",
    6: "Shirt",
    7: "Sneaker",
    8: "Bag",
    9: "Ankle Boot",
}

# 创建一个大小为8x8英寸的图像窗口
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3  # 设置子图的行数和列数为3

# 循环创建子图并显示FashionMNIST训练集中的随机样本图像
for i in range(1, cols * rows + 1):
    sample_idx = torch.randint(len(training_data), size=(1,)).item()  # 随机选择一个样本的索引
    img, label = training_data[sample_idx]  # 获取该索引对应的图像和标签
    figure.add_subplot(rows, cols, i)  # 在图像窗口中添加子图
    plt.title(labels_map[label])  # 设置子图标题为该样本的类别名称
    plt.axis("off")  # 关闭子图的坐标轴
    plt.imshow(img.squeeze(), cmap="gray")  # 显示图像,squeeze()用于去除维度为1的维度,cmap="gray"指定灰度色彩映射
plt.show()  # 显示图像窗口

如果可视化成功,你将看到下面的窗口:

如果出现报错:OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
你需要在最开始调库的代码后面加上这样一段:

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

完整的代码:

import torch
from torch.utils.data import Dataset  # 引入PyTorch的Dataset模块
from torchvision import datasets  # 引入PyTorch的datasets模块
from torchvision.transforms import ToTensor  # 引入PyTorch的ToTensor转换
import matplotlib.pyplot as plt  # 引入matplotlib.pyplot库用于可视化
# 加如下代码
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"


# 加载FashionMNIST训练数据集,并将其转换为Tensor格式
training_data = datasets.FashionMNIST(
    root="data",  # 数据集存储的根目录
    train=True,   # 指定加载训练数据集
    download=True,  # 如果数据不存在,是否下载
    transform=ToTensor()  # 将数据转换为Tensor格式
)

# 加载FashionMNIST测试数据集,并将其转换为Tensor格式
test_data = datasets.FashionMNIST(
    root="data",  # 数据集存储的根目录
    train=False,  # 指定加载测试数据集
    download=True,  # 如果数据不存在,是否下载
    transform=ToTensor()  # 将数据转换为Tensor格式
)

# 接刚才的代码,对这个数据集做一个可视化
# 下面这段代码用于可视化FashionMNIST数据集中的随机样本图像,并在图像上显示对应的类别名称。
# 定义一个字典,用于将类别标签索引映射为可读的类别名称
labels_map = {
    0: "T-Shirt",
    1: "Trouser",
    2: "Pullover",
    3: "Dress",
    4: "Coat",
    5: "Sandal",
    6: "Shirt",
    7: "Sneaker",
    8: "Bag",
    9: "Ankle Boot",
}

# 创建一个大小为8x8英寸的图像窗口
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3  # 设置子图的行数和列数为3

# 循环创建子图并显示FashionMNIST训练集中的随机样本图像
for i in range(1, cols * rows + 1):
    sample_idx = torch.randint(len(training_data), size=(1,)).item()  # 随机选择一个样本的索引
    img, label = training_data[sample_idx]  # 获取该索引对应的图像和标签
    figure.add_subplot(rows, cols, i)  # 在图像窗口中添加子图
    plt.title(labels_map[label])  # 设置子图标题为该样本的类别名称
    plt.axis("off")  # 关闭子图的坐标轴
    plt.imshow(img.squeeze(), cmap="gray")  # 显示图像,squeeze()用于去除维度为1的维度,cmap="gray"指定灰度色彩映射
plt.show()  # 显示图像窗口

1.2 构建自己的Dataset类

要想构建自己的Dataset类,我们需要继承官方的Dataset类

【注】继承是面向对象编程的术语,在面向对象编程中,继承是一种机制,允许一个类(称为子类或派生类)从另一个类(称为父类或基类)中继承属性和方法。这意味着子类可以重用父类的代码,并且可以在此基础上添加新的属性和方法,或者修改现有的属性和方法,以满足特定的需求。继承提供了代码重用和扩展的便利性,有助于提高代码的可维护性和可扩展性。

我们继承的Dataset类必须要实现三个函数

  • __init__构造函数
  • __len__数据集长度
  • __geiitem__获取元素(按索引获取)

官方给的例子做注释后是这样的:

import os  # 导入os模块用于操作系统相关功能
import pandas as pd  # 导入pandas库用于数据处理
from torchvision.io import read_image  # 从torchvision.io模块中导入read_image函数

# 自定义自己的数据集类
class CustomImageDataset(Dataset):
    def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):
        # 初始化函数,接收注释文件路径、图像目录路径以及转换函数参数
        self.img_labels = pd.read_csv(annotations_file)  # 从CSV文件中读取图像标签数据
        # 标签存储在CSV文件中就这样读取,
        # 如果是存储在文本文档等格式下,需要自己改一下,
        # 看一看pandas读取数据的API,
        # 这个csv文件要求第0列是存储图片名,
        # 第1列是存储图片的标签,
        # 每一行都是一个图片样本向量(图片的名称, 类别的标签)
        self.img_dir = img_dir  # 设置图像所在的目录路径
        self.transform = transform  # 设置图像转换函数
        self.target_transform = target_transform  # 设置标签转换函数

    def __len__(self):
        # 返回数据集的长度,即图像标签的数量
        return len(self.img_labels)

    def __getitem__(self, idx):
        # 获取指定索引处的图像数据和标签数据
        img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])  # 获取图像文件的完整路径,照片的文件名是根据标签文件csv表格中的下标为idx的行,下标为0的列的所有元素中去取得的
        image = read_image(img_path)  # 读取图像文件
        label = self.img_labels.iloc[idx, 1]  # 获取图像对应的标签,标签是根据标签文件csv表格中的下标为idx的行,下标为1的列的所有元素中去取得的
        if self.transform:
            # 如果指定了图像转换函数,则对图像进行转换(归一化,旋转操作以及将图片的长宽都统一成一个格式等等)
            image = self.transform(image)
        if self.target_transform:
            # 如果指定了标签转换函数,则对标签进行转换
            label = self.target_transform(label)
        return image, label  # 返回图像数据和标签数据

transform函数我们后期会提到

1.3 构建自己的DataLoader类

Dataset它只能处理单个样本,通常我们训练的时候,如果只处理一个样本是不切实际的,因此我们要用DataLoader类将多个样本打包成mini-batch成批地进行训练,而且我们还可以用DataLoader对数据进行打乱,降低模型过拟合的可能性,然后DataLoader还使用Python的多线程技术,使得我们读取数据的速度不会影响到GPU训练的速度。
这是官方给的创建DataLoader的例子:

from torch.utils.data import DataLoader

# 第一个参数是数据集,第二个参数是batch_size(每batch批次中的图片个数),shuffle为True表示要打乱数据
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)  # 训练集DataLoader
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)  # 测试集DataLoader,一般来说测试集不需要打乱,它不参与梯度更新,它只是做一个前向的运算而已。

1.3.1 常用的DataLoader的构造函数参数

常用的DataLoader的构造函数参数如下:

  • dataset:传入自己定义好的数据集类Dataset
  • batch_size:默认值为1,它代表着每批次训练的样本的个数
  • shuffle:布尔类型,True为打乱数据集,False为不打乱数据集
  • sampler:决定以何种方式对数据进行采样,可以用它默认的sampler,也可以自己实现一个sampler。

【提问】请用通俗易懂的语言告诉我在PyTorch中DataLoader的构造函数的参数sampler有什么作用?
【GPT回答】在PyTorch中,DataLoader的构造函数的参数sampler用于指定数据采样的策略。通俗地说,采样器决定了数据集中样本的顺序以及每次迭代中使用哪些样本。
具体来说,当你创建一个DataLoader对象时,如果提供了sampler参数,PyTorch将根据指定的采样策略来确定每次迭代中要使用的数据样本。这可以帮助你自定义数据的加载顺序或者进行特定的采样方式,比如随机采样、顺序采样、权重采样等。
总之,sampler参数允许你在数据加载过程中灵活地控制样本的选择方式,以满足你的特定需求,例如在训练过程中对数据进行随机化处理或者按照一定的顺序进行加载。

  • batch_sampler:与sampler参数不同,batch_sampler参数用于指定每个批次中样本的采样策略。
  • num_workers:默认值为0,它是指数据加载的子进程数量,以加快数据加载的速度,提高训练效率。一般数值设定取决于CPU的核心数,通常数字大到一定程度,其加载速度也不会再提高了。
  • collate_fn:collate_fn参数允许你定义如何对样本进行批次化处理,以便神经网络可以有效地处理不同大小或结构的样本。也就是对每个批次做一个处理。通常情况下,当你从数据集中加载一批样本时,这些样本可能具有不同的大小或者结构。而神经网络需要接受固定大小的批次作为输入,因此需要将这些不同大小的样本组合成统一大小的批次。collate_fn参数允许你自定义如何将样本列表转换为批次。例如,你可以使用该参数来填充或截断样本,使它们具有相同的大小,或者进行其他任何类型的预处理操作以满足你的需求。相当于transform函数,但是transform函数是对单个样本进行处理,而collate_fn参数是对一个小批次的样本做处理。
  • pin_memory:布尔类型,默认值为False,用于指定是否将数据加载到固定的内存区域(pinned memory)中。固定内存区域是指一块被操作系统锁定的内存,这样可以防止它被移动,从而提高数据传输的效率。当pin_memory参数设置为True时,PyTorch会尝试将从数据集加载的数据存储在固定的内存中,这对于GPU加速的情况下可以提高数据传输效率,因为GPU可以直接从固定内存中访问数据,而不需要进行额外的内存拷贝操作。需要注意的是,只有当你使用GPU进行训练时,才会考虑使用pin_memory参数。对于CPU训练来说,pin_memory参数的影响通常不太明显。而且这个东西对训练速度的影响还有待考究。
  • drop_last:布尔类型,默认为False,如果你的总样本数目不是每个批次batch的整数倍的话,这时候我们可以将drop_last设置为True,让最后那个小批次(样本数没达到batch-size的批次)丢掉。

1.3.2 将数据送入DataLoader

官方还是用FashionMNIST数据集做例子,展示了将数据集送入DataLoader后,遍历DataLoader:

# 展示图片和标签

# 从训练数据集加载一个批次的数据(DataLoader对象是一个可迭代的对象,用next是获取可迭代对象的第一个元素)
train_features, train_labels = next(iter(train_dataloader))

# 打印特征(图像)和标签的形状,用于查看批次的大小信息
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")

# 获取批次中第一个图像并去除可能的单维度
img = train_features[0].squeeze()
# 获取第一个标签
label = train_labels[0]

# 使用matplotlib的imshow函数显示图像
plt.imshow(img, cmap="gray")
plt.show()

# 打印图像对应的标签
print(f"Label: {label}")

完整的代码:

import torch
from torch.utils.data import Dataset  # 引入PyTorch的Dataset模块
from torchvision import datasets  # 引入PyTorch的datasets模块
from torchvision.transforms import ToTensor  # 引入PyTorch的ToTensor转换
import matplotlib.pyplot as plt  # 引入matplotlib.pyplot库用于可视化
# 防止报错
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"


# 加载FashionMNIST训练数据集,并将其转换为Tensor格式
training_data = datasets.FashionMNIST(
    root="data",  # 数据集存储的根目录
    train=True,   # 指定加载训练数据集
    download=True,  # 如果数据不存在,是否下载
    transform=ToTensor()  # 将数据转换为Tensor格式
)

# 加载FashionMNIST测试数据集,并将其转换为Tensor格式
test_data = datasets.FashionMNIST(
    root="data",  # 数据集存储的根目录
    train=False,  # 指定加载测试数据集
    download=True,  # 如果数据不存在,是否下载
    transform=ToTensor()  # 将数据转换为Tensor格式
)

# 接刚才的代码,对这个数据集做一个可视化
# 下面这段代码用于可视化FashionMNIST数据集中的随机样本图像,并在图像上显示对应的类别名称。
# 定义一个字典,用于将类别标签索引映射为可读的类别名称
labels_map = {
    0: "T-Shirt",
    1: "Trouser",
    2: "Pullover",
    3: "Dress",
    4: "Coat",
    5: "Sandal",
    6: "Shirt",
    7: "Sneaker",
    8: "Bag",
    9: "Ankle Boot",
}

# 创建一个大小为8x8英寸的图像窗口
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3  # 设置子图的行数和列数为3

# 循环创建子图并显示FashionMNIST训练集中的随机样本图像
for i in range(1, cols * rows + 1):
    sample_idx = torch.randint(len(training_data), size=(1,)).item()  # 随机选择一个样本的索引
    img, label = training_data[sample_idx]  # 获取该索引对应的图像和标签
    figure.add_subplot(rows, cols, i)  # 在图像窗口中添加子图
    plt.title(labels_map[label])  # 设置子图标题为该样本的类别名称
    plt.axis("off")  # 关闭子图的坐标轴
    plt.imshow(img.squeeze(), cmap="gray")  # 显示图像,squeeze()用于去除维度为1的维度,cmap="gray"指定灰度色彩映射
plt.show()  # 显示图像窗口

from torch.utils.data import DataLoader

# 第一个参数是数据集,第二个参数是batch_size(每batch批次中的图片个数),shuffle为True表示要打乱数据
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)

# 展示图片和标签

# 从训练数据集加载一个批次的数据(DataLoader对象是一个可迭代的对象,用next是获取可迭代对象的第一个元素)
train_features, train_labels = next(iter(train_dataloader))

# 打印特征(图像)和标签的形状,用于查看批次的大小信息
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")

# 获取批次中第一个图像并去除可能的单维度
img = train_features[0].squeeze()
# 获取第一个标签
label = train_labels[0]

# 使用matplotlib的imshow函数显示图像
plt.imshow(img, cmap="gray")
plt.show()

# 打印图像对应的标签
print(f"Label: {label}")

除了对训练样本进行可视化展示以外,还打印特征(图像)和标签的形状,用于查看批次的大小信息:

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

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

相关文章

Jetson Orin NX L4T35.5.0平台LT6911芯片 调试记录(2)vi discarding frame问题调试

基于上篇调试记录 Jetson Orin NX L4T35.5.0平台LT6911芯片 调试记录(1)MIPI问题调试-CSDN博客 1.前言 当通过gstreamer持续捕获视频设备时,帧数会下降,并且I输入越高,丢失的帧数越多。 当达到4k30hz时,它完全无法使用,系统会在几秒钟的收集后崩溃并重新启动 4k30hz …

Stm32CubeMX 为 stm32mp135d 添加 adc

Stm32CubeMX 为 stm32mp135d 添加 adc 一、启用设备1. adc 设备添加2. adc 引脚配置2. adc 时钟配置 二、 生成代码1. optee 配置 adc 时钟和安全验证2. linux adc 设备 dts 配置 bringup 可参考: Stm32CubeMX 生成设备树 一、启用设备 1. adc 设备添加 启用adc设…

六氟化硫红外吸收峰

特此记录 anlog 2024年4月30日

标准汽车试验铁地板的技术要求

在现代科技化发展的工作中,试验平台被广泛使用。铸铁试验平台(试验铁地板)又叫试验工作平台,听名字大家也不难想象出来这是一款带有箱式体的台面,这是一种有长方形或者圆形又或者正方形的试验工作台。 铸铁试验平台&a…

Unity类银河恶魔城学习记录15-5,6 p157 Audio time limiter p158 Area sound

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​ AreaSound.cs using System.Collections; using System.Collections.G…

一站式AI创作平台:融合GPT会话、GPTs应用、Midjourney视觉艺术与Suno AI音乐合成模块

一、系统简介 星河易创AI系统基于ChatGPT的核心技术打造,集成了自然语言问答和艺术创作功能。该系统兼容Midjourney绘画技术,并支持官方GPT模型。它提供了多样化的应用,包括GPTs的多场景应用、实时GPT语音对话能力、GPT-4模型的先进特性&…

测试腾讯云的高防CC抵御了攻击

网站需要安装防止CC攻击,因为CC攻击是一种常见的网络攻击,它会对网站造成严重的影响。 CC攻击(Cybercrime Control)是指向网站发起大量虚假请求的攻击,目的是使网站的资源耗尽,无法正常运行。CC攻击与DDoS…

浅谈 HTTPS

文章目录 HTTPS 简介HTTPS 特点与 HTTP 的区别HTTPS 工作流程1. 服务端生成密钥对2. 服务端申请数字证书3. 服务端发送数字证书4. 客户端验证数字证书5. 客户端解析证书内容6. 客户端传送加密信息7. 服务端解密信息8. 双方协商生成会话密钥并交换9. 使用会话密钥进行通信 总结 …

UNI-APP_拨打电话权限如何去掉,访问文件权限关闭

uniapp上架过程中一直提示:允许“app名”拨打电话和管理通话吗? uniapp配置文件:manifest.json “permissionPhoneState” : {“request” : “none”//拨打电话权限关闭 }, “permissionExternalStorage” : {“request” : “none”//访…

vue 前端读取Excel文件并解析

前端读取Excel文件并解析 前端如何解释Excel呢 平时项目中对于Excel的导入解析是很常见的功能,一般都是放在后端执行;但是也有特殊的情况,偶尔也有要求说前端执行解析,判空,校验等,最后组装成后端接口想要的…

JAVA前端快速入门基础_javascript入门(03)

写在前面:本文用于快速学会简易的JS,仅做扫盲和参考作用 本章节主要介绍JS的事件监听 1.什么是事件监听 事件:是指发生在HTML端的事件,主要指以下几种。 1.按钮被点击 2.鼠标移动到元素上 3.按到了键盘 事件监听:当触发了事件时,JS会执行相…

ECharts在网页中添加可视化图标-在网页中添加交互图表+option模块案列详解

一、引言 ECharts 是一个使用 JavaScript 编写的开源可视化库,它可以在浏览器中生成交互式的图表。无论是折线图、柱状图、散点图还是饼图,ECharts 都能轻松应对。本文将带领大家了解如何在网页中添加 ECharts 可视化图标。 本章可以直接跳到第五点完整…

Flask简介

Flask简介 安装概述使用PyCharm创建一个Flask程序 Flask程序的基本结构初始化路由和视图函数启动服务器请求-响应循环 安装 概述 Flask算是小型框架,小到可以称为“微框架”。Flask 非常小,因此你一旦能够熟练使用它,很可能就能读懂它所有的…

Copilot Workspace是GitHub对人工智能驱动的软件工程的诠释

软件开发的未来是人工智能驱动的集成开发环境吗?至少GitHub 是这样想的。 在今年初秋于旧金山举行的 GitHub Universe 年度大会之前,GitHub 发布了 Copilot Workspace,这是一种开发环境,利用 GitHub 所称的 “Copilot 驱动的代理…

OneFlow新概念清单,AI深度学习的革命性突破(AI写作)

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

kotlinDSL控制的安卓项目导入已存在的模块后sync报错

原因很明显,但是我还找了好久 因为在import时并没有选择groove还是kotlin控制, 所以默认为groovy控制的,然而主项目是由kotlin dsl控制的grale行为。 原因清楚之后,就可以去检查一下,项目里是否包含了settings.gradle和…

基于EBAZ4205矿板的图像处理:03使用VIO调试输出HDMI视频图像

基于EBAZ4205矿板的图像处理:03使用VIO调试输出HDMI视频图像 在zynq调试时VIO是真的方便,特此写一篇博客记录一下 先看效果 项目简介 下面是我的BD设计,vtc用于生成时序,注意,2021.2的vivado的vtcIP是v6.2版本&…

动手学深度学习——softmax分类

1. 分类问题 回归与分类的区别: 回归可以用于预测多少的问题, 比如"预测房屋被售出价格",它是个单值输出。softmax可以用来预测分类问题,例如"某个图片中是猫、鸡还是狗?",这是一个多…

用Docker 创建并运行一个MySQL容器

可以在DockerHub官网上荡:mysql - Official Image | Docker Hub 指令是:docker pull mysql; 因为文件比较大可能时间比较长,我是跟着黑马的课走的 课程提供的有文件,我就用已有的资源了。 在tmp目录里放入mysql.tar包 然后cd进去 输入指令:docker lo…

java技术栈快速复习05_基础运维(linux,git)

Linux知识总览 linux可以简单的理解成和window一样的操作系统。 Linux和Windows区别 Linux是严格区分大小写的;Linux中一切皆是文件;Linux中文件是没有后缀的,但是他有一些约定俗成的后缀;Windows下的软件一般是无法直接运行的Li…
最新文章