比较rnn和cnn和autoencoder的区别

比较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
    • 通过压缩图片获取核心特征,再用一个小的神经网络就可以得到很好的训练结果

你可能感兴趣的:(NLP模型学习,rnn,cnn,pytorch)