您目前正在访问Microsoft Azure Global Edition技术文档网站。如果您需要访问由Century Internet运营的Microsoft Azure China技术文档网站,请访问。
使用反卷积和未加工的图像自动编码器
本文的内容
目录
总结
图像\ getStarted \ 07_deconvolution_py.py示例演示了如何使用解码和未解决的方式生成简单的图像自动编码器(07_deconvolution_bs.cntk是相应的brainscript版本)。它使用的MNIST数据集的分辨率为28x28x1,使用卷积和汇总并将其解码为原始分辨率,将其编码为7x7x1表示。训练条件是根平方错误(RMSE)。上图显示了原始图像的可视化kaiyun.ccm,编码的图像以及MNIST测试集的前五个图像的解码图像。
设置
为了运行该示例开yun体育app官网网页登录入口,需要一个MNIST数据集。您可以通过从示例\ image \ datasets \ mnist文件夹运行以下命令来获取数据:
python install_mnist.py
运行示例
此示例位于示例\ Image \ Getstarted文件夹中。要运行此示例,请使用以下命令从Python CNTK环境中运行Python版本():
python 07_deconvolution_py.py
或此命令用于Brainscript版本:
cntk configfile = 07_deconvolution_bs.cntk
用于训练和测试的RMSE值分别为0.225和0.223。要可视化编码和解码的图像,请运行以下命令:
python 07_deconvolution_visualizer.py
设置use_brain_script_model = true对于Brainscript模型和False Python模型。可视化将存储在输出文件夹示例中\ Image \ get -started,以及编码器的文本表示和解码器输出。
技术细节
以下是BrainScript中简单图像自动编码器的模型定义(有关完整配置文件)
cMap = 1
model = inputFeatures => {
conv1 = ConvolutionalLayer {cMap, (5:5), pad = true, activation=ReLU}(inputFeatures)
pool1 = MaxPoolingLayer {(4:4), stride=(4:4)}(conv1)
unpool1 = MaxUnpoolingLayer {(4:4), stride=(4:4)}(pool1, conv1)
deconv1 = DeconvLayer {1, (5:5), cMap, lowerPad=(2:2:0), upperPad=(2:2:0), bias=false}(unpool1)
}.deconv1
07_deconvolution_py.py中的相应模型定义为
cMap = 1
conv1 = cntk.layers.Convolution ((5,5), cMap, pad=True, activation=cntk.ops.relu)(scaled_input)
pool1 = cntk.layers.MaxPooling ((4,4), (4,4))(conv1)
unpool1 = cntk.layers.MaxUnpooling ((4,4), (4,4))(pool1, conv1)
z = cntk.layers.Deconvolution((5,5), num_channels, cMap, lower_pad=(0,2,2), upper_pad=(0,2,2), bias=False, init=cntk.glorot_uniform(0.001))(unpool1)
我们在此处介绍Brainscript版本,而Python版本相似。该模型首先针对输入函数应用具有深度cmap = 1的卷积符号,然后使用relu激活,并使用maxpoolinglayer和滤波器形状和步幅(4:4)。这会导致7x7x1编码的大小张量。然后,它使用具有相应的滤波器形状的Maxunpoolinglayer和Deconvlayer将其解码为原始分辨率。
解码器部分将原始的784(28x28)数字压缩为49(7x7),这是一个因子16。仅使用深度1进行卷积式甲壳版的优点是,可以以有意义的方式将编码器结果可视化(请参阅本页面顶部的图表)。可以增加卷积过滤器的数量,例如CMAP = 3,以减少压缩并希望获得更好的解码结果。在此示例中,用于训练和测试的RMSE减少到0.196。减少压缩的另一种方法是为池层使用较小的滤波器形状和步幅。使用(2:2)汇总和不致密以生成编码的张量,14x14x1,并在此示例中将RMSE减少为0.136训练和0.131测试。下图显示了三个讨论设置中MNIST测试的前五个图像的原始图像和解码图像的可视化。
反卷积和取消池
让我们仔细看一下Maxunpoolinglayer和Deconvlayer。
maxunpoolinglayer {(4:4),步幅=(4:4)}(pool1,conv1)
MaxPoolinglayer需要两个输入,即相应的池层(在这种情况下为pool1的输出)和相应的池层(Conv1的输入)。 Conv1CNTK需要确定取消池操作的目标,因为CNTK不存储所谓的开关变量(请参见此处的详细信息)。
deconvlayer {1,(5:5),cmap,lowerpad =(2:2:0),upperpad =(2:2:0)}
DeConvlayer的第一个参数是输出体积的深度,第二个参数是内核形状(宽度:高)云开·全站体育app登录,第三个参数是输入体积的深度。填充参数必须根据内核形状设置,以实现输出张量(在这种情况下,所需的宽度和高度为28x28)。有关DeConvlayer的更多详细信息,请参阅。
多层自动编码器
可以将更多的Cons/Deconv和池/Undolos层堆叠以使其更复杂的自动编码器。这是一个示例,其中包含可以在(每种类型两层的07_deconvolution_bs.cntk)中使用的模型,只需替换文件):
inputDim = 1
cMap1 = 5
cMap2 = 1
model = inputFeatures => {
conv_A = ConvolutionalLayer {cMap1, (5:5), pad = true, activation=ReLU}(inputFeatures)
pool_A = MaxPoolingLayer {(2:2), stride=(2:2)}(conv_A)
conv_B = ConvolutionalLayer {cMap2, (5:5), pad = true, activation=ReLU}(pool_A)
pool_B = MaxPoolingLayer {(2:2), stride=(2:2)}(conv_B)
unpool_B = MaxUnpoolingLayer {(2:2), stride=(2:2)}(pool_B, conv_B)
deconv_B = DeconvLayer {cMap1, (5:5), cMap2, lowerPad=(2:2:0), upperPad=(2:2:0)}(unpool_B)
unpool_A = MaxUnpoolingLayer {(2:2), stride=(2:2)}(deconv_B, conv_A)
deconv_A = DeconvLayer {inputDim, (5:5), cMap1, lowerPad=(2:2:0), upperPad=(2:2:0)}(unpool_A)
}.deconv_A
为了可视化结果,您需要替换z.pool1z.pool_b07_deconvolution_visualizer.py在运行结果之前以解决Encoder输出的正确节点名称。要调查模型中的所有节点名称,只需在Python脚本中uncomment print_all_node_names(model_file)即可。

