关于深度学习中“分布”的一些思考(参考花书)

关于深度学习中“分布与概率”的一些思考(参考自花书)

前言

本文章内容全来自个人思考,欢迎各位指出其中的错误。

概率统计中的“分布”

在多维随机变量分布中:

  • 离散类型: P ( X = x ) P(X=x) P(X=x)表示X等于x的概率。
  • 连续类型: f ( x ) f(x) f(x)表示 X X X x x x邻域内取值的概率。 F ( x ) = ∫ − ∞ x f ( x ) d x F(x)=\int_{-\infty}^{x} f(x) dx F(x)=xf(x)dx表示 X X X − ∞ -\infty x x x区间上取值的概率。

深度学习中的“分布”

什么是深度学习中的分布
我先说一下我的思考,如果各位还有更好的解释请告诉我。

想法一
深度学习中的分布就是自然界确确实实存在的一些关系,这些关系虽然确实存在但是我们无法量化。例如,我们都知道那是猫,但是我们又无法解释它为什么是猫,我们可以很容易的区分出来猫和狗的区别,但是深度学习模型却很难。众所周知,深度学习模型还不具备可解读性,所以只能通过引入概率来引导模型学习其中的关系。例如,特征向量 x x x服从某一种分布它就是猫,而特征向量服从另一种分布它就是狗。这种特征向量服从的分布我们很难理解,但是模型很好理解,我愿意称其为特征向量 x x x内部特征存在某种关系使得下次遇见这种关系就对应某一种状态。我们经常看到样本是独立同分布的,这个概念在统计上很普遍,在深度学习中我认为它可以理解为你的每一次采样都必须与上一次采样没有关系,并且特征向量都源自于同一指标的相同标准。例如,做猫狗二分类时上一只猫的测量结果不能对下一只猫产生影响这就是独立,猫和狗采样相同的特征(不能一个选择耳朵长度,一个选择耳朵数量并且放到一起比较,这样没有实际意义)并且使用相同的单位(不能一个用厘米,一个用毫米,也没有实际意义)。
说了那么多,简单一句话就是:特征向量 x x x中特征间的某种特定的关系,这种关系我们无法感知,但是模型会察觉到并且根据我们赋予的任务来合适的使用它。

想法二
在监督学习中的分布就是给定输入的特征向量 x x x,经过一个从 P n P^{n} Pn P P P的一个确定映射(但不一定已知)(我认为也可以映射到 P m P^m Pm上,其中 m m m为监督学习中的目标数,实际上就是one-hot操作),将 x x x映射到 y y y,随机变量 Y Y Y落在 y y y附近的概率。

在非监督学习中的分布就是数据集 X X X中样本间所服从的固定概率分布(这个分布我们不一定已知,但是一定是确定的)。例如:在离散情况下统计每个值出现的次数做成分布列,或者在连续情况下在 x x x邻域取值的概率。

有关分布各符号的含义(来源于花书中文版115页)

  • P d a t a ( x ) P_{data}(x) Pdata(x): m个样本中的数据集 X = { x ( 1 ) , x ( 2 ) , ⋯   , x ( n ) } X=\{ x^{(1)}, x^{(2)}, \cdots, x^{(n)} \} X={x(1),x(2),,x(n)},独立地由未知真实数据生成分布 P d a t a ( x ) P_{data}(x) Pdata(x)生成。
  • P m o d e l ( x ; θ ) P_{model}(x;\theta) Pmodel(x;θ) P m o d e l ( x ; θ ) P_{model}(x;\theta) Pmodel(x;θ)是一族由 θ \theta θ确定在相同空间上的概率分布。换言之, P m o d e l ( x ; θ ) P_{model}(x;\theta) Pmodel(x;θ)将任意输入 x x x映射到实数来估计真实概率 P d a t a ( x ) P_{data}(x) Pdata(x)
  • P ^ d a t a ( x ) \hat{P}_{data}(x) P^data(x): 训练集上的经验分布 P ^ d a t a ( x ) \hat{P}_{data}(x) P^data(x)

举一个例子来说明
假设这里有一个二分类问题,给定 ( 耳朵,鼻子,体型 ) (耳朵,鼻子,体型) (耳朵,鼻子,体型)三个特征,判别动物是猫还是狗。给定输出层为2个结点,第一个结点为猫的概率,第二个结点为狗的概率(可以使用softmax激活函数,NLLLoss损失函数。如果不使用激活函数也可以判定返回值大的为预测结果)。
在分类问题中,一个样本一般包含输入数据(data)和目标(target)(data就是特征向量,target就表示哪个动物)。在这个问题中属于二分类问题,如果0表示猫,1表示狗。经过one-hot编码后, y = ( 1 , 0 ) T y=(1,0)^T y=(1,0)T表示猫, y = ( 0 , 1 ) T y=(0,1)^T y=(0,1)T表示狗。
模型可以表示为如下图所示:

Model
Model
动物特征
动物种类
x
y

其中 x ∈ P 3 , y ∈ P 2 x\in P^3, y\in P^2 xP3,yP2 P P P为数域。

借助例子解释分布
为了更好的解释,在这里从数据集 X X X中提取一个样本 x ( 1 ) x^{(1)} x(1),并且该特征向量对应的目标是猫(target=0)。

  • P d a t a ( x ) P_{data}(x) Pdata(x):表示物理世界真实存在的关系,不以外部因素改变而转移。在这个例子中:猫就是猫,狗就是狗,谁都无法改变。所以 P d a t a ( x ( 1 ) ) = ( 1 , 0 ) T P_{data}(x^{(1)}) = (1,0)^T Pdata(x(1))=(1,0)T
  • P m o d e l ( x ; θ ) P_{model}(x;\theta) Pmodel(x;θ):通过参数 θ \theta θ就可以看出来这个结果一定与模型有密切关联。事实上,这个值就是模型所给出的结果,如果对其进行softmax激活那么得到的结果就是每个分类结果都概率,如果不对其进行softmax激活那么得到的结果也隐含了每种类别的概率。假设softmax激活后的结果为 P m o d e l ( x ( 1 ) ; θ ) = ( 0.75 , 0.25 ) T P_{model}(x^{(1)}; \theta) = (0.75, 0.25)^T Pmodel(x(1);θ)=(0.75,0.25)T,那么表示猫的可能性为0.75,狗的可能性为0.25。
  • P ^ d a t a ( x ) \hat{P}_{data}(x) P^data(x): 表示训练集的分布,虽然也是不随模型的变化而变化,但是它具有训练集的局限性。例如:训练集常常无法收集到所有特征的信息,还有就是最关键的训练集样本的有限性(我们无法得到无穷多的样本,甚至常常无法得到足够大的样本)。这些训练集的局限性决定了我们训练的模型只能基于训练集的分布,而不是基于真实的分布。当训练集足够完备时,我们可以得到近似的真实分布,也就是为什么我们常常需要大样本和足够的特征。

关于样本多说一句,在深度学习模型中我们经常会遇见过拟合现象,提升样本数量[有时需要同时增加模型容量以获得更好的预测结果,花书中文版第103页]就是一个不错的解决方案。但是样本数目常常在模型训练前就固定了,所以我们常用的方案有:dropout[卷积,激活,池化,dropout],batchnorm[卷积,归一化,激活,池化],残差模型[卷积,relu激活,池化,最后一层池化加入了上一层池化后结果],这些方法参考自:deep learning with pytorch。花书在理论上给出了很多解决办法,例如:降低模型容量,正则化(代价函数))

一些疑惑

  • 在上面的定义中, P m o d e l ( x ; θ ) P_{model}(x;\theta) Pmodel(x;θ)将任意输入 x x x映射到实数来估计真实概率 P d a t a ( x ) P_{data}(x) Pdata(x)。我不知道这个映射是只针对最大似然估计这一部分,还是对所有的模型都是这样。如果对所有模型都成立的话,那么就不能使用one-hot操作将其映射到 P m P^m Pm上(其中 m m m为监督学习中的目标数)。
  • 在上面的定义中,数据集为 X = { x ( 1 ) , x ( 2 ) , ⋯   , x ( n ) } X=\{ x^{(1)}, x^{(2)}, \cdots, x^{(n)} \} X={x(1),x(2),,x(n)},一般来说监督学习的数据集包含特征向量data和目标target,所以这里的 x ( i ) x^{(i)} x(i)也应该为两部分构成,但是在下面直接使用 P m o d e l ( x ( i ) ; θ ) P_{model}(x^{(i)};\theta) Pmodel(x(i);θ)
<think>好的,用户想了解如何使用Python实现颜色迁移的深度学习方法,需要教程或示例代码。首先,我得回忆颜色迁移的基本概念和常用方法。颜色迁移通常是将源图像的色彩风格转移到目标图像上,同时保持目标图像的结构。传统方法有基于颜色统计的,比如Reinhard的颜色迁移算法,但用户可能更关注深度学习方法。 接下来,我需要考虑深度学习在颜色迁移中的应用。可能的方法包括使用卷积神经网络(CNN)或者生成对抗网络(GAN)。比如,有些研究使用预训练的VGG网络提取特征,然后通过优化损失函数来迁移颜色。另外,迁移学习可能也是一个方向,利用预训练模型进行微调。 然后,用户需要具体的教程或代码示例。我需要查找是否有现成的Keras或TensorFlow实现。记得之前有看到使用自适应实例归一化(AdaIN)的方法,或者利用CycleGAN进行风格迁移,但颜色迁移可能更简化一些。另外,要确保代码示例正确,并且步骤清晰。 引用部分需要结合用户提供的参考资料。用户给出的引用中有提到迁移学习(引用5),TensorFlow和Keras的籍(引用2),以及图像风格迁移(引用4)。因此,在回答中可以引用这些资料,特别是关于迁移学习的步骤和Keras的实现。 然后,思考用户可能遇到的问题。例如,如何处理输入图像,调整超参数,或者如何评估颜色迁移的效果。需要确保代码示例包括必要的库安装,如图像加载、预处理、模型定义、训练步骤等。 可能还需要考虑代码的简洁性。用户可能希望一个简单但有效的示例,所以选择基于预训练模型的方法,比如使用VGG19的特征提取层,然后定义内容损失和颜色损失,通过梯度下降优化。这样可以避免从头训练模型,节省时间。 最后,验证步骤是否正确。比如,加载图像,预处理,定义模型,计算Gram矩阵作为颜色特征,然后迭代优化目标图像。确保代码中的关键部分有注释,解释每一步的作用。同时,提醒用户可能需要调整的参数,如迭代次数、学习率等。 总结回答结构:先介绍颜色迁移的基本概念,然后分步骤说明实现方法,包括安装库、加载图像、定义模型、构建损失函数、优化过程,并提供完整的代码示例。最后,生成相关问题,帮助用户进一步学习。</think>### Python实现颜色迁移的深度学习方法 颜色迁移的深度学习方法通常通过特征提取和风格损失计算实现。以下是基于**自适应实例归一化(AdaIN)**的示例实现,结合预训练VGG网络进行特征对齐。 --- #### 实现步骤 1. **环境准备** ```python pip install tensorflow opencv-python numpy matplotlib ``` 2. **图像加载与预处理** ```python import cv2 import tensorflow as tf def load_image(path): img = cv2.imread(path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = tf.image.resize(img, (256, 256)) # 调整尺寸 img = tf.keras.applications.vgg19.preprocess_input(img) # VGG预处理 return tf.expand_dims(img, axis=0) # 添加batch维度 ``` 3. **构建特征提取模型** ```python vgg = tf.keras.applications.VGG19(include_top=False, weights='imagenet') layer_names = ['block1_conv1', 'block2_conv1', 'block3_conv1', 'block4_conv1'] outputs = [vgg.get_layer(name).output for name in layer_names] feature_extractor = tf.keras.Model(inputs=vgg.input, outputs=outputs) ``` 4. **自适应实例归一化(AdaIN)** $$ \text{AdaIN}(x, y) = \sigma(y)\left(\frac{x - \mu(x)}{\sigma(x)}\right) + \mu(y) $$ ```python def adain(content_feat, style_feat): content_mean, content_var = tf.nn.moments(content_feat, axes=[1,2], keepdims=True) style_mean, style_var = tf.nn.moments(style_feat, axes=[1,2], keepdims=True) return style_var * (content_feat - content_mean) / tf.sqrt(content_var + 1e-8) + style_mean ``` 5. **颜色迁移优化** ```python def color_transfer(source_img, target_img, iterations=100): generated_img = tf.Variable(target_img) # 初始化生成图像 optimizer = tf.optimizers.Adam(learning_rate=0.02) for _ in range(iterations): with tf.GradientTape() as tape: # 提取特征 src_features = feature_extractor(source_img) gen_features = feature_extractor(generated_img) # 计算AdaIN损失 loss = 0 for src, gen in zip(src_features, gen_features): loss += tf.reduce_mean(tf.square(adain(gen, src) - gen)) gradients = tape.gradient(loss, [generated_img]) optimizer.apply_gradients(zip(gradients, [generated_img])) return generated_img ``` 6. **结果保存** ```python result = color_transfer(source_img, target_img) result_img = tf.squeeze(result, axis=0).numpy() cv2.imwrite('output.jpg', cv2.cvtColor(result_img, cv2.COLOR_RGB2BGR)) ``` --- #### 核心原理 通过VGG网络提取图像高层特征,利用AdaIN将源图像的统计特征(均值、方差)与目标图像对齐,实现颜色分布迁移[^5]。优化过程中最小化生成图像与源图像的特征差异,同时保留目标图像的结构信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值