深度学习之自编码器(2)Fashion MNIST图片重建实战

2023-11-16

深度学习之自编码器(2)Fashion MNIST图片重建实战


 自编码器算法原理非常简单,实现方便,训练也较稳定,相对于PCA算法,神经网络的强大表达能力可以学习到输入的高层抽象的隐层特征向量 z \boldsymbol z z,同时也能够基于 z \boldsymbol z z重建出输入。这里我们基于Fashion MNIST数据集进行图片重建实战。


1. Fashion MNIST数据集

 Fashion MNIST是一个定位比MNIST图片识别问题稍微复杂的数据集,它的设定与MNIST几乎完全一样,包含了10类不同类型的衣服、鞋子、包等灰度图片,图片大小为 28 × 28 28\times28 28×28,共70000张图片,其中60000张用于训练集,10000张用于测试集,如下图所示,每行都是一种类别图片。

Fashion MNIST数据集


 可以看到,Fashion MNIST除了图片内容与MNIST不一样,其它设定都相同,大部分情况可以直接替换掉原来基于MNIST训练的算法代码,而不需要额外修改。由于Fashion MNIST图片识别相对于MNIST图片更难,因此可以用于测试稍微复杂的算法性能。

 在TensorFlow中,加载Fashion MNIST数据集同样非常方便,利用keras.datasets.fashion_mnist.load_data()函数即可在线下载、管理和加载。由于在线加载十分缓慢,我使用了本地加载。数据加载和测试代码如下:

import os
import tensorflow as tf
import numpy as np
import ssl

from Chapter12.Fashion_MNIST_dataload import get_data

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
ssl._create_default_https_context = ssl._create_unverified_context

batchsz = 512

# 加载Fashion MNIST图片数据集
(x_train, y_train), (x_test, y_test) = get_data()
# 归一化
x_train, x_test = x_train.astype(np.float32) / 255., x_test.astype(np.float32) / 255.
# 只需要通过图片数据即可构建数据集对象,不需要标签
train_db = tf.data.Dataset.from_tensor_slices(x_train)
train_db = train_db.shuffle(batchsz * 5).batch(batchsz)
# 构建测试集对象
test_db = tf.data.Dataset.from_tensor_slices(x_test)
test_db = test_db.batch(batchsz)
# 打印训练集和测试集的shape
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)


运行结果如下所示:

(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)


其中,数据加载函数get_data()实现如下:

import numpy as np
import gzip


def get_data():
    # 文件获取
    train_image = r"/Users/XXX/.keras/datasets/fashion_mnist/train-images-idx3-ubyte.gz"
    test_image = r"/Users/XXX/.keras/datasets/fashion_mnist/t10k-images-idx3-ubyte.gz"
    train_label = r"/Users/XXX/.keras/datasets/fashion_mnist/train-labels-idx1-ubyte.gz"
    test_label = r"/Users/XXX/.keras/datasets/fashion_mnist/t10k-labels-idx1-ubyte.gz"  # 文件路径
    paths = [train_label, train_image, test_label, test_image]

    with gzip.open(paths[0], 'rb') as lbpath:
        y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8)

    with gzip.open(paths[1], 'rb') as imgpath:
        x_train = np.frombuffer(
            imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)

    with gzip.open(paths[2], 'rb') as lbpath:
        y_test = np.frombuffer(lbpath.read(), np.uint8, offset=8)

    with gzip.open(paths[3], 'rb') as imgpath:
        x_test = np.frombuffer(
            imgpath.read(), np.uint8, offset=16).reshape(len(y_test), 28, 28)

    return (x_train, y_train), (x_test, y_test)


参考:
[1] fashion-mnist简介和使用及下载
[2] 从本地加载FASHION MNIST数据集并输入到模型进行训练


2. 编码器

 我们利用编码器将输入图片 x ∈ R 784 \boldsymbol x\in R^{784} xR784降维到较低维度的隐藏向量: h ∈ R 20 \boldsymbol h\in R^{20} hR20,并基于隐藏向量 h \boldsymbol h h利用解码器重建图片,自编码器模型如下图所示,编码器由3层全连接层网络组成,输出节点数分别为256、128、20,解码器同样由3层全连接网络组成,输出节点数分别为128、256、784。

在这里插入图片描述

Fashion MNIST自编码器网络结构


 首先是编码器子网络的实现。利用3层的神经网络将长度为784的图片向量数据一次降维到256、128,最后降维到h_dim维度,每层使用ReLU激活函数,最后一层不使用激活函数。代码如下:

# 创建Encoders网络,实现在自编码器类的初始化函数中
self.encoder = Sequential([
    layers.Dense(256, activation=tf.nn.relu),
    layers.Dense(128, activation=tf.nn.relu),
    layers.Dense(h_dim)
])

3. 解码器

 然后再来创建解码器子网络,这里基于隐藏向量h_dim一次升维到128、256、784长度,除最后一层,激活函数使用ReLU函数。解码器的输出为784长度的向量,代表了打平后的 28 × 28 28\times28 28×28大小图片,通过Reshape操作即可恢复为图片矩阵。代码如下:

# 创建Decoders网络
self.decoder = Sequential([
    layers.Dense(128, activation=tf.nn.relu),
    layers.Dense(256, activation=tf.nn.relu),
    layers.Dense(784)
])

4. 自编码器

 上述的编码器和解码器2个子网络均实现在自编码器类AE中,我们在初始化函数中同时创建这两个子网络。代码如下:

class AE(keras.Model):

    def __init__(self):
        super(AE, self).__init__()

        # 创建Encoders网络,实现在自编码器类的初始化函数中
        self.encoder = Sequential([
            layers.Dense(256, activation=tf.nn.relu),
            layers.Dense(128, activation=tf.nn.relu),
            layers.Dense(h_dim)
        ])

        # 创建Decoders网络
        self.decoder = Sequential([
            layers.Dense(128, activation=tf.nn.relu),
            layers.Dense(256, activation=tf.nn.relu),
            layers.Dense(784)
        ])


 接下来将前向传播过程实现在call函数中,输入图片首先通过encoder子网络得到隐藏向量h,再通过decoder得到重建图片。一次调用编码器和解码器的前向传播函数即可,代码如下:

def call(self, inputs, training=None):
    # [b, 784] => [b, 10]
    h = self.encoder(inputs)
    # [b, 10] => [b, 784]
    x_hat = self.decoder(h)

    return x_hat

5. 网络训练

 自编码器的训练过程与分类器的基本一致,通过误差函数计算出重建向量 x ˉ \bar\boldsymbol x xˉ与原始输入 x \boldsymbol x x之间的距离,再利用TensorFlow的自动求导机制同时求出encoder和decoder的梯度,循环更新即可。

 首先创建自编码器实例和优化器,并设置合适的学习率。例如:

# 创建网络对象
model = AE()
# 指定输入大小
model.build(input_shape=(None, 784))
# 打印网络信息
model.summary()
# 创建优化器,并设置学习率
optimizer = tf.optimizers.Adam(lr=lr)


 这里固定训练100个Epoch,每次通过前向计算获得重建图片向量,并利用tf.nn.sigmoid_cross+entropy_with_logits损失函数计算城建图片与原始图片直接的误差,实际上利用MSE误差函数也是可行的。代码如下:

for epoch in range(100):  # 训练100个Epoch

    for step, x in enumerate(train_db):  # 遍历训练集

        #  打平,[b, 28, 28] => [b, 784]
        x = tf.reshape(x, [-1, 784])
        # 构建梯度记录器
        with tf.GradientTape() as tape:
            # 前向计算获得重建的图片
            x_rec_logits = model(x)
            # 计算重建图片与输入之间的损失函数
            rec_loss = tf.losses.binary_crossentropy(x, x_rec_logits, from_logits=True)
            # 计算均值
            rec_loss = tf.reduce_mean(rec_loss)
        # 自动求导,包含了2个子网络的梯度
        grads = tape.gradient(rec_loss, model.trainable_variables)
        # 自动更新,同时更新2个子网络
        optimizer.apply_gradients(zip(grads, model.trainable_variables))

        if step % 100 == 0:
            # 间隔性打印训练误差
            print(epoch, step, float(rec_loss))

6. 图片重建

 与分类问题不同的是,自编码器的模型性能一般不好量化评价,尽管L值可以在一定程度上代表网络的学习效果,但我们最终希望获得还原度较高、样式较丰富的重建样本。因此一般需要更具具体问题来讨论自编码器的学习效果,比如对于图片重建,一般依赖于人工主管评价图片生成的质量,或利用某些图片逼真度计算方法(如Inception Score和Frechet Inception Distance)来辅助评估。

 为了测试图片重建效果,我们把数据集切分为训练集与测试集,其中测试集不参与训练。我们从测试集中随机采样测试图片 x ∈ D t e s t \boldsymbol x\in \mathbb{D}^{test} xDtest,经过自编码器计算得到重建后的图片,然后将真实图片与重建图片保存为图片阵列,并可视化,方便对比。代码如下:

# 重建图片,从测试集采样一批图片
x = next(iter(test_db))
logits = model(tf.reshape(x, [-1, 784]))  # 打平并送入自编码器
x_hat = tf.sigmoid(logits)  # 将输出转换为像素值,使用sigmoid函数
# 恢复为28×28,[b, 784] => [b, 28, 28]
x_hat = tf.reshape(x_hat, [-1, 28, 28])

# 输入的前50张+重建的前50张图片合并,[b, 28, 28] => [2b, 28, 28]                   
x_concat = tf.concat([x[:50], x_hat[:50]], axis=0)                                                                  
x_concat = x_concat.numpy() * 255.  # 恢复为0~255范围                    
x_concat = x_concat.astype(np.uint8)  # 转换为整型                       
save_images(x_concat, 'ae_images/rec_epoch_%d.png' % epoch)  # 保存图片 


 图片重建的效果如下图所示,其中每张图片的左边5列为真实图片,右边5列为对应的重建图片。

第0个Epoch

第49个Epoch

第99个Epoch


可以看到,第0个Epoch时,图片重建效果交叉,图片非常模糊,逼真度较差;随着训练的进行,重建图片边缘越来越清晰,第99个Epoch时,重建的图片效果以及比较接近真实图片。

 这里的save_images函数负责将多张图片合并并保存为一张大图,这部分代码使用PIL图片库完成图片阵列逻辑,代码如下:

def save_images(imgs, name):
    # 创建280×280大小的图片阵列
    new_im = Image.new('L', (280, 280))

    index = 0
    for i in range(0, 280, 28):  # 10行图片阵列
        for j in range(0, 280, 28):  # 10列图片阵列
            im = imgs[index]
            im = Image.fromarray(im, mode='L')
            new_im.paste(im, (i, j))  # 写入对应位置
            index += 1
    # 保存图片阵列
    new_im.save(name)

完整代码

import os
import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras import Sequential, layers
from PIL import Image
from matplotlib import pyplot as plt
import ssl

from Chapter12.Fashion_MNIST_dataload import get_data

ssl._create_default_https_context = ssl._create_unverified_context
tf.random.set_seed(22)
np.random.seed(22)
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
assert tf.__version__.startswith('2.')


def save_images(imgs, name):
    # 创建280×280大小的图片阵列
    new_im = Image.new('L', (280, 280))

    index = 0
    for i in range(0, 280, 28):  # 10行图片阵列
        for j in range(0, 280, 28):  # 10列图片阵列
            im = imgs[index]
            im = Image.fromarray(im, mode='L')
            new_im.paste(im, (i, j))  # 写入对应位置
            index += 1
    # 保存图片阵列
    new_im.save(name)


h_dim = 20
batchsz = 512
lr = 1e-3


(x_train, y_train), (x_test, y_test) = get_data()
x_train, x_test = x_train.astype(np.float32) / 255., x_test.astype(np.float32) / 255.
# we do not need label
train_db = tf.data.Dataset.from_tensor_slices(x_train)
train_db = train_db.shuffle(batchsz * 5).batch(batchsz)
test_db = tf.data.Dataset.from_tensor_slices(x_test)
test_db = test_db.batch(batchsz)

print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)


class AE(keras.Model):

    def __init__(self):
        super(AE, self).__init__()

        # 创建Encoders网络,实现在自编码器类的初始化函数中
        self.encoder = Sequential([
            layers.Dense(256, activation=tf.nn.relu),
            layers.Dense(128, activation=tf.nn.relu),
            layers.Dense(h_dim)
        ])

        # 创建Decoders网络
        self.decoder = Sequential([
            layers.Dense(128, activation=tf.nn.relu),
            layers.Dense(256, activation=tf.nn.relu),
            layers.Dense(784)
        ])

    def call(self, inputs, training=None):
        # [b, 784] => [b, 10]
        h = self.encoder(inputs)
        # [b, 10] => [b, 784]
        x_hat = self.decoder(h)

        return x_hat


# 创建网络对象
model = AE()
# 指定输入大小
model.build(input_shape=(None, 784))
# 打印网络信息
model.summary()
# 创建优化器,并设置学习率
optimizer = tf.optimizers.Adam(lr=lr)

for epoch in range(100):  # 训练100个Epoch

    for step, x in enumerate(train_db):  # 遍历训练集

        #  打平,[b, 28, 28] => [b, 784]
        x = tf.reshape(x, [-1, 784])
        # 构建梯度记录器
        with tf.GradientTape() as tape:
            # 前向计算获得重建的图片
            x_rec_logits = model(x)
            # 计算重建图片与输入之间的损失函数
            rec_loss = tf.losses.binary_crossentropy(x, x_rec_logits, from_logits=True)
            # 计算均值
            rec_loss = tf.reduce_mean(rec_loss)
        # 自动求导,包含了2个子网络的梯度
        grads = tape.gradient(rec_loss, model.trainable_variables)
        # 自动更新,同时更新2个子网络
        optimizer.apply_gradients(zip(grads, model.trainable_variables))

        if step % 100 == 0:
            # 间隔性打印训练误差
            print(epoch, step, float(rec_loss))

        # evaluation
        # 重建图片,从测试集采样一批图片
        x = next(iter(test_db))
        logits = model(tf.reshape(x, [-1, 784]))  # 打平并送入自编码器
        x_hat = tf.sigmoid(logits)  # 将输出转换为像素值,使用sigmoid函数
        # 恢复为28×28,[b, 784] => [b, 28, 28]
        x_hat = tf.reshape(x_hat, [-1, 28, 28])

        # 输入的前50张+重建的前50张图片合并,[b, 28, 28] => [2b, 28, 28]                   
		x_concat = tf.concat([x[:50], x_hat[:50]], axis=0)                                                                 
		x_concat = x_concat.numpy() * 255.  # 恢复为0~255范围                    
		x_concat = x_concat.astype(np.uint8)  # 转换为整型                       
		save_images(x_concat, 'ae_images/rec_epoch_%d.png' % epoch)  # 保存图片 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习之自编码器(2)Fashion MNIST图片重建实战 的相关文章

  • 张量流如何处理无法存储在一个盒子中的大变量

    我想通过训练超过十亿特征维度的数据来训练 DNN 模型 因此第一层权重矩阵的形状将为 1 000 000 000 512 这个权重矩阵太大 无法存储在一个盒子中 目前有没有什么解决方案来处理这么大的变量 例如将大的权重矩阵划分为多个框 Up
  • 对于只有 10000 个单词的字典来说,真正需要什么嵌入层 output_dim?

    我正在训练一个 RNN 其单词特征集非常少 大约 10 000 个 我计划在添加 RNN 之前从嵌入层开始 但我不清楚真正需要什么维度 我知道我可以尝试不同的值 32 64 等 但我宁愿先有一些直觉 例如 如果我使用 32 维嵌入向量 则每
  • Tensorflow conv2d_transpose 大小错误“out_backprop 的行数与计算的不匹配”

    我正在张量流中创建一个卷积自动编码器 我得到了这个确切的错误 tensorflow python framework errors InvalidArgumentError Conv2DBackpropInput Number of row
  • ValueError:请使用“Layer”实例初始化“TimeDistributed”层

    我正在尝试构建一个可以在音频和视频样本上进行训练的模型 但出现此错误ValueError Please initialize TimeDistributed layer with a Layer instance You passed Te
  • Tensorflow中通过字符串选择不同的模式

    我正在尝试构建一个 VAE 网络 我希望模型在不同的模式下做不同的事情 我有三种模式 训练 相同 和 不同 以及一个名为 interpolation mode 的函数 它根据模式执行不同的操作 我的代码如下所示 import tensorf
  • 使用大数据集在 Google Colab TPU 上训练 seq2seq 模型 - Keras

    我正在尝试使用 Google Colab TPU 上的 Keras 训练用于机器翻译的序列到序列模型 我有一个可以加载到内存中的数据集 但我必须对其进行预处理才能将其提供给模型 特别是 我需要将目标单词转换为一个热向量 并且在许多示例中 我
  • 错误:分配具有形状的张量时出现 OOM

    在使用 Apache JMeter 进行性能测试期间 我面临着初始模型的问题 错误 分配形状为 800 1280 3 和类型的张量时出现 OOM 通过分配器浮动在 job localhost replica 0 task 0 device
  • 为什么我的结果仍然无法重现?

    我想要为 CNN 获得可重复的结果 我使用带有 GPU 的 Keras 和 Google Colab 除了建议插入某些代码片段 这应该允许再现性 之外 我还在层中添加了种子 This is the first code snipped to
  • Tensorflow-GPU安装导入错误:DLL加载失败:找不到指定的模块

    好吧 我知道这可能已经回答了问题 但我已经尝试了 stackoverflow 上建议的几乎所有技巧来安装 tensorflow gpu 并在官方文档上建议 但没有运气 我遇到了同样的错误 首先我尝试过this https towardsda
  • 在 Tensorflow 中每行选择一个元素的优雅方法

    Given 一个矩阵A形状的 m n 张量I形状的 m 我想要一份清单J的元素来自A where J i A i I i 那是 I保存要从每行中选择的元素的索引A 背景 我已经有了argmax A 1 现在我也想要max 我知道我可以使用r
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 在c++中的嵌入式python中导入tensorflow时出错

    我的问题是关于在 C 程序中嵌入 Python 3 5 解释器以从 C 接收图像 并将其用作我训练的张量流模型的输入 当我在 python 代码中导入tensorflow库时 出现错误 其他库工作正常 简化后的代码如下 include
  • 稍微不同的形状会收敛到错误的数字 - 为什么?

    我试图弄清楚为什么 TensorFlow 会做一些令人惊讶的事情 我将其归结为一个测试用例 尝试对一个简单的问题进行线性回归 该问题只需将两个输入加在一起 权重收敛到 1 0 偏差收敛到 0 0 正如它们应该的那样 使用此版本的训练输出 t
  • PyInstaller 是否包含 CUDA

    我正在开发一个Python脚本 我使用Python 3 7 3 它使用tensorflow gpu 1 14 0 并使用PyInstaller 3 5将此脚本转换为可执行文件 我使用的是 CUDA 10 0 和 cuDNN 7 6 1 我的
  • 卷积神经网络 (CNN) 输入形状

    我是 CNN 的新手 我有一个关于 CNN 的问题 我对 CNN 特别是 Keras 的输入形状有点困惑 我的数据是不同时隙的二维数据 比方说10X10 因此 我有 3D 数据 我将把这些数据输入到我的模型中来预测即将到来的时间段 所以 我
  • 提交用于 Tensorflow 对象检测的 Google Cloud ML 训练作业时出现错误消息

    尝试提交 Tensorflow 对象检测任务的 Google Cloud ML 训练作业 我正在遵循官方指南 https github com tensorflow models blob master research object de
  • 窗口多维 Tensorflow 数据集

    我有形状的二维数据m by n我想要的窗口大小w沿着第一个轴进入数据集m w许多二维数组 每个数组的大小w by n 例如如果数据是 0 1 2 3 4 5 6 7 8 9 10 11 然后我想将其窗口化 0 1 2 3 4 5 6 7 8
  • TensorFlow 运算符重载

    有什么区别 tf add x y and x y 在 TensorFlow 中 当您使用以下命令构建图表时 您的计算图表会有什么不同 代替tf add 更一般地说 有 或者其他张量超载的操作 如果至少有一个x or y is a tf Te
  • 如何在google colaboratory上使用GPU升级tensorflow

    目前google colaboratory使用tensorflow 1 4 1 我想升级到1 5 0版本 每次当我执行时 pip install upgrade tensorflow命令 notebook实例成功将tensorflow版本升
  • 查找张量流运算所依赖的所有变量

    有没有办法找到给定操作 通常是损失 所依赖的所有变量 我想用它来将该集合传递到optimizer minimize or tf gradients 使用各种set intersection 组合 到目前为止我已经找到了op op input

随机推荐

  • 如何利用Java完成在数组中插入数值并且排序(从大到小)

    首先要对数据组进行扩容 然后定义新的数据组 将旧数据组的值重新赋值 最后开始插入数值 数组插入值 前提 数组本身有序 插入要保证不会越界 步骤 1 从后向前遍历 2 每个值要与插入的值进行比较 不符合顺序的后移 3 符合顺序的 要在后方插入
  • AD之PCB中元器件旋转45度后两元器件无法靠得很近

    最近笔者因为在画一块圆形PCB板 所以为了节省PCB空间 有时需要将元器件倾斜放置 在这时就产生了一个问题 问题情况及解决办法记录如下 问题描述 首先是正常竖直放置时 两元器件可以放置得很近 这没有问题 然后将两元器件同时选中并旋转45度
  • 软件工程基础知识--需求分析

    软件需求 在进行需求获取之前 首先要明确需要获取什么 也就是需求包含哪些内容 软件需求是指用户对目标软件系统在功能 行为 性能 设计约束等方面的期望 通常 这些需求包括功能需求 性能需求 用户或人的因素 环境需求 界面需求 文档需求 数据需
  • Numpy 数组切片

    一 列表切片 一维数组 1 1 切片原理 列表切片是从原始列表中提取列表的一部分的过程 在列表切片中 我们将根据所需内容 如 从何处开始 结束以及增量进行切片 剪切列表 Python中符合序列的有序序列都支持切片 slice 例如列表 字符
  • 嵌入式成长手册——初级嵌入式开发工程师技术栈

  • 【python爬虫】爬虫程序模板(面向对象)

    爬虫代码模板 程序结构 class xxxSpider object def init self 定义常用变量 比如url或计数变量等 def get html self 获取响应内容函数 使用随机User Agent def parse
  • 了解 HTTP3.0 吗?简要说一下 HTTP 的一个发展历程?

    码字不易 有帮助的同学希望能关注一下我的微信公众号 Code程序人生 感谢 代码自用自取 一 HTTP 3 0 HTTP3 0 也称作HTTP over QUIC HTTP3 0的核心是QUIC 读音quick 协议 由Google在 20
  • 埋点数据

    原文源自 http www woshipm com pmd 751876 html 本文作者将从一个埋点系统设计者的角度通俗系统地讲解埋点的全过程 涉及到埋点基础知识 埋点作用 埋点方法 埋点数据流程 埋点应用 埋点管理等信息 埋点是什么
  • STM32之中断与事件---中断与事件的区别

    转自http blog csdn net flydream0 article details 8208463
  • docker添加新的环境变量_关于docker:在Dockerfile中,如何更新PATH环境变量?

    我有一个从源代码下载和构建GTK的dockerfile 但以下行没有更新我的图像的环境变量 RUN PATH opt gtk bin PATH RUN export PATH 我读到我应该使用ENV来设置环境值 但以下指令似乎也不起作用 E
  • conda的安装与使用

    conda的安装与使用 一 conda可以干嘛 官方介绍 Anaconda 是一个包含数据科学常用包的 Python 发行版本 它基于 conda 一个包和环境管理器 衍生而来 你将使用 conda 创建环境 以便分隔使用不同 Python
  • 苏神文章解析(6篇)

    苏神文章解析 文章目录 苏神文章解析 1 浅谈Transformer的初始化 参数化与标准化 1 1采样分布 截尾正态分布 1 2 正交初始化 Xavier初始化 1 3 直接标准化 1 4 NTK参数化 1 5 残差连接 2 模型参数的初
  • 图像边缘算法——计算图像边缘(OpenCV)

    目录 一 算法描述 二 计算欧氏距离的Python代码 三 完整的代码 四 结果 一 算法描述 算法的基本原理是 将当前像素与邻接的下部和右部进行比较 如果相似 则将当前像素设置为白色 否则设置为黑色 如何判定像素相似呢 应用欧式距离算法
  • 吐血整理!Python程序员常见的几种变现方式!

    今天聊一个特俗但是大家都想的事情 那就是 赚钱 这件事 先说为什么这个事情 特俗 因为其实我发现我身边大部分程序员不爱谈钱 或者羞于谈钱 加上程序员工资普遍比较高 所以早期都没啥压力 但是随着年龄增大 薪资的涨薪幅度放缓 问题逐渐就暴露出来
  • n个人围成一圈 报数3 python

    n int input count 0 a list range 1 n 1 while len a gt 1 b a for i in range len a count 1 if count 3 0 a remove b i print
  • 不能使用clr编译c文件 怎么强制用clr_一名合格的 C/C++ 开发者拥有这些能力,你就可以去面试了!...

    首先你需要一个显得十分有 经验 的发型 然后拥有一身程序员的基本装备 比如 言归正传 在大多数开发人员的认知中 C C 是一门非常难学的编程语言 很多人知道它的强大 但因为 难 造成的恐惧让很多人放弃 在我看来 C C 一旦学成 其妙无穷
  • Hive简介和安装

    1 Hive是基于hadoop的数据仓库解决方案 由facebook贡献给Apache Hive出现的初衷是让不熟悉编程的数据分析人员也能够使用hadoop处理大数据 这是怎么实现的呢 2 我们先来看看Hive提供的接口 从下面Hive的架
  • Tesseract3.02训练生成新的识别语言库的详细步骤

    说明 本文参考了很多前辈的资料 主要是 tesseract OCR3 0语言库训练步骤 再结合自己的实践操作 个人感觉官网的教程是最权威的 耐着性子看完 收获很大 比网上到处看别人理解的更好 毕竟每个人理解的都是自己的 不全面 当然也包括本
  • Vue键盘事件

    一 keydown和keyup的区别 keydown 和 keyup 是JavaScript中用于捕获键盘按键事件的两个事件类型 它们有以下区别 触发时机 keydown 事件在按下键盘上的键时触发 无论是否已释放 keyup 事件在释放键
  • 深度学习之自编码器(2)Fashion MNIST图片重建实战

    深度学习之自编码器 2 Fashion MNIST图片重建实战 1 Fashion MNIST数据集 2 编码器 3 解码器 4 自编码器 5 网络训练 6 图片重建 完整代码 自编码器算法原理非常简单 实现方便 训练也较稳定 相对于PCA