比较rnn和cnn和autoencoder的区别
关于学习方式的区别
-
首先rnn和cnn是基于监督学习,在训练的时候需要使用到train_data.train_labels,它是通过每次得出的结果和现有的样本标签做对比以减小误差,从而提高神经网络的性能。
-
rnn在训练过程中减小误差的方法
for step, (batch_x, batch_y) in enumerate(train_loader): batch_x = batch_x.view(-1, 28, 28) output = rnn(batch_x) loss = loss_func(output, batch_y) #和样本标签做对比 optimizer.zero_grad() loss.backward() optimizer.step()
-
cnn在训练过程中减小误差的方法
for step,(batch_x,batch_y) in enumerate(trainLoader): batch_x = Variable(batch_x) batch_y = Variable(batch_y) pred = cnn(batch_x) loss = loss_func(pred,batch_y) #和样本标签做对比 optimizer.zero_grad() loss.backward() optimizer.step()
-
-
而autoencoder是通过自己和自己做对比,学习到它的最关键的信息。
-
autoencoder在训练过程中减小误差的方法
for step, (batch_x, y) in enumerate(train_loader): batch_x = batch_x.view(-1,28*28) batch_y = batch_x.view(-1,28*28) encode,decode = autoencoder(batch_x) loss = loss_func(decode, batch_y) #和自身做对比 optimizer.zero_grad() loss.backward() optimizer.step()
-
关于维度的区别
-
cnn的输入维度有【batch_size,channels,height pixel,width pixel】
self.conv1 = torch.nn.Sequential( torch.nn.Conv2d( in_channels=1, out_channels=16, kernel_size=5, stride=1, padding=2 ), torch.nn.ReLU(), torch.nn.MaxPool2d( kernel_size=2, ) )
从它的卷积层可以看出它需要输入in_channels,所以在未经过卷积层之前它的维度是[1,28,28]
-
rnn的输入维度有【batch_size,height pixel,width pixel】
self.rnn = torch.nn.LSTM( input_size=INPUT_SIZE, hidden_size=64, num_layers=1, batch_first=True )
它只需要输入宽高像素就行,因为它是逐行扫描,每次的输出都要根据上一次的结果值来做出判断
-
autoencoder的输入维度有【batch_size,height pixel,width pixel】
self.encoder = torch.nn.Sequential( torch.nn.Linear(28*28,128), torch.nn.Tanh(), torch.nn.Linear(128,64), torch.nn.Tanh(), torch.nn.Linear(64,12), torch.nn.Tanh(), torch.nn.Linear(12,3) )
它也是只需要输入宽高像素就行,然后逐步进行压缩,最后在进行解压
三者各自的优点
- cnn
- cnn对图片的一小块像素进行处理,增强了图片的连续性,加深了神经网络对于图片的理解。常用于对图像特征提取,图像识别
- rnn
- 用于处理时间序列数据,比如文本处理,因为它们之间存在一定的前后关系,或者预测股票的趋势,可能今天的股票价格和昨天、上个月的行情都有关系等等,由于rnn在某种程度上存在一定的弊端,如,时间间隔太长,它可能会出现梯度爆炸或梯度消失等情况,所以又出现了基于它之上的LSTM(Long short-term memory)
- autoencoder
- 通过压缩图片获取核心特征,再用一个小的神经网络就可以得到很好的训练结果