【theano-windows】学习笔记十四——堆叠去噪自编码器

前言

前面已经学习了softmax,多层感知器,CNN,AE,dAE,接下来可以仿照多层感知器的方法去堆叠自编码器

国际惯例,参考文献:

Stacked Denoising Autoencoders (SdA)

Greedy Layer-Wise Training of Deep Networks

理论

通过将降噪自编码器的低层隐单元输出作为当前层的输入,可以把自编码器堆叠成深度网络。 这类的无监督预许连方法是逐层展开的。每一层都通过最小化输入(上一层的输出编码)的重构误差训练一个降噪自编码器. 一旦之前的k层被训练了,我们就可以训练第k+1层, 因为我们可以计算下一层的隐层表示。

如果所有层都预训练完毕,就进入第二个阶段称为微调(fine-tuning), 这里由于手头只有mnist数据集,所以我们就采用有监督微调。首先在预训练好的网络顶部添一个softmax层,然后将整个网络当做多层感知机训练。

训练过程包含两个阶段:自编码器的逐层训练,多层感知器MLP的整体训练,这两个阶段是链接着的,因为:

  • 自编码与MLP的sigmoid层是共享参数的,这里的参数说的是权重和偏置
  • MLP的中间层计算得到的特征表示作为自编码器的输入

【思考】其实这里感觉的难点在于如何将训练好的逐层AE参数导入到第二阶段的MLP中,剩下的比如怎么建立模型,可以参考MLP(由多隐层和softmax层组成)的写法.

我个人比较喜欢的代码风格是, 先定义一些必要的函数(比如读取数据, 数据预处理等), 然后定义网络结构(初始化每一层参数), 随后针对网络结构进行梯度更新和训练, 最后测试模型, 所以写堆叠自编码的流程大概也是:①定义读数据函数, ②定义网络结构③定义预训练④定义微调⑤测试

代码

老样子, 先数据集的读取函数

import theano
import theano.tensor as T
import numpy as np
import os
import cPickle,gzip
from theano.tensor.shared_randomstreams import RandomStreams#定义读数据的函数,把数据丢入到共享区域
def load_data(dataset):data_dir,data_file=os.path.split(dataset)if os.path.isfile(dataset):with gzip.open(dataset,'rb') as f:train_set,valid_set,test_set=cPickle.load(f)#共享数据集def shared_dataset(data_xy,borrow=True):data_x,data_y=data_xyshared_x=theano.shared(np.asarray(data_x,dtype=theano.config.floatX),borrow=borrow)shared_y=theano.shared(np.asarray(data_y,dtype=theano.config.floatX),borrow=borrow)return shared_x,T.cast(shared_y,'int32')#定义三个元组分别存储训练集,验证集,测试集train_set_x,train_set_y=shared_dataset(train_set)valid_set_x,valid_set_y=shared_dataset(valid_set)test_set_x,test_set_y=shared_dataset(test_set)rval=[(train_set_x,train_set_y),(valid_set_x,valid_set_y),(test_set_x,test_set_y)]return rval

然后我们搭建堆叠自编码器需要有隐层的建立和最后一层的softmax层, 直接copy前面学到的建立方法

对于隐层的代码

#预训练需要有隐层
class HiddenLayer(object):def __init__(self,rng,input,n_in,n_out,W=None,b=None,activation=T.tanh):self.input=inputif W is None:W_values=np.asarray(rng.uniform(low=- np.sqrt(6./(n_in+n_out)),high= np.sqrt(6./(n_in+n_out)),size=(n_in,n_out)),dtype=theano.config.floatX)if activation==T.nnet.sigmoid:W_values *= 4W=theano.shared(value=W_values,name='W',borrow=True)if b is None:b_vaules=np.zeros((n_out,),dtype=theano.config.floatX)b=theano.shared(value=b_vaules,name='b',borrow=True)self.W=Wself.b=blin_output=T.dot(input,self.W)+self.b#未被激活的线性操作self.output=(lin_output if activation is None else activation(lin_output))self.params=[self.W,self.b]

然后是softmax层的建立方法

#微调需要softmax
class LogisticRegression(object):def __init__(self,input,n_in,n_out):#共享权重self.W=theano.shared(value=np.zeros((n_in,n_out),dtype=theano.config.floatX),name='W',borrow=True)#共享偏置self.b=theano.shared(value=np.zeros((n_out,),dtype=theano.config.floatX),name='b',borrow=True)#softmax函数self.p_y_given_x=T.nnet.softmax(T.dot(input,self.W)+self.b)#预测值self.y_pred=T.argmax(self.p_y_given_x,axis=1)self.params=[self.W,self.b]#模型参数self.input=input#模型输入#定义负对数似然def negative_log_likelihood(self,y):return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]),y])#定义误差def errors(self, y):# check if y has same dimension of y_predif y.ndim != self.y_pred.ndim:raise TypeError('y should have the same shape as self.y_pred',('y', y.type, 'y_pred', self.y_pred.type))# check if y is of the correct datatypeif y.dtype.startswith('int'):# the T.neq operator returns a vector of 0s and 1s, where 1# represents a mistake in predictionreturn T.mean(T.neq(self.y_pred, y))else:raise NotImplementedError()

预训练过程是逐层按照自编码训练, 因为需要自编码的训练方法, 同样copy前面的自编码建立代码

#定义自编码部分
class dA(object):#初始化所需参数,随机初始化,输入,输入单元数,隐单元数, 权重,偏置def __init__(self,rng,input=None,n_visible=784,n_hidden=500,W=None,h_b=None,v_b=None):self.n_visible=n_visibleself.n_hidden=n_hiddenif not W:initial_W=np.asarray(rng.uniform(low=-4*np.sqrt(6./(n_hidden+n_visible)),high=4*np.sqrt(6./(n_hidden+n_visible)),size=(n_visible,n_hidden)),dtype=theano.config.floatX)W=theano.shared(initial_W,name='W',borrow=True)if not h_b:h_b=theano.shared(np.zeros(n_hidden,dtype=theano.config.floatX),borrow=True)if not v_b:v_b=theano.shared(np.zeros(n_visible,dtype=theano.config.floatX),borrow=True)self.W=Wself.vb=v_bself.hb=h_bself.W_prime=self.W.Tif input is None:self.x=T.dmatrix(name='input')else:self.x=inputself.params=[self.W,self.vb,self.hb]#编码阶段def get_hidden_value(self,input):return T.nnet.sigmoid(T.dot(input,self.W)+self.hb)#解码阶段def get_reconstructed_input(self,hidden):return T.nnet.sigmoid(T.dot(hidden,self.W_prime)+self.vb)#是否有损输入,如果是有损输入就是降噪自编码器了def get_corrupted_input(self,input,corruption_level):srng=RandomStreams(np.random.randint(2**30))return srng.binomial(size=input.shape,n=1,p=1-corruption_level,dtype=theano.config.floatX)*input#更新参数def get_cost_updates(self,corruption_level,learning_rate):tilde_x=self.get_corrupted_input(self.x,corruption_level)#有损数据y=self.get_hidden_value(tilde_x)#编码z=self.get_reconstructed_input(y)#解码#损失函数L=-T.sum(self.x*T.log(z)+(1-self.x)*T.log(1-z),axis=1)cost=T.mean(L)#参数梯度gparams=T.grad(cost,self.params)#更新权重偏置updates=[(param,param-learning_rate*gparam) for param,gparam in zip(self.params,gparams)]return (cost,updates)

然后重头戏来了, 根据上面的隐层、softmax层、自编码层搭建一个堆叠式的多隐层自编码网络:

主要包含两个过程: 预训练网络搭建, 整体微调代码(在预训练模型顶层加入softmax, 重点过程是如何将预训练好的模型与微调模型的参数和输出对接好, 从代码中很容易分析, 不多说

#初始化整个SdA网络
class SdA(object):def __init__(self,rng,n_ins=784,n_hiddens=[500,500],n_outs=10):self.sigmoid_layers=[] #存储每个隐层self.params=[]#存储每层参数self.dA_layers=[]self.n_hiddens=n_hiddensself.x=T.matrix('x')#存储输入self.y=T.ivector('y')#存储对应标签for i in range(len(n_hiddens)):if i==0:#当是输入层的时候input_size=n_insinput=self.xelse :#当是隐层的时候input_size=n_hiddens[i-1]input=self.sigmoid_layers[-1].output#定义当前循环时候的隐层sigmoid_layer=HiddenLayer(rng,input,input_size,n_hiddens[i],activation=T.nnet.sigmoid)#将隐层一层一层堆叠起来self.sigmoid_layers.append(sigmoid_layer)#参数也一层一层存起来self.params.extend(sigmoid_layer.params)#降噪自编码器的参数与隐单元参数共享dA_layer=dA(rng,input,input_size,n_hiddens[i],W=sigmoid_layer.W,h_b=sigmoid_layer.b)#堆叠降噪自编码器self.dA_layers.append(dA_layer)######################微调####################在最顶层加一个softmaxself.loglayer=LogisticRegression(self.sigmoid_layers[-1].output,n_hiddens[-1],n_outs)#最终参数self.params.extend(self.loglayer.params)#微调阶段的损失self.finetune_cost=self.loglayer.negative_log_likelihood(self.y)#微调阶段的误差self.finetune_err=self.loglayer.errors(self.y)#定义预训练函数def pre_train(self,train_set,batch_size,corrupt_level=0.2,learning_rate=0.1):index=T.lscalar('index')pretrain_fns=[]#存储每层的预训练函数for i,dA in enumerate(self.dA_layers):#对于每一个自编码层cost,updates=dA.get_cost_updates(corrupt_level[i],learning_rate)#编译函数fn=theano.function(inputs=[index],outputs=cost,updates=updates,givens={self.x:train_set[index*batch_size:(index+1)*batch_size]})pretrain_fns.append(fn)return pretrain_fns#定义微调部分def fine_tune(self,datasets,batch_size,learning_rate=0.1):train_set_x,train_set_y=datasets[0]#训练集valide_set_x,valide_set_y=datasets[1]#验证集test_set_x,test_set_y=datasets[2]#测试集n_train_batches=train_set_x.get_value(borrow=True).shape[0]//batch_size#训练集每批大小n_valid_batches=valide_set_x.get_value(borrow=True).shape[0]//batch_size#验证集每批大小n_test_batches=test_set_x.get_value(borrow=True).shape[0]//batch_size#测试集每批大小index=T.lscalar('index')#对所有层参数的梯度gparams=T.grad(self.finetune_cost,self.params)#更新参数updates=[(param,param-gparam*learning_rate) for param,gparam in zip(self.params,gparams)]#训练过程train_fn=theano.function(inputs=[index],outputs=self.finetune_cost,updates=updates,givens={self.x:train_set_x[batch_size*index:batch_size*(index+1)],self.y:train_set_y[batch_size*index:batch_size*(index+1)]})#验证过程valid_fn=theano.function(inputs=[index],outputs=self.finetune_err,givens={self.x:valide_set_x[batch_size*index:batch_size*(index+1)],self.y:valide_set_y[batch_size*index:batch_size*(index+1)]})#测试过程test_fn=theano.function(inputs=[index],outputs=self.finetune_err,givens={self.x:test_set_x[batch_size*index:batch_size*(index+1)],self.y:test_set_y[batch_size*index:batch_size*(index+1)]})return train_fn,valid_fn,test_fn

按照流程, 我们就可以定义整个网络的训练了,包含数据集的分批, 按照上面定义的网络结构, 初始化一个网络实例, 随后调用上面写出来的训练和验证函数去训练整个模型, 采用提前停止算法, 前面说过这个算法, 不赘述

#训练及测试
def test_SdA(pretrain_epoch=1,pretrain_lr=0.001,train_epoch=1,finetune_lr=0.1,dataset='mnist.pkl.gz',batchsize=100):#读取数据集datasets=load_data(dataset=dataset)train_set_x, train_set_y = datasets[0]valid_set_x, valid_set_y = datasets[1]test_set_x, test_set_y = datasets[2]#总共多少小批次需要训练n_train_batches=train_set_x.get_value(borrow=True).shape[0]//batchsizen_test_batches=test_set_x.get_value(borrow=True).shape[0]//batchsizen_valid_batches=valid_set_x.get_value(borrow=True).shape[0]//batchsize#初始化SdA网络rng=np.random.RandomState(1234)sda=SdA(rng,n_ins=28*28,n_hiddens=[1000,1000,1000],n_outs=10)#输入层和第一二隐层的加噪程度corruption_levels=[0.1,0.2,0.3]############预训练#############print('############预训练#############')pretrain_fns=sda.pre_train(train_set_x,batchsize,corrupt_level=corruption_levels,learning_rate=0.1)#对每一层每一小批都执行训练for i in range(len(sda.n_hiddens)):#对第i层的所有小批执行epoch次训练for epoch in range(pretrain_epoch):c=[]#记录总误差#对每一小批都训练for batch_index in range(n_train_batches):c.append(pretrain_fns[i](index=batch_index))print('第%d层的第%d次预训练损失为%f' %(i,epoch,np.mean(c,dtype='float64')))#############微调###############print('#############微调##############')train_fn,valid_fn,test_fn=sda.fine_tune(datasets,batchsize,learning_rate=finetune_lr)#提前停止方法patiences=10000patience_inc=2improvement_threshold=0.995validation_frequency=min(n_train_batches,patiences)best_validation_loss=np.inftest_score=0done_loop=Falsewhile (epoch<train_epoch) and (not done_loop):epoch=epoch+1print epochfor minibatch_index in range(n_train_batches):#对于每一批都训练minibatch_cost=train_fn(minibatch_index)iter=(epoch-1)*n_train_batches+minibatch_index #累计训练了多少批,用于决定是否验证准确率if(iter+1)%validation_frequency==0:validation_loss=np.mean([valid_fn(j) for j in range(n_valid_batches)],dtype='float64')print('训练第%d次,对于第%d个小批训练的参数得到误差为%f' %(epoch,minibatch_index,validation_loss))if validation_loss<best_validation_loss:if validation_loss<best_validation_loss*improvement_threshold:patiences=patiences*patience_incbest_validation_loss=validation_lossbest_iter=iter#验证集上的误差为test_score=np.mean([test_fn(k) for k in range(n_test_batches)],dtype='float64')if patiences<=iter:done_loop=Truebreaksave_file=open('best_model_SdA.pkl','wb')model=[sda.params]for i,par in enumerate(model):l=[]for t in range(len(par)):l.append(par[t].get_value())cPickle.dump( l,save_file)print ('最好模型参数的验证集误差为%f,测试集误差%f' %(best_validation_loss,test_score))

最后训练

test_SdA()

很神奇的是我只对每一层预训练一次, 最后整体微调也只训练一次就达到了非常非常非常非常好的效果, 可能内部原因是采用了小批训练, 结果每一批数据对网络的参数改变都足够使它逼近最优处, 所以无需训练太多, 训练结果如下

############预训练#############0层的第0次预训练损失为75.6216351层的第0次预训练损失为461.6377592层的第0次预训练损失为170.258758
#############微调##############
1
训练第1次,对于第499个小批训练的参数得到误差为0.080000
最好模型参数的验证集误差为0.080000,测试集误差0.083700

单张图片分类

这里有个坑是我原本想使用MLP里面的方法直接调用logistics模型中的pred方法, 结果死活载入不进去图片, 主要思想如下:

#测试过程
sda=cPickle.load(open('best_model_SdA.pkl'))#读取模型
#初始化一个用于测试的网络
sda_test=SdA(rng=np.random.RandomState(1234),n_ins=28*28,n_hiddens=[1000,1000,1000],n_outs=10)
#初始化所有权重和偏置
sda_test.sigmoid_layers[0].W.set_value(sda[0])
sda_test.sigmoid_layers[0].b.set_value(sda[1])
sda_test.sigmoid_layers[1].W.set_value(sda[2])
sda_test.sigmoid_layers[1].b.set_value(sda[3])
sda_test.sigmoid_layers[2].W.set_value(sda[4])
sda_test.sigmoid_layers[2].b.set_value(sda[5])
sda_test.loglayer.W.set_value(sda[6])
sda_test.loglayer.b.set_value(sda[7])
#取一张图片预测
from PIL import Image
import pylabdataset='mnist.pkl.gz'
datasets=load_data(dataset)
test_set_x,test_set_y=datasets[2]
test_set_x=test_set_x.get_value()
test_data=test_set_x[12:13]predict_model=theano.function(inputs=[x],outputs=classifier_test.logRegressitionLayer.y_pred)
predicted_value=predict_model(test_data)
print predicted_value

结果这个代码导数第三行一直提示这个x与需要的输入不匹配, 逼得我直接使用了最笨的方法, 手动执行前向计算, 需要注意的是我们一定要对自己的前向过程很熟悉, 包括权重每个维度的意义, 偏置和激活函数的使用等等

然后我就写出了如下代码:

#测试过程
sda=cPickle.load(open('best_model_SdA.pkl'))#读取模型
#取一张图片预测
from PIL import Image
import pylabdataset='mnist.pkl.gz'
datasets=load_data(dataset)
test_set_x,test_set_y=datasets[2]
test_set_x=test_set_x.get_value()
test_data=test_set_x[12:13]
img=test_data.reshape(28,28)
pylab.imshow(img)
pylab.show()#预测
for i in range(len(sda)/2-1):if i==0:outputs=T.nnet.sigmoid(T.dot(test_data,sda[i])+sda[i+1])else:outputs=T.nnet.sigmoid(T.dot(outputs,sda[i*2])+sda[i*2+1])
#softma层
outputs=T.nnet.softmax(T.dot(outputs,sda[6])+sda[7])
#结果
a=outputs.eval()
print np.argmax(a)

部分结果输出如下:

这里写图片描述
这里写图片描述

博客源码:链接: https://pan.baidu.com/s/1mh5AwXi 密码: gqa4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【theano-windows】学习笔记十五——受限玻尔兹曼机

前言 终于到了最喜欢的模型: 受限玻尔兹曼机(RBM)了, 发现关于RBM是如何从能量模型发展过来的介绍非常不错, 而关于详细理论证明, 可以去看我前面的受限玻尔兹曼机的一系列博客. 国际惯例, 参考博客,超级强推第二个博客, 证明过程很给力: Restricted Boltzmann Machines (R…

【Ogre-windows】环境配置

前言 由于工程原因, 学习一下Ogre面向对象图形渲染开源引擎, 慢慢爬坑吧。首先还是环境的配置问题哎. 其实最重要的是要预先编译三方库, 虽然官方说可以自动编译, 但是在自己电脑上还是出现了无法解析外部符号之类的问题, 正常情况下我就认为是三方库的lib出现了问题, 最后额外…

【theano-windows】学习笔记十六——深度信念网络DBN

前言 前面学习了受限玻尔兹曼机(RBM)的理论和搭建方法, 如果稍微了解过的人, 肯定知道利用RBM可以堆叠构成深度信念网络(deep belief network, DBN)和深度玻尔兹曼机(deep Boltzmann machine), 这里就先学习一下DBN. 国际惯例, 参考博文: Deep Belief Networks A fast lear…

【Ogre-windows】实例配置

前言 折腾了好久才搞定教程实例, 主要是因为上一篇博客安装的具体版本是Ogre1.10.9, 而官方的Ogre Wiki Tutorial Framework没有指定具体版本, 如果单纯下载Ogre Wiki Tutorial Framework 1.10 - (Windows line endings, updated 2015-10-15) 运行, 基本会血崩. 所以, 在经过仔…

【Ogre-windows】旋转矩阵及位置解析

前言 这篇博客主要针对三种问题 如何创建动画帧如何获取全局位置如何计算全局旋转矩阵 仿真环境为VS2013Ogre1.10.9与matlab验证 创建动画帧 这里只做一个简单的实验: 将自带的人物模型Jaiqua的run运动给新创建的运动myrun中并播放&#xff0c;直接贴代码了 void JaiQua:…

BP推导——续

前言 之前有证明过一次人工神经网络——【BP】反向传播算法证明 &#xff0c;但是回头看的时候&#xff0c;有很多地方非常不严谨&#xff0c;特此拿出来再单独证明一次BP&#xff0c;并严格保证其严谨性。如果想看看粗略的证明&#xff0c;可以去看我之前的博客&#xff0c;毕…

matlab学习——强连通分量

前言 最近motion graph相关实验&#xff0c;发现实现运动过渡需要构建运动图&#xff0c;而为了避免运动过渡陷入死胡同&#xff0c;需要对图结构进行裁剪&#xff0c;方法就是计算图模型的极大强联通分量&#xff0c;但是自己懒得去实现&#xff0c;所以就去搜了一下matlab中…

【音频处理】离散傅里叶变换

前言 最近复现音乐驱动舞蹈的文章《Dancing-to-Music Character Animation》&#xff0c;用到了与傅里叶变换很相似的称为常Q变换的方法去分割音乐&#xff0c;所以对傅里叶变换做了一个小了解&#xff0c;本文不深入各种乱糟糟的理论&#xff0c;比如什么蝶形算法啥的&#x…

【音频处理】短时傅里叶变换

前言 上一篇博客讲了离散傅里叶变换&#xff0c;里面的实例是对整个信号进行计算&#xff0c;虽然理论上有N点傅里叶变换(本博客就不区分FFT和DFT了&#xff0c;因为它俩就是一个东东&#xff0c;只不过复杂度不同)&#xff0c;但是我个人理解是这个N点是信号前面连续的N个数值…

【theano-windows】学习笔记十九——循环神经网络

前言 前面已经介绍了RBM和CNN了&#xff0c;就剩最后一个RNN了&#xff0c;抽了一天时间简单看了一下原理&#xff0c;但是没细推RNN的参数更新算法BPTT&#xff0c;全名是Backpropagation Through Time。 【注】严谨来说RNN有两个称呼&#xff1a;①结构上递归的recursive n…

【theano-windows】学习笔记二十——LSTM理论及实现

前言 上一篇学习了RNN&#xff0c;也知道了在沿着时间线对上下文权重求梯度的时候&#xff0c;可能会导致梯度消失或者梯度爆炸&#xff0c;然后我们就得学习一波比较常见的优化方法之LSTM 国际惯例&#xff0c;参考网址&#xff1a; LSTM Networks for Sentiment Analysis …

刚体运动学——欧拉角、四元数、旋转矩阵

前言 刚体运动旋转一般用&#xff1a;欧拉角、四元数、轴角对等表示&#xff0c;在对某个坐标旋转的时候&#xff0c;只需将欧拉角或四元数转换为旋转矩阵&#xff0c;并与原始坐标相乘&#xff0c;便可得到旋转以后的坐标。这里主要看看欧拉角、四元数和旋转矩阵。 国际惯例…

刚体运动学-四元数插值

前言 之前对写了一篇关于刚体运动学相关知识博客&#xff1a;刚体运动学——欧拉角、四元数、旋转矩阵&#xff0c;本篇博客就举例来说明&#xff0c;如何在运动捕捉数据中进行四元数插值。 国际惯例&#xff0c;参考博客&#xff1a; 探讨&#xff1a;向量&#xff08;方向…

【TensorFlow-windows】学习笔记一——基础理解

前言 因为Theano已经停止更新了&#xff0c;所以在前面学完Theano搭建RBM,CNN,RNN相关结构以后&#xff0c;还是得选择一个主流框架的&#xff0c;由于我自身的学习最终是向强化学习靠近&#xff0c;可能用到的仿真环境是openai gym&#xff0c;所以选择了继续学习TensorFlow&…

【TensorFlow-windows】学习笔记二——低级API

前言 上一篇博客初步了解了tensorflow中建立机器学习模型的方法&#xff1a;可以使用eager execution和graph execution两种模式&#xff0c;可以使用高级API estimator中已经封装好的模型&#xff0c;也可以自己创建estimator&#xff0c;更重要的是我们也可以使用低级API自行…

【TensorFlow-windows】学习笔记五——自编码器

前言 上一篇博客介绍的是构建简单的CNN去识别手写数字&#xff0c;这一篇博客折腾一下自编码&#xff0c;理论很简单&#xff0c;就是实现对输入数据的重构&#xff0c;具体理论可以看我前面的【theano-windows】学习笔记十三——去噪自编码器 国际惯例&#xff0c;参考博客&…

【TensorFlow-windows】学习笔记六——变分自编码器

#前言 对理论没兴趣的直接看代码吧&#xff0c;理论一堆&#xff0c;而且还有点复杂&#xff0c;我自己的描述也不一定准确&#xff0c;但是代码就两三句话搞定了。 国际惯例&#xff0c;参考博文 论文&#xff1a;Tutorial on Variational Autoencoders 【干货】一文读懂…

【TensorFlow-windows】学习笔记七——生成对抗网络

前言 既然学习了变分自编码(VAE)&#xff0c;那也必须来一波生成对抗网络(GAN)。 国际惯例&#xff0c;参考网址&#xff1a; 论文: Generative Adversarial Nets PPT:Generative Adversarial Networks (GANs) Generative Adversarial Nets in TensorFlow GAN原理学习笔记…

Openpose——windows编译(炒鸡简单)

前言 最近准备看看rtpose的代码&#xff0c;发现已经由openpose这个项目维护着了&#xff0c;由于经常在windows下调试代码&#xff0c;所以尝试了一下如何在windows下编译openpose源码&#xff0c;整体来说非常简单的。 国际惯例&#xff0c;参考博客&#xff1a; [OpenPos…

强化学习——Qlearning

前言 在控制决策领域里面强化学习还是占很重比例的&#xff0c;最近出了几篇角色控制的论文需要研究&#xff0c;其中部分涉及到强化学习&#xff0c;都有开源&#xff0c;有兴趣可以点开看看&#xff1a; A Deep Learning Framework For Character Motion Synthesis and Edit…