Caffe从入门到精通09

【用训练好的模型,测试自己的一张图片并实现参数可视化——以MNIST数据集为例】

1.数据准备

1.1获取mnist数据集中的某一张图片(自己照的图片也可),将其转换为单通道格式,图片大小28*28,这里已经给大家准备了制作好的10张图片。点击链接,下载图片集

如下图所示:


tips:通过“位深度”的值可以判断是否为单通道,单通道的位深度为“8”,三通道的位深度为“24”。(R,G,B)

1.2 新建标签文档label.txt,内容为:标签值与标签名称的对应(中间用一个空格隔开),如下图所示:


1.3 将准备好的图片9.jpg和新建的label.txt放到caffe-master/data/mnist/的目录下,如下图所示:


1.4 在caffe-master/examples/mnist/文件目录下新建deploy.prototxt文件,其内容如下所示:

name: "LeNet"
layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "ip1"
  type: "InnerProduct"
  bottom: "pool2"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 500
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 10
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "prob"
  type: "Softmax"
  bottom: "ip2"
  top: "prob"
}

1.5 在python开发环境下,进行基本设置

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import os
import caffe
import numpy as np


#设置显示面板的显示样式
plt.rcParams['figure.figsize'] = (8, 8) #宽幅图像
plt.rcParams['image.interpolation'] = 'nearest' #最邻近内插算法
plt.rcParams['image.cmap'] = 'gray' #显示为灰度图像,否则将以“热力图”的彩图显示

2.Caffe模型配置

#定义caffe的根目录
caffe_root='E:/DL/caffe-master/'
#加载caffe的根目录
os.chdir(caffe_root)
#设置caffe为cpu配置
caffe.set_mode_cpu()
#网络模型架构文件
model_def='examples/mnist/deploy.prototxt'
#网络模型参数文件
model_weights='examples/mnist/lenet_iter_1000.caffemodel'
#根据两个配置文件加载网络,并使用“测试”模式
net=caffe.Net(model_def,model_weights,caffe.TEST)
其中lenet._iter_1000.caffemodel就是之前已经训练好并保存下来的网络模型


3.图片维度配置

#数据初始化

#新建caffe数据转换器
trainsformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape})

#python读取图片格式为H*W*K, 需转化为K*H*W
trainsformer.set_transpose('data',(2,0,1))
#加载图片,自动转换为3通道的灰度图,这三个通道完全一样
image=caffe.io.load_image('data/mnist/9.jpg')
#将图片放入数据转换器,变换维度
transformed_image=trainsformer.preprocess('data',image)
#将(3,28,28)转换成(1,1,28,28),若n>1,则网络会自动增广到设置的数量n
net.blobs['data'].data[...]=transformed_image.reshape(1,3,28,28)[:,0].reshape(1,1,28,28)
#驱动图片在网络中前向传播
output=net.forward()
注意:caffe.io.load_image()函数会自动将任何输入的图片转换为3通道的图片(28,28,3),只不过对于单通道的图片而言,这三个通道的图片是完全一样的。首先通过transformer数据转换器转换为(3,28,28),再用reshape函数最终转换为与deploy.prototxt的输入格式一致的(1,1,28,28)

4.输出预测值与网络内的张量形态

#此时网络中只有一张图片,获得该图片的概率值
output_prob=output['prob'][0]
#将最大的概率值输出到控制台
print output_prob.argmax()

#加载标签文件目录
label_file=caffe_root+'data/mnist/label.txt'
#加载标签
labels=np.loadtxt(label_file,str,delimiter=' ')
#获取标签值实际对应的标签名称
print 'output label:',labels[output_prob.argmax()][1]

#输出测试图片经过各层时的张量形态
for layer_name,blob in net.blobs.iteritems():
    print layer_name+' '+str(blob.data.shape)
#输出各层参数的张量形态
for layer_name,param in net.params.iteritems():
    print layer_name+'\t'+str(param[0].data.shape)+str(param[1].data.shape)
其结果如下图所示:



5.网络中的测试图片可视化

#定义python中的可视化面板
def vis_square(data):
    #获得shape为(n,height,width)或(n,height,width,3)的序列,并将每一个图片均匀地显示在网格界面中

    #正则化数据
    data=(data-data.min())/(data.max()-data.min())
    #根据图片的数量绘制正方形的布局网格
    n=int(np.ceil(np.sqrt(data.shape[0])))
    #为每一个小的显示窗口绘制边框
    padding=(((0,n**2-data.shape[0]),(0,1),(0,1))+((0,0),)*(data.ndim-3))
    #边框的颜色为白色
    data=np.pad(data,padding,mode='constant',constant_values=1)
    #将图片用小的窗口显示
    data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
    data= data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])
    #绘图
    plt.imshow(data)
    plt.axis('off')
    plt.show()

#参数可视化
#由于通道数是1,所以只能用(n,height,width)这样的参数形式,只有3通道才可以用(n,height,width,3)的参数形式
#data的shape是(n,c,h,w),通过[:,0]取所有行(第一维度下)的第0个(第二个维度下的,即第0个通道)的数据,
#之后shape变为(n,h,w)
#获取第一层卷积核的数据
filters=net.params['conv1'][0].data[:,0]

#这里的data[n],中的n表示batch中的某一幅图
feat=net.blobs['con1'].data[0]
#可视化卷积核参数
vis_square(filters)
显示结果如下图所示:



将vis_square中的参数filters改为feat后,即可显示测试图片在经过第一个卷积层之后的效果:


不难想出,将“conv1”改为“conv2“、“pool1”后,将会获得对应的层的数据值,这里不再赘述。

注意:[:,0]的方法,是python对张量处理比较常用的降维处理技巧,应该熟练掌握!

   reshape、transpose同样也是python中对张量处理常用的变维技巧,应熟练掌握!

6.Softmax概率输出图表可视化

feat=net.blobs['prob'].data[0]
plt.figure(figsize=(10,5))
plt.plot(feat.flat)
plt.show()
其结果如下图所示:



可以直观地看出,根据我们输入的这张测试图片(如下图所示),模型网络作出了较为准确的识别,识别为“9”的概率最大,而且也存在着识别成“4”的偏向,符合我们人眼的直观视觉!


实战经验总结:

1.要学会对张量维度的处理技巧,这在深度学习网络模型中至关重要!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当出现"caffe 找不到指定模块"的错误时,一般有几种可能原因。首先,可能是该模块没有正确安装或者安装出现了问题。其次,可能是模块的版本过旧,需要更新到新的版本。最后,还有可能是环境中缺少了相关的依赖。 解决这个问题的方法有几种。首先,我们可以尝试重新安装caffe,并确保安装过程中没有出现错误。可以尝试使用官方指南给出的安装命令进行安装,但需要注意,有时候这条命令可能会出现导入caffe失败的问题,这可能与环境中缺少cuda的相关依赖有关。如果遇到这个问题,建议采用第二种方法,通过conda命令进行安装,例如使用"conda install -c willyd caffe-cpu"命令进行安装。 另外,还有一种可能的错误信息是"找不到指定的模块",特别是当涉及到dll文件时。这可能是因为环境中缺少了依赖项。解决这个问题的方法是安装缺失的依赖项。可以通过查看错误信息中提到的缺失的dll文件的路径,然后找到并安装相应的依赖项。 总结来说,当出现"caffe 找不到指定模块"的错误时,我们可以尝试重新安装caffe,更新到新的版本,或者安装缺失的依赖项。这样可以解决该错误并使得caffe正常运行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [caffe报错(8)ImportError: DLL load failed: 找不到指定的模块。](https://blog.csdn.net/weixin_42535423/article/details/103908335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [win10+anaconda3+python3.7+caffe安装及导入caffe失败:ImportError: DLL load failed: 找不到指定的模块。...](https://blog.csdn.net/qq_36235935/article/details/108375870)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [[WinError 126] 找不到指定的模块,detectron_ops_gpu.dl](https://download.csdn.net/download/m0_37556124/86725890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值