基于CNNs的图片情感识别(Keras VS Pytorch)

之前做深度学习,用的框架一直都是Keras,从科研角度来说,可以基本满足我的需要。Keras的优势在于可以非常快速的实现一个相对简单的深度学习模型,例如深度神经网络、长短期记忆网络、双向长短期记忆网络等。同时Kera对于刚刚接触深度学习的新手是非常友好的,各个模块都进行了相对应的封装,从模型构建,模型编译到模型训练。我们所做的只需要脑海中有一个模型网络图,然后根据这个图对模型进行搭建,并且将...
摘要由CSDN通过智能技术生成

   之前做深度学习,用的框架一直都是Keras,从科研角度来说,可以基本满足我的需要。Keras的优势在于可以非常快速的实现一个相对简单的深度学习模型,例如深度神经网络、长短期记忆网络、双向长短期记忆网络等。同时Kera对于刚刚接触深度学习的新手是非常友好的,各个模块都进行了相对应的封装,从模型构建,模型编译到模型训练。我们所做的只需要脑海中有一个模型网络图,然后根据这个图对模型进行搭建,并且将输入调整为模型所接受的输入,设置相应的参数,之后点击run,就ok了。

  物极必反,Keras对于模块的过度封装带来的缺点也是显而易见的,即对一些非必要封装的层的可操作性不大。随着研究的深入,总觉得用着Keras会有些局限,于是笔者便寻求一个新的深度学习框架满足研究和学习需求。目前常用的深度学习框架有这主要三种:Keras、Tensorflow以及Pytorch。Tensorflow是由Google开源的深度学习框架,目前已经到2.0版本,但是根据其他组对tensorflow的使用经验和经历来看,tensorflow的使用难度以及因版本迭代而带来的代码不可重复使用情况让我对其有些抗拒。Pytorch是由Facebook开源的一款深度学习框架,前一阵子刚发布了1.0版本,目前已经到了1.0.1版本。Pytorch的优势在于能够非常好的支持GPU,简洁,操作性大,对新手友好。同时Pytorch在用户中的口碑也非常的好,因此,根据我的需求,我将Pytorch作为我学习的第二个深度学习框架。

  用Pytorch的第一步便是安装Pytorch,网上的教程有很多,但是!真正能解决问题的很少!在安装Pytorch方面,笔者强烈建议从官网下载.whl文件,然后进行安装,如果使用命令行pip install pytorch,会出现报错(具体错误内容忘记了)。

  言归正传,这次的任务是对图片情感进行分类,图片数量为2001,情感类别分为正面、负面和中性,正面、负面和中性的数量分别为712、768和512。笔者利用CV2读取图片,并利用resize方法将图片大小调整为(224,224,3),进行归一化,保存至pickle文件。对于标签,笔者用0表示正面,1表示中性,2表示负面,并调整为[0, 1, 0](表示中性),保存至pickle文件。至此,对图片和标签已经完成。下面笔者利用不同的深度学习框架构建CNNs模型并进行相应的比较。

1. 构建CNNs模型

import torch
import torch.utils.data as U
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

#网络构建;
class ConvNet(nn.Module):
    def __init__(self):
        super().__init__()
   
        #conv2d所接受的参数;
        #nn.conv2d(in_channels, out_channels, kernel_size,
        #          stride= 1, padding= 0, dilation= 1, groups= 1, bias= True)
        #224*224*3
        self.conv1=nn.Conv2d(3, out_channels= 10, kernel_size= 5)
        #110*110*10
        self.conv2=nn.Conv2d(10,20,5) # 128, 10x10
        #106*106*20
        self.fc1 = nn.Linear(106*106*20,1024) 
        self.fc2 = nn.Linear(1024,3)
  
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将PyTorch提取的CNN图像特征显示在原图中,需要进行以下步骤: 1.加载预训练的CNN模型,例如ResNet、VGG等。 2.加载要显示的原始图像,并将其转换为模型所需的格式,例如将RGB图像转换为BGR图像,然后进行标准化。 3.将图像输入到CNN模型中,并提取所需的特征图。这些特征图通常位于CNN模型的中间层。 4.将特征图与原始图像叠加在一起,可以采用不同的方式进行叠加,例如使用alpha混合或直接叠加。 5.将叠加后的图像保存或显示。 以下是一个简单的示例代码,演示如何提取ResNet50模型的中间层特征图,并将其与原始图像叠加在一起: ```python import torch import torch.nn as nn import cv2 import numpy as np # Load pre-trained ResNet50 model model = torch.hub.load('pytorch/vision:v0.6.0', 'resnet50', pretrained=True) model.eval() # Load image img = cv2.imread('image.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (224, 224)) img = img.astype(np.float32) / 255.0 img = (img - np.array([0.485, 0.456, 0.406])) / np.array([0.229, 0.224, 0.225]) img = np.transpose(img, (2, 0, 1)) img = np.expand_dims(img, axis=0) # Extract feature map from ResNet50 with torch.no_grad(): features = model.conv1(img) features = model.bn1(features) features = model.relu(features) features = model.maxpool(features) features = model.layer1(features) features = model.layer2(features) features = model.layer3(features) features = model.layer4(features) # Convert feature map to image features = features.squeeze().detach().numpy() features = cv2.resize(features, (224, 224)) features = np.clip(features, 0, 1) features = cv2.applyColorMap(np.uint8(255 * features), cv2.COLORMAP_JET) # Overlay feature map on original image alpha = 0.5 overlay = cv2.addWeighted(img.squeeze().transpose((1, 2, 0)), alpha, features, 1 - alpha, 0) # Display result cv2.imshow('Result', overlay) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们加载了PyTorch中的ResNet50模型,并从图像中提取了层4的特征图。然后,我们将特征图转换为图像,并使用alpha混合将其与原始图像叠加在一起。最后,我们显示了叠加后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值