分享

深度学习 .net keras python双实现

 幽游it 2020-03-17

资料

代码 

.net  python双实现

书(对应上述代码python)

京东读书  《Python深度学习》

热门人工智能分类

深度学习 keras(支持  tensorFlow、   cntk、torch)   比赛主流
CNN卷积  RNN循环  

强化学习 openAi

资料优点:

主流、系统化、入门容易、环境简单、附带训练集。

keras环境准备 windows

安装 conda

windows推荐地址:https://mirrors.tuna./anaconda/miniconda/Miniconda3-4.7.10-Windows-x86_64.exe
ubuntu推荐地址:https://mirrors.tuna./anaconda/miniconda/Miniconda3-4.7.10-Linux-x86_64.sh
conda create -n deepLearn python=3.6
conda activate deepLearn

安装visual studio code  ,非必须,也可以用其它的   spyder3

启动后选择打开目录
初次打开python文件时,右下角提示安装python扩展,点install
左下角切换python的不同版本(环境)

章节


# STEP 2: Create the Network
network = keras.models.Sequential()
network.add(keras.layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(keras.layers.Dense(10, activation='softmax'))

network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

# Step 3: Train
network.fit(train_images, train_labels, epochs=5, batch_size=128)
# Step 4 :Evaluate the Network
test_loss, test_acc = network.evaluate(test_images, test_labels)
# Step 5 :predict
predict1=model.predict(x_val)


python文件.net文件问题类型入参出参激活函数1
激活函数2隐藏层数损失函数优化器代码
2-1 
手写数字识别
mnist

28 * 28 图像单标签多分类relu整流线性单元
prelu、
elu
softmax
1categorical_crossentropy
rmsprop
network.add(keras.layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(keras.layers.Dense(10, activation='softmax'))
network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
3-5 
评论
imdb
-二分类词序列二分类relu
sigmoid [0,1]
2binary_crossentropy二元交叉熵

rmsprop
model.add(keras.layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(keras.layers.Dense(16, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
3-6  
新闻
reuters
-多分类词序列单标签多分类
relu
softmax
2categorical_crossentropy分类交叉熵
rmsprop
model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
3-7 

boston_housing
-标量回归多维数值价格relu
2mse平均绝对误差
rmsprop
 model.add(keras.layers.Dense(64, activation='relu', input_shape=(input_dim,)))
    model.add(keras.layers.Dense(64, activation='relu'))
    model.add(keras.layers.Dense(1))
    model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
4-4   
imdb 
优化 Dropout l1_l2







5-1 Ch_05_Introduction_to_Convnetsmnist
CNN







5-2Ch_05_Using_Convnets_With_Small_Datasets猫狗分类









5-3
猫狗分类
VGG16 预训练网络 特征提取97%准确率






5-4
猫狗分类
猫 可视化








Ch_05_Visualizing_Convnet_Filters









5-4Ch_05_Class_Activation_Heatmaps
热力图







6-1_a

词向量







6-1_b

imdb 
GloVe  








6-2Ch_06_Understanding_Recurrent_Neural_Networks
imdb  
RNN LSTM(长短期记忆) GRU(门控循环单元) 








model = Sequential()
>>> model.add(Embedding(10000, 32))
>>> model.add(SimpleRNN(32, return_sequences=True))
model.add(SimpleRNN(32, return_sequences=True))
>>> model.summary()
6-3Ch_06_Advanced_Usage_Of_Recurrent_Neural_Networks
温度预测 









6-4
imdb  
 Conv1D 比RNN速度更快








7-1

函数式,多输入输出







8-1

字符级的 LSTM 文本生成







8-2

DeepDream 图像生成







8-3Ch_08_Neural_Style_Transfer

风格迁移







8-4Ch_08_Generating_Images_With_VAEs
变分自编码器(VAE)







8-5

生成式对抗网络(GAN)









枚举值预处理

keras.utils.to_categorical(train_labels)

 > labels
    array([0, 2, 1, 2, 0])
    > to_categorical(labels)
    array([[ 1., 0., 0.],
           [ 0., 0., 1.],
           [ 0., 1., 0.],
           [ 0., 0., 1.],
           [ 1., 0., 0.]], dtype=float32)

数值预处理

x_train=np.array([[1],[2],[3],[4.3],[2.5],[4]])
mean = x_train.mean(axis=0)
x_train -= mean
std = x_train.std(axis=0)
x_train /= std

print(x_train)
>>>[[-1.58892269]
 [-0.70618786]
 [ 0.17654697]
 [ 1.32410224]
 [-0.26482045]
 [ 1.0592818 ]]

Z-score标准化、最大-最小标准化、对数函数转换,反余切函数转换


功能点

训练模型保存及再载入

model.save('model_weight_3-5.h5')
model = keras.models.load_model('model_weight_3-5.h5')  

预测应用

predict1=model.predict(x_val)
print(predict1)

.net 读取图片

   var imagePath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), imageName);
   var pathToVGG16model = VGG16.download_model_if_needed();
   var image = new float[224 * 224 * 3];
   CPPUtil.load_image(imagePath, image);

.net 保存与加载

 var network= CNTK.Function.Load(fullpath, computeDevice);
 network.Save(modelPath);

查看网络结构

model.summary()

模型复用

conv_base = keras.applications.VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))
    conv_base.summary()

冻结某层

 conv_base.trainable = False



微调模型

现在你可以开始微调网络。我们将使用学习率非常小的 RMSProp 优化器来实现。
(1) 在已经训练好的基网络(base network)上添加自定义网络。
(2) 冻结基网络。
(3) 训练所添加的部分。
(4) 解冻基网络的一些层。
(5) 联合训练解冻的这些层和添加的部分。
conv_base.trainable = True
set_trainable = False
for layer in conv_base.layers:
   if layer.name == 'block5_conv1':
     layer.trainable = True


总结一下,防止神经网络过拟合的常用方法包括:

获取更多的训练数据
减小网络容量
添加权重正则化
添加 dropout


深度学习适用场景

第1级无序列表">将向量数据映射到向量数据
预测性医疗保健:将患者医疗记录映射到患者治疗效果的预测。
行为定向:将一组网站属性映射到用户在网站上所花费的时间数据。
产品质量控制:将与某件产品制成品相关的一组属性映射到产品明年会坏掉的概率。

第1级无序列表">将图像数据映射到向量数据
医生助手:将医学影像幻灯片映射到是否存在肿瘤的预测。
自动驾驶车辆:将车载摄像机的视频画面映射到方向盘的角度控制命令。
棋盘游戏人工智能:将围棋和象棋棋盘映射到下一步走棋。
饮食助手:将食物照片映射到食物的卡路里数量。
年龄预测:将自拍照片映射到人的年龄。

第1级无序列表">将时间序列数据映射为向量数据
天气预报:将多个地点天气数据的时间序列映射到某地下周的天气数据。
脑机接口:将脑磁图(MEG)数据的时间序列映射到计算机命令。
行为定向:将网站上用户交互的时间序列映射到用户购买某件商品的概率。

第1级无序列表">将文本映射到文本
智能回复:将电子邮件映射到合理的单行回复。
回答问题:将常识问题映射到答案。
生成摘要:将一篇长文章映射到文章的简短摘要。

第1级无序列表">将图像映射到文本
图像描述:将图像映射到描述图像内容的简短说明。

第1级无序列表">将文本映射到图像
条件图像生成:将简短的文字描述映射到与这段描述相匹配的图像。
标识生成 / 选择:将公司的名称和描述映射到公司标识

第1级无序列表">将图像映射到图像
超分辨率:将缩小的图像映射到相同图像的更高分辨率版本。
视觉深度感知:将室内环境的图像映射到深度预测图。

第1级无序列表">将图像和文本映射到文本
视觉问答:将图像和关于图像内容的自然语言问题映射到自然语言答案。

第1级无序列表">将视频和文本映射到文本
视频问答:将短视频和关于视频内容的自然语言问题映射到自然语言答案。


不适合场景:

深度学习是机器学习的一个方支。普通深度学习 只是存储了权重,缺少历史记忆。
这个变换由层的权重来参数化,权重根据模型当前表现进行迭代更新。这种几何变换有一个关键性质,就是它必须是可微的(differentiable),这样我们才能通过梯度下降来学习其参数。

一般来说,任何需要推理(比如编程或科学方法的应用)、长期规划和算法数据处理的东西,无论投入多少数据,深度学习模型都无法实现。即使是排序算法,用深度神经网络来学习也是非常困难的。



数据转换1

会员1:{累计购买金额:2000,
                累计购买次数:5,
                注册日期:18-01-01
                姓别:男,
                客户价值:100
             }



转换为深度学习的训练数据:
x=  [金额均方差,次数均差,日期=1009,姓别=[1,0]  ]            y=[100]
x=  [金额均方差,次数均差,日期=1009,姓别=1,0       ]         y=[100]

数据转换2   销量预测


日期
时间(某小时)面包销量




1-19100




1-110200




















日期时间(某小时)节假日类型周几农历第几天公历第几天距离节假日天数天气
10011枚举枚举
枚举
数字或枚举数字或枚举
数字或枚举
枚举

数据转换3   下次乘机日期是否可以预测

乘机人1 :[    ]
下单日期乘机日期








2018-1-12018-2-1








2018-1-22018-2-10








2018-4-152018-6-1








2018-8-22018-8-4








2019-1-12019-2-1








2019-1-22019-2-10










乘机日期是否乘机
2018-2-11
2018-2-2
0
.。。。0
2018-2-101
。。。0
2018-6-11
。。。0
2018-8-41
2-11
2-101



一,train loss与test loss结果分析

 

train loss 不断下降,test loss不断下降,说明网络仍在学习;

train loss 不断下降,test loss趋于不变,说明网络过拟合;

train loss 趋于不变,test loss不断下降,说明数据集100%有问题;

train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;

train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

损失是对糟糕预测的惩罚。也就是说,损失是一个数值,表示对于单个样本而言模型预测的准确程度。如果模型的预测完全准确,则损失为零,否则损失会较大。训练模型的目标是从所有样本中找到一组平均损失“较小”的权重和偏差。例如,下图左侧显示的是损失较大的模型,右侧显示的是损失较小的模型。关于此图,请注意以下几点:
 
红色箭头表示损失。
蓝线表示预测。
 
 




kaggle比赛猫狗数据集

https://www./c/dogs-vs-cats/data 
百度网盘分享
链接:https://pan.baidu.com/s/13hw4LK8ihR6-6-8mpjLKDA 密码:dmp4

可视化

可视化卷积神经网络的中间输出(中间激活):有助于理解卷积神经网络连续的层如何对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义。
可视化卷积神经网络的过滤器:有助于精确理解卷积神经网络中每个过滤器容易接受的视觉模式或视觉概念。
可视化图像中类激活的热力图:有助于理解图像的哪个部分被识别为属于某个类别,从而可以定位图像中的物体。







5-4自动下载的模型

https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5
https://storage./download.tensorflow.org/data/imagenet_class_index.json


词嵌入方案

之一 word2vec 算法发布之后,这一思路才开始在研究领域和工业应用中取得成功。word2vec 算法由 Google 的 Tomas Mikolov 于 2013 年开发,其维度抓住了特定的语义属性,比如性别。
有许多预计算的词嵌入数据库,你都可以下载并在 Keras 的 Embedding 层中使用。word2vec 就是其中之一。另一个常用的是 GloVe(global vectors for word representation,词表示全局向量),由斯坦福大学的研究人员于 2014 年开发。这种嵌入方法基于对词共现统计矩阵进行因式分解。其开发者已经公开了数百万个英文标记的预计算嵌入,它们都是从维基百科数据和 Common Crawl 数据得到的。

下载 IMDB 数据的原始文本
首先,打开 http:///0tIo,下载原始 IMDB 数据集并解压。

下载 GloVe 词嵌入
打开 https://nlp./projects/glove,下载 2014 年英文维基百科的预计算嵌入。这是一个 822 MB 的压缩文件,文件名是 glove.6B.zip,里面包含 400 000 个单词(或非单词的标记)的 100 维嵌入向量。解压文件。


RNN

SimpleRNN 并不是 Keras 中唯一可用的循环层,还有另外两个:LSTM 和 GRU。在实践中总会用到其中之一,因为 SimpleRNN 通常过于简化,没有实用价值。SimpleRNN 的最大问题是,在时刻 t,理论上来说,它应该能够记住许多时间步之前见过的信息,但实际上它是不可能学到这种长期依赖的。其原因在于梯度消失问题(vanishing gradient problem),这一效应类似于在层数较多的非循环网络(即前馈网络)中观察到的效应:随着层数的增加,网络最终变得无法训练。

长短期记忆(LSTM,long short-term memory)算法由 Hochreiter 和 Schmidhuber 在 1997 年开发 ,是二人研究梯度消失问题的重要成果。

我们将会介绍以下三种技巧。

循环 dropout(recurrent dropout)。这是一种特殊的内置方法,在循环层中使用 dropout 来降低过拟合。
堆叠循环层(stacking recurrent layers)。这会提高网络的表示能力(代价是更高的计算负荷)。
双向循环层(bidirectional recurrent layer)。将相同的信息以不同的方式呈现给循环网络,可以提高精度并缓解遗忘问题。

6-3#解决证书报错 urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)>

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

6-3手动下载温度数据



数据标准化

mean = float_data[:200000].mean(axis=0)
float_data -= mean
std = float_data[:200000].std(axis=0)
float_data /= std

6-3 读取文件失败问题

# 原始代码
# with open(file='./text.txt', mode='r') as fp:

# 修改后代码
with open(file='./text.txt', mode='r', encoding='utf-8') as fp:


增加网络容量的通常做法是增加每层单元数或增加层数。循环层堆叠(recurrent layer stacking)是构建更加强大的循环网络的经典方法,例如,目前谷歌翻译算法就是 7 个大型 LSTM 层的堆叠——这个架构很大。
值得注意的是,本节的 RNN 层都是按时间正序处理序列(更早的时间步在前),这可能是一个随意的决定。至少,至今我们还没有尝试质疑这个决定。如果 RNN 按时间逆序处理输入序列(更晚的时间步在前),能否表现得足够好呢?
这非常合理:GRU 层通常更善于记住最近的数据,而不是久远的数据,与更早的数据点相比,更靠后的天气数据点对问题自然具有更高的预测能力(这也是基于常识的基准方法非常强大的原因)。因此,按时间正序的模型必然会优于时间逆序的模型。重要的是,对许多其他问题(包括自然语言)而言,情况并不是这样:直觉上来看,一个单词对理解句子的重要性通常并不取决于它在句子中的位置。我们尝试对 6.2 节 IMDB 示例中的 LSTM 应用相同的技巧。代码清单6-42 使用逆序序列训练并评估一个 LSTM

双向 RNN 

正是利用这个想法来提高正序 RNN 的性能。它从两个方向查看数据(见图 6-25),从而得到更加丰富的表示,并捕捉到仅使用正序 RNN 时可能忽略的一些模式。


model = Sequential()
model.add(layers.Bidirectional(
   layers.GRU(32), input_shape=(None, float_data.shape[-1])))
model.add(layers.Dense(1))
model.compile(optimizer=RMSprop(), loss='mae')
history = model.fit_generator(train_gen,
                steps_per_epoch=500,
                epochs=40,
                validation_data=val_gen,
                validation_steps=val_steps)
这个模型的表现与普通 GRU 层差不多一样好。其原因很容易理解:所有的预测能力肯定都来自于正序的那一半网络,因为我们已经知道,逆序的那一半在这个任务上的表现非常糟糕(本例同样是因为,最近的数据比久远的数据更加重要)。



6本章总结

第1级无序列表">你在本章学到了以下技术,它们广泛应用于序列数据(从文本到时间序列)组成的数据集。
如何对文本分词。
什么是词嵌入,如何使用词嵌入。
什么是循环网络,如何使用循环网络。
如何堆叠 RNN 层和使用双向 RNN,以构建更加强大的序列处理模型。
如何使用一维卷积神经网络来处理序列。
如何结合一维卷积神经网络和 RNN 来处理长序列。
你可以用 RNN 进行时间序列回归(“预测未来”)、时间序列分类、时间序列异常检测和序列标记(比如找出句子中的人名或日期)。
同样,你可以将一维卷积神经网络用于机器翻译(序列到序列的卷积模型,比如 SliceNet)、文档分类和拼写校正。
如果序列数据的整体顺序很重要,那么最好使用循环网络来处理。时间序列通常都是这样,最近的数据可能比久远的数据包含更多的信息量。
如果整体顺序没有意义,那么一维卷积神经网络可以实现同样好的效果,而且计算代价更小。文本数据通常都是这样,在句首发现关键词和在句尾发现关键词一样都很有意义。



7本章包括以下内容:

Keras 函数式 API
使用 Keras 回调函数
使用 TensorBoard 可视化工具
开发最先进模型的重要最佳实践

7.1.1 函数式 API 简介
使用函数式 API,你可以直接操作张量,也可以把层当作函数来使用,接收张量并返回张量(因此得名函数式 API)。
from keras import Input, layers
input_tensor = Input(shape=(32,)) ←------ 一个张量
dense = layers.Dense(32, activation='relu') ←------ 一个张量
一个层是一个函数
output_tensor = dense(input_tensor) ←------ 可以在一个张量上调用一个层,它会返回一个张量
我们首先来看一个最简单的示例,并列展示一个简单的 Sequential 模型以及对应的函数式 API 实现。
from keras.models import Sequential, Model
from keras import layers
from keras import Input
seq_model = Sequential() ←------ 前面学过的Sequential模型
seq_model.add(layers.Dense(32, activation='relu', input_shape=(64,)))
seq_model.add(layers.Dense(32, activation='relu'))
seq_model.add(layers.Dense(10, activation='softmax'))
input_tensor = Input(shape=(64,)) (以下4行)对应的函数式API实现
x = layers.Dense(32, activation='relu')(input_tensor)
x = layers.Dense(32, activation='relu')(x)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = Model(input_tensor, output_tensor) ←------ Model类将输入张量和输出张量转换为一个模型
model.summary() ←------ 查看模型
调用 model.summary() 的输出如下所示。



输入某个匿名人士的一系列社交媒体发帖,然后尝试预测那个人的属性,比如年龄、性别和收入水平(见图 7-7)。代码清单7-3 用函数式 API 实现一个三输出模型
from keras import layers
from keras import Input
from keras.models import Model
vocabulary_size = 50000
num_income_groups = 10
posts_input = Input(shape=(None,), dtype='int32', name='posts')
embedded_posts = layers.Embedding(256, vocabulary_size)(posts_input)
x = layers.Conv1D(128, 5, activation='relu')(embedded_posts)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.Conv1D(256, 5, activation='relu')(x)
x = layers.GlobalMaxPooling1D()(x)
x = layers.Dense(128, activation='relu')(x)
age_prediction = layers.Dense(1, name='age')(x) ←------ 注意,输出层都具有名称
income_prediction = layers.Dense(num_income_groups,
                 activation='softmax',
                 name='income')(x)
gender_prediction = layers.Dense(1, activation='sigmoid', name='gender')(x)
model = Model(posts_input,
        [age_prediction, income_prediction, gender_prediction])
重要的是,训练这种模型需要能够对网络的各个头指定不同的损失函数,例如,年龄预测是标量回归任务,而性别预测是二分类任务,二者需要不同的训练过程。但是,梯度下降要求将一个标量最小化,所以为了能够训练模型,我们必须将这些损失合并为单个标量。合并不同损失最简单的方法就是对所有损失求和。在 Keras 中,你可以在编译时使用损失组成的列表或字典来为不同输出指定不同损失,然后将得到的损失值相加得到一个全局损失,并在训练过程中将这个损失最小化。代码清单7-4 多输出模型的编译选项:多重损失
model.compile(optimizer='rmsprop',
        loss=['mse', 'categorical_crossentropy', 'binary_crossentropy'])
model.compile(optimizer='rmsprop', (以下4行)与上述写法等效(只有输出层具有名称时才能采用这种写法)
        loss={'age': 'mse',
           'income': 'categorical_crossentropy',
           'gender': 'binary_crossentropy'})
注意,严重不平衡的损失贡献会导致模型表示针对单个损失值最大的任务优先进行优化,而不考虑其他任务的优化。为了解决这个问题,我们可以为每个损失值对最终损失的贡献分配不同大小的重要性。如果不同的损失值具有不同的取值范围,那么这一方法尤其有用。比如,用于年龄回归任务的均方误差(MSE)损失值通常在 3~5 左右,而用于性别分类任务的交叉熵损失值可能低至 0.1。在这种情况下,为了平衡不同损失的贡献,我们可以让交叉熵损失的权重取 10,而 MSE 损失的权重取 0.5。代码清单7-5 多输出模型的编译选项:损失加权
model.compile(optimizer='rmsprop',
        loss=['mse', 'categorical_crossentropy', 'binary
_crossentropy'],
        loss_weights=[0.25, 1., 10.])
model.compile(optimizer='rmsprop', (以下7行)与上述写法等效(只有输出层具有名称时才能采用这种写法)
        loss={'age': 'mse',
           'income': 'categorical_crossentropy',
           'gender': 'binary_crossentropy'},
        loss_weights={'age': 0.25,
               'income': 1.,
               'gender': 10.})
与多输入模型相同,多输出模型的训练输入数据可以是 Numpy 数组组成的列表或字典。代码清单7-6 将数据输入到多输出模型中
model.fit(posts, [age_targets, income_targets, gender_targets], (以下2行)假设age_targets、income_targets和gender_targets都是Numpy数组
     epochs=10, batch_size=64)
model.fit(posts, {'age': age_targets, (以下4行)与上述写法等效(只有输出层具有名称时才能采用这种写法)
          'income': income_targets,
          'gender': gender_targets},
     epochs=10, batch_size=64)



残差连接

残差连接(residual connection)是一种常见的类图网络组件,在 2015 年之后的许多网络架构(包括 Xception)中都可以见到。2015 年末,来自微软的何恺明等人在 ILSVRC ImageNet 挑战赛中获胜 ,其中引入了这一方法。残差连接解决了困扰所有大规模深度学习模型的两个共性问题:梯度消失和表示瓶颈。通常来说,向任何多于 10 层的模型中添加残差连接,都可能会有所帮助。
残差连接是让前面某层的输出作为后面某层的输入,从而在序列网络中有效地创造了一条捷径。前面层的输出没有与后面层的激活连接在一起,而是与后面层的激活相加(这里假设两个激活的形状相同)。


Inception 模块
Inception 是一种流行的卷积神经网络的架构类型,它由 Google 的 Christian Szegedy 及其同事在 2013—2014 年开发,其灵感来源于早期的 network-in-network 架构。 它是模块的堆叠,这些模块本身看起来像是小型的独立网络,被分为多个并行分支。Inception 模块最基本的形式包含 3~4 个分支,首先是一个 1×1 的卷积,然后是一个 3×3 的卷积,最后将所得到的特征连接在一起。这种设置有助于网络分别学习空间特征和逐通道的特征,这比联合学习这两种特征更加有效。Inception 模块也可能具有更复杂的形式,通常会包含池化运算、不同尺寸的空间卷积(比如在某些分支上使用 5×5 的卷积代替 3×3 的卷积)和不包含空间卷积的分支(只有一个 1×1 卷积)。图 7-8 给出了这种模块的一个示例,它来自于 Inception V3。


想要学习图像表示的这种潜在空间,GAN 和 VAE 是两种不同的策略,每种策略都有各自的特点。VAE 非常适合用于学习具有良好结构的潜在空间,其中特定方向表示数据中有意义的变化轴(见图 8-10)。GAN 生成的图像可能非常逼真,但它的潜在空间可能没有良好结构,也没有足够的连续性。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多