“深度学习”学习日记。输出层的设计、MNIST的数据的下载和导入

2022.12.24 明天要考试,今天还在学习代码(主要是那个科目不想去复习)

# 神经网络输出层的设计
# 一般而言,回归问题用恒等函数,分类问题用softmax函数,我们识别图片中的人的问题属于分类问题,我们预测图片中人的身高属于回归问题

import numpy as np


def softmax(a):
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y


# soft函数的使用要注意“溢出”问题
# 比如:数值超过有限的字符宽度

a = np.array([1010, 1000, 900])
print(softmax(a), '\n')  # [nan nan nan] 产生缺省值 没有被正确计算


# 通过指数函数运算规则改进的soft函数

def new_softmax(a):
    tmp = np.max(a)
    exp_a = np.exp(a - tmp)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y


print(new_softmax(a), '\n')  # [9.99954602e-01 4.53978687e-05 1.68883521e-48]


# 回归函数
def identity_function(x):
    return x

# 输出层需要的神经元的数量,对于分类问题,输出层的神经元一般设定维类别数量。比如mnist图像是数字0~9,则我们需要10个神经元

MNIST内容很多,我相信这里让所有的初学者都头疼了挺久。这里写了两种方法下载和导入数据。第二种方法有待完善

# mnist数据集
# 这里mnist是0~9手写数字图像。训练集有6万张,测试图像有1万张,这些图像可以用于学习与推理。
# 一般的使用方法是,先用训练图像进行学习,再用学习到的模型能量能在多大程度上对预测图像进行正确分类

import torch
import torchvision
import numpy as np
from matplotlib import pyplot as plt
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# 使用pytorch自带的库函数下载、导入mnist
train_data = datasets.MNIST(
    root="./data/",
    train=True,
    transform=transforms.ToTensor(),
    download=True)

test_data = datasets.MNIST(
    root="./data/",
    train=False,
    transform=transforms.ToTensor(),
    download=True)

# root=存放的路径,注意相对路径和绝对路径;train=表示是否维训练集;
# transform 指定导入数据集时需要进行何种变换操作
# 此处ToTensor()将shape为(H, W, C)的nump.ndarray或img转为shape为(C, H, W)的tensor,其将每一个数值归一化到[0,1],其归一化方法比较简单,直接除以255即可
# download=如果不存在数据集则下载

train_data_loader = torch.utils.data.DataLoader(
    dataset=train_data,
    batch_size=64,
    shuffle=True,
    drop_last=True)

test_data_loader = torch.utils.data.DataLoader(
    dataset=test_data,
    batch_size=64,
    shuffle=False,
    drop_last=False)

#  dataset=指的导入数据的路径; batch_size=每次导入的数据图片个数;
#  shuffle=表示数据是否随机打乱;drop_last=保证总数据集/batch_size为整数,余数舍弃

# 进行一个批次的数据的图像预览
images, labels = next(iter(train_data_loader))  # images:Tensor(64,1,28,28)、labels:Tensor(64,)
img = torchvision.utils.make_grid(images)  # 把64张图片拼接为1张图片

# pytorch网络输入图像的格式为(C, H, W),而numpy中的图像的shape为(H,W,C)。故需要变换通道才能有效输出
img = img.numpy().transpose(1, 2, 0)
std = [0.5, 0.5, 0.5]
mean = [0.5, 0.5, 0.5]
img = img * std + mean  # 对图片灰度进行计算,调整图片的灰度
print(labels)
print(labels.shape)
print(images)
plt.imshow(img)
plt.show()

# 进行一个图像的预览
# images:Tensor(64,1,28,28)、labels:Tensor(64,) next(iter())是一个迭代器,
images, labels = next(iter(train_data_loader))  # (1,28,28)表示该图像的 height、width、color(颜色通道,即单通道)
images = images.reshape(64, 28, 28)
img = images[0, :, :]  # 取batch_size中的第一张图像
np.savetxt('img.txt', img.cpu().numpy(), fmt="%f", encoding='UTF-8')  # 将像素值写入txt文件,以便查看
img = img.cpu().numpy()  # tensor转为numpy类型,方便有效输出 cpu()表示在CPU上的tensor这里可有可无

print(images)

fig = plt.figure(figsize=(12, 12))
ax = fig.add_subplot(111)
ax.imshow(img, cmap='gray')
width, height = img.shape
thresh = img.max() / 2.5

# 调节图片像素的颜色
for x in range(width):
    for y in range(height):
        val = round(img[x][y], 2) if img[x][y] != 0 else 0
        ax.annotate(str(val), xy=(y, x),
                    horizontalalignment='center',
                    verticalalignment='center',
                    color='white' if img[x][y] < thresh else 'black')
plt.show()

 

 

 

import sys
import os
import numpy as np
from PIL import Image
from dataset.mnist import load_mnist


def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()


sys.path.append(os.pardir)
(x_train, t_train), (x_text, t_test) = load_mnist(flatten=True, normalize=False)
img = x_train[0]
label = t_train[0]
print(label)

print(img.shape)
img = img.reshape(28, 28)
print(img.shape)

img_show(img)
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MNIST数据集是机器学习中常用的手写数字图片数据集,包含了60,000个训练样例和10,000个测试样例。在Matlab中,如果想要导入MNIST数据集,可以按照以下步骤进行操作: 1. 首先,从MNIST官网下载数据集。数据集分为四个文件:训练集、训练集标签、测试集、测试集标签,需要放置在同一文件夹中。 2. 用Matlab打开并读取数据集文件。可以使用load函数进行读取,如下所示: traindata = load('train-images.idx3-ubyte'); trainlabel = load('train-labels.idx1-ubyte'); testdata = load('t10k-images.idx3-ubyte'); testlabel = load('t10k-labels.idx1-ubyte'); 3. 将读取的数据进行格式化处理。因为MNIST数据集中的图像数据是以像素点的灰度值形式进行存储的,需要将数据进行归一化处理、转换成矩阵形式,并将标签数据进行编码或向量化处理。 4. 通过Matlab内置的分类器、神经网络等方法进行训练和测试。 需要注意的是,MNIST数据集是国外的数据源,因此对于中文的使用可能需要进行一定的编码转换,如使用UTF-8编码等。此外,在读取数据集时,如果遇到困难,可以适当调整数据集的存储路径或使用Matlab内置的工具箱进行分析和调试。 ### 回答2: Matlab是一种用于科学计算和数据分析的软件,可以通过几个步骤从MNIST数据集中导入数据MNIST数据集是一个常用的手写数字识别数据集,其中包含60,000个训练集和10,000个测试集图像,每个图像都是28×28像素的灰度图像。 1. 下载数据集:首先需要从MNIST数据集的官方网站(http://yann.lecun.com/exdb/mnist/)中下载数据集文件并解压。 2. 读取数据:使用Matlab中的函数fread()读取图像和标签数据。 3. 转换数据格式:将原始数据转换成Matlab中数组格式。对于图像数据,可以用reshape()函数将每个图像的像素值重新组织为一个28×28的数组;对于标签数据,可以将其转换为单位矩阵的形式,方便后续分类算法的处理。 4. 数据分割:将导入数据集分为训练集和测试集。这可以通过对读取的数据进行切片(slice)操作来实现。 5. 可视化数据:为了检查数据是否正确导入并且了解数据集的特点,可以使用Matlab中的imshow()函数来可视化一些图像。 总之,导入MNIST数据集的过程可以通过Matlab的内置函数和工具来完成。这个过程需要一些编程技能和数据处理的知识,但是一旦成功导入数据,就可以使用Matlab的机器学习算法来训练和测试分类模型,从而实现手写数字识别任务。 ### 回答3: Matlab是一种功能强大的数学软件,可以用于处理和分析各种数学数据MNIST数据集是一种常用的手写数字图像数据集,可以用于机器学习中的图像识别任务。在Matlab中导入MNIST数据集的方法如下: 1. 首先下载MNIST数据集,并解压缩到本地磁盘上的一个目录中。 2. 打开Matlab软件,并在命令窗口中输入以下命令:load(fullfile('path_to_dataset_folder','train-images-idx3-ubyte.mat'));load(fullfile('path_to_dataset_folder','train-labels-idx1-ubyte.mat'));load(fullfile('path_to_dataset_folder','t10k-images-idx3-ubyte.mat'));load(fullfile('path_to_dataset_folder','t10k-labels-idx1-ubyte.mat')); 其中,'path_to_dataset_folder'是数据集所在的文件夹路径。 3. 运行上述命令后,将会在Matlab工作区中加载MNIST数据集,其中包括训练集和测试集的图像数据和标签数据。可以通过命令window.showImage(train_images(:,:,1))来显示训练集中的第一张图像,其中train_images是图像数据,train_labels是标签数据。 4. 在导入MNIST数据集之后,可以使用Matlab中的各种函数和工具对数据进行处理、分析和呈现,以便进行图像识别和分类等机器学习任务。 总之,导入MNIST数据集到Matlab中并不难,只需要执行上述几个简单的步骤即可。同时需要注意路径的准确性和数据类型的匹配性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在撒哈拉卖雨伞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值