我是分2类 我的训练和测试集在http://blog.csdn.net/wd1603926823/article/details/51732849已经转化为leveldb格式
首先,我的Imagenet_solver.prototxt文件:
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "E:/Keras_Code/examples/imagenet/meanforme.binaryproto"
}
data_param {
source: "E:/Keras_Code/examples/imagenet/train_leveldb"
batch_size: 8
backend: LEVELDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
mean_file: "E:/Keras_Code/examples/imagenet/meanforme_test.binaryproto"
}
data_param {
source: "E:/Keras_Code/examples/imagenet/test_leveldb"
batch_size: 1
backend: LEVELDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "norm1"
type: "LRN"
bottom: "pool1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "norm1"
top: "conv2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 2
kernel_size: 5
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "norm2"
type: "LRN"
bottom: "pool2"
top: "norm2"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv3"
type: "Convolution"
bottom: "norm2"
top: "conv3"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "conv4"
type: "Convolution"
bottom: "conv3"
top: "conv4"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu4"
type: "ReLU"
bottom: "conv4"
top: "conv4"
}
layer {
name: "conv5"
type: "Convolution"
bottom: "conv4"
top: "conv5"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 1
kernel_size: 3
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu5"
type: "ReLU"
bottom: "conv5"
top: "conv5"
}
layer {
name: "pool5"
type: "Pooling"
bottom: "conv5"
top: "pool5"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "fc6"
type: "InnerProduct"
bottom: "pool5"
top: "fc6"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu6"
type: "ReLU"
bottom: "fc6"
top: "fc6"
}
layer {
name: "drop6"
type: "Dropout"
bottom: "fc6"
top: "fc6"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc7"
type: "InnerProduct"
bottom: "fc6"
top: "fc7"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu7"
type: "ReLU"
bottom: "fc7"
top: "fc7"
}
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7"
top: "fc7"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "fc8"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc8"
bottom: "label"
top: "loss"
}
下面是Imagenet_solver.prototxt文件:
net: "E:/Keras_Code/examples/imagenet/Imagenet_train_test.prototxt"
test_iter: 24
test_interval: 200
base_lr: 0.001
momentum: 0.9
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.001
power: 0.75
display:20
max_iter: 2000
snapshot: 400
snapshot_prefix: "E:/Keras_Code/examples/imagenet/mine"
solver_mode: GPU
然后我的label都是从0开始的 如:
然后在python接口下:accuracy_loss_img.py 训练并画出accuracy
from pylab import *
import matplotlib.pyplot as plt
import caffe
caffe.set_device(0)
caffe.set_mode_gpu()
solver = caffe.SGDSolver('E:\Keras_Code\examples\imagenet\Imagenet_solver.prototxt')
niter = 2000
display_iter = 400
test_iter = 24
test_interval = 200
# train loss
train_loss = zeros(ceil(niter * 1.0 / display_iter))
# test loss
test_loss = zeros(ceil(niter * 1.0 / test_interval))
# test accuracy
test_acc = zeros(ceil(niter * 1.0 / test_interval))
# iteration 0
solver.step(1)
_train_loss = 0; _test_loss = 0; _accuracy = 0
for it in range(niter):
solver.step(1)
_train_loss += solver.net.blobs['loss'].data
if it % display_iter == 0:
train_loss[it // display_iter] = _train_loss / display_iter
_train_loss = 0
if it % test_interval == 0:
for test_it in range(test_iter):
solver.test_nets[0].forward()
_test_loss += solver.test_nets[0].blobs['loss'].data
#_accuracy += solver.test_nets[0].blobs['accuracy'].data
test_loss[it / test_interval] = _test_loss / test_iter
test_acc[it / test_interval] = _accuracy / test_iter
_test_loss = 0
_accuracy = 0
print '\nplot the train loss and test accuracy\n'
_, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(display_iter * arange(len(train_loss)), train_loss, 'g')
ax1.plot(test_interval * arange(len(test_loss)), test_loss, 'y')
ax2.plot(test_interval * arange(len(test_acc)), test_acc, 'r')
ax1.set_xlabel('iteration')
ax1.set_ylabel('loss')
ax2.set_ylabel('accuracy')
plt.show()
可是红线一直是0 即使我把
_accuracy += solver.test_nets[0].blobs['accuracy'].data
即使把这句不注释掉 运行出来也是一直为0的红线 好奇怪的。。。???为什么 这是第一个问题?!
然后就是对新图片进行预测分类:
那么首先要有自己的deploy.prototxt文件:我的是mydeploy.prototxt:我不知道我这个deploy根据我的Imagenet_train_test.prototxt改写的对不对在dim:10这里:
name: "CaffeNet"
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } } #话说这第一个dim为什么是10啊 10代表的是什么??第二个问题
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "norm1"
type: "LRN"
bottom: "pool1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "norm1"
top: "conv2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 2
kernel_size: 5
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "norm2"
type: "LRN"
bottom: "pool2"
top: "norm2"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv3"
type: "Convolution"
bottom: "norm2"
top: "conv3"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "conv4"
type: "Convolution"
bottom: "conv3"
top: "conv4"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu4"
type: "ReLU"
bottom: "conv4"
top: "conv4"
}
layer {
name: "conv5"
type: "Convolution"
bottom: "conv4"
top: "conv5"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 1
kernel_size: 3
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu5"
type: "ReLU"
bottom: "conv5"
top: "conv5"
}
layer {
name: "pool5"
type: "Pooling"
bottom: "conv5"
top: "pool5"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "fc6"
type: "InnerProduct"
bottom: "pool5"
top: "fc6"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu6"
type: "ReLU"
bottom: "fc6"
top: "fc6"
}
layer {
name: "drop6"
type: "Dropout"
bottom: "fc6"
top: "fc6"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc7"
type: "InnerProduct"
bottom: "fc6"
top: "fc7"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu7"
type: "ReLU"
bottom: "fc7"
top: "fc7"
}
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7"
top: "fc7"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "prob"
type: "Softmax"
bottom: "fc8"
top: "prob"
}
然后就是预测分类 先说下我的类别名txt:
然后就是预测分类的脚本:
#coding=utf-8
#http://www.cnblogs.com/denny402/p/5685909.html
#http://www.cnblogs.com/NanShan2016/p/5532589.html
import caffe
import numpy as np
deploy='E:/Keras_Code/examples/imagenet/mydeploy.prototxt'
caffe_model='E:/Keras_Code/examples/imagenet/mine_iter_800.caffemodel'
img='E:/Keras_Code/examples/imagenet/test13.bmp'
labels_filename = 'E:/Keras_Code/examples/imagenet/mylabel.txt'
mean_file='E:/pyCaffe_GPU/python/caffe/imagenet/ilsvrc_2012_mean.npy'
net = caffe.Net(deploy,caffe_model,caffe.TEST)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0))
im=caffe.io.load_image(img)
net.blobs['data'].data[...] = transformer.preprocess('data',im)
out = net.forward()
labels = np.loadtxt(labels_filename, str, delimiter='\t')
#print net.blobs
prob= net.blobs['prob'].data[0].flatten()
print 'frequency belong to 2 classes:', prob
order=prob.argsort()[0]
print order
#print labels
#print 'the class is:',labels[order]
###########################################################
#http://www.cnblogs.com/denny402/category/759199.html
#http://www.bubuko.com/infodetail-1019584.html
#http://www.docin.com/p-871820922.html
#http://blog.csdn.net/hjimce/article/details/48972877
可是结果:
输出的类别标号应该是0啊 怎么是1呢??这是第3个问题 因为它明明概率是:97% 3% 那么应该属于前一类啊 标号应该为0啊 怎么是1???
的确 如@风翼冰舟 所说 标号对应的是【1 0】:
这样貌似就得到了我想要的分类结果。
但我还是疑惑 allorder中为什么存储的是[1 0]而不是[0 1]呢????
哦 我懂了 刚刚我也去查了argsort这个函数:如果x表示属于每个类别的概率 labelss表示我的标签 如果三类 那么labelss=[0 1 2] 然后:
人为一下就可以看到属于第0类 因为概率是0.7最大 我这里改成了按降序排列 而不是升序 因为升序如果类别不同label=exam[0]这里就要改不同 2类的话这里如@风翼冰舟所说要改成1 因为后者为概率最大的类别号 如果3类的话要改成2 4类的话改成3 不方便 索性就改成降序 不管你是有几类 最大的标号始终为0 这样方便 我试了下 证明正确:
再看:
正确的
再比如:
所以这样改更好 弹性更大。
不管几类都是正确的 根据概率来的:
OK啦!
读取一个文件夹下的一些图片:
预测这个文件夹下所有图片的分类结果:并写进一个class_result.txt的文件中:
只是我的模型准确率不好 都分到一个类中去了!
其中这有2个脚本文件:
第一个是myclassify1img.py:
import caffe
import numpy as np
def classify1img(caffe_model,deploy,mean_file,labels_filename,img):
net = caffe.Net(deploy,caffe_model,caffe.TEST)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0))
im=caffe.io.load_image(img)
net.blobs['data'].data[...] = transformer.preprocess('data',im)
out = net.forward()
labels = np.loadtxt(labels_filename, str, delimiter='\t')
prob= net.blobs['prob'].data[0].flatten()
order=np.argsort(-prob)[0]
#print 'class is:',labels[order]
myclass=labels[order]
return myclass
第二个是:
#http://www.111cn.net/phper/python/47504.htm
import os,glob
from myclassify1img import classify1img
import caffe
dir_path='E:/Keras_Code/examples/imagenet/forclassify/'
imgsextension=['bmp']
os.chdir(dir_path)
imglist=[]
for extension in imgsextension:
extension='*.'+extension
imglist+=[os.path.realpath(e) for e in glob.glob(extension)]
caffe_model='E:/Keras_Code/examples/imagenet/mine_iter_800.caffemodel'
deploy='E:/Keras_Code/examples/imagenet/mydeploy.prototxt'
mean_file='E:/pyCaffe_GPU/python/caffe/imagenet/ilsvrc_2012_mean.npy'
labels_filename = 'E:/Keras_Code/examples/imagenet/mylabel.txt'
class_file='E:/Keras_Code/examples/imagenet/class_result.txt'
f=open(class_file,'w')
for file in imglist:
img=file
myclass=classify1img(caffe_model,deploy,mean_file,labels_filename,img)
#print myclass
f.write(myclass+'\n')
f.close()
就行啦!
///
遇到一个问题 我想把图片显示出来:
import numpy as np
import matplotlib.pyplot as plt
image='E:/Keras_Code/examples/imagenet/test00.bmp'
plt.imshow(image)
plt.axis('off')
可是总是报错:
为什么呢??可是我换用ipython上运行:
图片就可以显示出来 为什么Notepad++上面运行就不行呢???
就剩下第一个和这个问题待解决了。。。
///
/
刚刚看到对新图片预测分类时 要用自己的mean文件 据说是要用新图片减去训练集的mean.binaryproto :之前我是用的pycaffe自带的ilsvrc_2012_mean.npy 而做自己的图片还是不能用它的 因为我看到它是[3,256,256]而我自己的图片不是这样 所以用它的均值不对的:
这样就行了!和那个npy等价!
比如上面我的待预测的新图片都放在forclassify文件夹下面 比如有10张 只是我不知道这上面预测时到底是用训练集计算得到的那个meanforme.binaryproto还是应该首先对这些新图片也就是forclassify文件夹下的图片计算出一个新mean_new.binaryproto 然后用这个mean_new.binaryproto??这两个mean到底应该用哪个 有人说用第一个也就是训练集的mean文件 对吗???这是第三个问题。
///马上要十一了 七天假 哈哈///
按照http://www.07net01.com/2016/05/1502443.html 用自己训练好的模型提取全连接层的特征并保存:
#http://www.cnblogs.com/louyihang-loves-baiyan/p/5078746.html
#http://www.cnblogs.com/louyihang-loves-baiyan/p/5134671.html
import numpy as np
import matplotlib.pyplot as plt
import caffe
from useless_test import vis_square
from PIL import Image
import scipy.io as sio
caffe.set_mode_gpu()
caffe.set_device(0)
deployPrototxt ='E:/Keras_Code/examples/imagenet/mydeploy.prototxt'
modelFile ='E:/Keras_Code/examples/imagenet/mine_iter_800.caffemodel'
mean_file='E:/Keras_Code/examples/imagenet/meanforme.binaryproto'
net = caffe.Net(deployPrototxt, modelFile,caffe.TEST)
dir_path='E:/Keras_Code/examples/imagenet/forclassify/'
#myimglist=readImageList(dir_path)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
mean_blob = caffe.proto.caffe_pb2.BlobProto()
mean_blob.ParseFromString(open(mean_file, 'rb').read())
mean_npy = caffe.io.blobproto_to_array(mean_blob)
b2=mean_npy[0,:,:,:]
transformer.set_mean('data',b2.mean(1).mean(1))
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0))
net.blobs['data'].reshape(1,3,227,227)
for layer_name, blob in net.blobs.iteritems():
print layer_name + '\t' + str(blob.data.shape)
image='E:/Keras_Code/examples/imagenet/test00.bmp'
net.blobs['data'].data[...] = transformer.preprocess('data',caffe.io.load_image(image))
net.forward()
plt.subplot(4, 1, 1)
plt.imshow(Image.open(image))
plt.axis('off')
#conv1
plt.subplot(4, 1, 2)
feat_conv= net.blobs['conv1'].data[0, :36]
vis_square(feat_conv)
feat_fc= net.blobs['fc6'].data[0]
print feat_fc.shape
#print 'full connect feature:',type(feat_fc)
plt.subplot(4, 1, 3)
plt.plot(feat_fc.flat)
plt.subplot(4, 1, 4)
_ = plt.hist(feat_fc.flat[feat_fc.flat > 0], bins=100)
feat_fc.shape=(4096,1)
row_feat_fc=np.transpose(feat_fc)
#print row_feat_fc.shape
#np.savetxt("E:/Keras_Code/examples/imagenet/savefeatures.txt",row_feat_fc)
sio.savemat("E:/Keras_Code/examples/imagenet/savefeatures.mat", {'feature':row_feat_fc})
#http://www.07net01.com/2016/05/1502443.html
#filters = net.params['conv1'][0].data
#with open('FirstLayerFilter.pickle','wb') as f:
# pickle.dump(filters,f)
#vis_square(filters.transpose(0, 2, 3, 1))
#http://blog.csdn.net/thy_2014/article/details/51659300
#with open('FirstLayerOutput.pickle','wb') as f:
# pickle.dump(feat,f)
#pool = net.blobs['pool1'].data[0,:36]
#with open('pool1.pickle','wb') as f:
# pickle.dump(pool,f)
#vis_square(pool,padval=1)
#vis_square(pool)
#http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb
第一张是我要提取特征的原图 第二张是36个小图 即卷积层的输出 第三个是fc6层特征
保存为mat !
//
上面是提取一张图片特征并保存 现在是提取一个文件夹下的所有图片并保存:
#extract many images in one folder
import os
import numpy as np
import matplotlib.pyplot as plt
import caffe
from useless_test import vis_square
from PIL import Image
import scipy.io as sio
caffe.set_mode_gpu()
caffe.set_device(0)
deployPrototxt ='E:/Keras_Code/examples/imagenet/mydeploy.prototxt'
modelFile ='E:/Keras_Code/examples/imagenet/mine_iter_800.caffemodel'
mean_file='E:/Keras_Code/examples/imagenet/meanforme.binaryproto'
net = caffe.Net(deployPrototxt, modelFile,caffe.TEST)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
mean_blob = caffe.proto.caffe_pb2.BlobProto()
mean_blob.ParseFromString(open(mean_file, 'rb').read())
mean_npy = caffe.io.blobproto_to_array(mean_blob)
b2=mean_npy[0,:,:,:]
transformer.set_mean('data',b2.mean(1).mean(1))
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0))
net.blobs['data'].reshape(1,3,227,227)
dir_path='E:/Keras_Code/examples/imagenet/forclassify'
filelists=os.listdir(dir_path)
#print filelists
#dim=4096 changed by you
features = np.empty((len(filelists),4096),dtype="float32")
for ind,everyimg in enumerate(filelists):
theimg='E:/Keras_Code/examples/imagenet/forclassify/'+everyimg
net.blobs['data'].data[...] = transformer.preprocess('data',caffe.io.load_image(theimg))
net.forward()
feat_fc= net.blobs['fc6'].data[0]
feat_fc.shape=(4096,1)
row_feat_fc=np.transpose(feat_fc)
features[ind,:]=row_feat_fc
#np.savetxt("E:/Keras_Code/examples/imagenet/savefeatures.txt",row_feat_fc)
sio.savemat("E:/Keras_Code/examples/imagenet/imgsfeatures.mat", {'feature':features})
OK!我的那个文件夹下只有8张图片!
///
我想设计自己的层,不用自带model里面的层,设计自己的层就得会计算每层的输入输出:
http://www.myexception.cn/other/1828071.html 按照这个:
我要学着计算这个 就以上面那个模型为例好了 它的层设置是这样子:
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "examples/imagenet/meanforme.binaryproto"
}
data_param {
source: "examples/imagenet/train_leveldb"
batch_size: 8
backend: LEVELDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
mean_file: "examples/imagenet/meanforme.binaryproto"
}
data_param {
source: "examples/imagenet/test_leveldb"
batch_size: 1
backend: LEVELDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "norm1"
type: "LRN"
bottom: "pool1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "norm1"
top: "conv2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 2
kernel_size: 5
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "norm2"
type: "LRN"
bottom: "pool2"
top: "norm2"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv3"
type: "Convolution"
bottom: "norm2"
top: "conv3"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "conv4"
type: "Convolution"
bottom: "conv3"
top: "conv4"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 384
pad: 1
kernel_size: 3
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu4"
type: "ReLU"
bottom: "conv4"
top: "conv4"
}
layer {
name: "conv5"
type: "Convolution"
bottom: "conv4"
top: "conv5"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 256
pad: 1
kernel_size: 3
group: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu5"
type: "ReLU"
bottom: "conv5"
top: "conv5"
}
layer {
name: "pool5"
type: "Pooling"
bottom: "conv5"
top: "pool5"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "fc6"
type: "InnerProduct"
bottom: "pool5"
top: "fc6"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu6"
type: "ReLU"
bottom: "fc6"
top: "fc6"
}
layer {
name: "drop6"
type: "Dropout"
bottom: "fc6"
top: "fc6"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc7"
type: "InnerProduct"
bottom: "fc6"
top: "fc7"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 4096
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu7"
type: "ReLU"
bottom: "fc7"
top: "fc7"
}
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7"
top: "fc7"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc8"
type: "InnerProduct"
bottom: "fc7"
top: "fc8"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "fc8"
bottom: "label"
top: "accuracy"
include {
phase: TRAIN
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc8"
bottom: "label"
top: "loss"
}
它的实际每层 我输出来看到是这样:
data的1L是不是batchsize?为什么是1呢?是指测试集的batchsize吗?为什么不是训练集的batchsize:8呢? 输入是3X227X227的 ......经过计算conv1后http://www.myexception.cn/other/1828071.html 可以得到96(num_output: 96)和55X55 但是 这个10?是怎么来的 ?默认的吗?.......计算经过pool1后,我按照公式计算出来是96X27X27......再经过norm1(不变),依旧是96X27X27.......然后是经过conv2,num_output: 256 默认步长stride是1哦 所以又计算出来是 256X27X27.....再经过pool2后,又计算出来的确是256X13X13.....后面的几层我都会按照这样计算了。
那么问题是 那个data的1是train还是test的batchsize或者什么? 为什么会在conv1变成10?是不是train和test不能写在同一个prototxt中????
哦 我明白了 后面的10是这个文件中设置的:
data中的1是 在预测分类和提取特征时设置的:
所以出来是1! 按道理来说 是不是我该该成和test的batchsize一样大小才对 ??
是将deploy中的dim改成测试集的batchsize的大小吧 还是改下面那个data的reshape的第一维数据成测试集的batchsize大小? 我觉得是改deploy中的 像上面那样。。。。吧?
和别人讨论后,我觉得应该这样理解 :因为自己的deploy.prototxt文件主要用在2个地方:提取每层的特征和对新图片预测分类
提取特征时.py中:net.blobs['data'].reshape(1,3,227,227) 这句中的1的确代表batchsize 但代表的是要提取多少张图片一次性 的batchsize
预测分类时deploy中:input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } } 这个10也的确是代表batchsize 但代表的是一次性预测多少张图片的类别 的batchsize
个人觉得和我们训练集测试集训练模型的那个测试集的batchsize没太大关系 是这样吗????????????
/
别人给了我猫的图片12000张 狗的图片12000张 我试试这个二分类 :我拿98张猫和94张狗做测试集 剩余的都是训练集 :
一、首先对训练集生成标签、测试集生成对应标签:
#include<iostream>
#include<string>
int main()
{
FILE *fid1;
fid1 = fopen("test_labels9.27.txt", "w");
int label0 = 0, label1 = 1;
char name[15], label[2], black[] = "\r\n";
memset(name, 0, sizeof(name));
for (int i = 0; i < 98; ++i)
{
itoa(i, name, 10);
strcat(name, ".jpg ");
itoa(label0, label, 10);
strcat(name, label);
printf("%s", name);
fwrite(name, sizeof(name), 1, fid1);
fwrite(black, strlen(black), 1, fid1);
memset(name, 0, sizeof(name));
memset(label, 0, sizeof(label));
}
for (int i =98; i < 192; ++i)
{
itoa(i, name, 10);
strcat(name, ".jpg ");
itoa(label1, label, 10);
strcat(name, label);
printf("%s", name);
fwrite(name, sizeof(name), 1, fid1);
fwrite(black, strlen(black), 1, fid1);
memset(name, 0, sizeof(name));
memset(label, 0, sizeof(label));
}
fclose(fid1);
return 0;
}
二、将训练测试集转为lmdb格式
E:\pyCaffe_GPU\Build\x64\Release\convert_imageset.exe E:\pyCaffe_GPU\Build\x64\Release\mytest\ E:\pyCaffe_GPU\Build\x64\Release\mytest\test_labels9.27.txt E:\pyCaffe_GPU\examples\imagenet\test_lmdb_catdog -backend=lmdb
pause
<img src="https://img-blog.csdn.net/20160929103509301" alt="" />
训练集也是这样:
三、生成训练测试集的mean文件:
E:\pyCaffe_GPU\Build\x64\Release\compute_image_mean.exe E:\pyCaffe_GPU\examples\imagenet\train_lmdb_catdog E:\pyCaffe_GPU\examples\imagenet\mean_catdog_train.binaryproto
pause
测试集也是这样
四、写那两个prototxt文件:
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 300
mean_file: "examples/imagenet/mean_catdog_train.binaryproto"
}
data_param {
source: "examples/imagenet/train_lmdb_catdog"
batch_size: 20
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 300
mean_file: "examples/imagenet/mean_catdog_test.binaryproto"
}
data_param {
source: "examples/imagenet/test_lmdb_catdog"
batch_size: 5
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 102
kernel_size: 3
stride: 3
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 1
}
}
layer {
name: "norm1"
type: "LRN"
bottom: "pool1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "norm1"
top: "conv2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 204
kernel_size: 5
stride: 3
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 5
stride: 1
}
}
layer {
name: "norm2"
type: "LRN"
bottom: "pool2"
top: "norm2"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv3"
type: "Convolution"
bottom: "norm2"
top: "conv3"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 300
kernel_size: 3
stride: 1
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "pool3"
type: "Pooling"
bottom: "conv3"
top: "pool3"
pooling_param {
pool: MAX
kernel_size: 5
stride: 3
}
}
layer {
name: "fc4"
type: "InnerProduct"
bottom: "pool3"
top: "fc4"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2050
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu4"
type: "ReLU"
bottom: "fc4"
top: "fc4"
}
layer {
name: "drop4"
type: "Dropout"
bottom: "fc4"
top: "fc4"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc5"
type: "InnerProduct"
bottom: "fc4"
top: "fc5"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "fc5"
bottom: "label"
top: "accuracy"
include {
phase: TRAIN
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc5"
bottom: "label"
top: "loss"
}
solver.prototxt:
net: "examples/imagenet/my_traintest.prototxt"
test_iter: 40
test_interval: 50
base_lr: 0.001
momentum: 0.9
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.001
power: 0.75
display: 10
max_iter: 20000
snapshot: 1000
snapshot_prefix: "examples/imagenet/catdog"
solver_mode: GPU
开始我的batchsize设置为50 竟然报错说 out of memory 后来改小了
五、写train.bat进行训练:
.\Build\x64\Release\caffe.exe train --solver=.\examples\imagenet\my_solver.prototxt
pause
等。。。。。。。。。。。。。。。。
六、结果:
2万多图片 这个准确率 可以了!
/分界线/
用第一个模型 就是caffe自带的一个较复杂的模型 预测1016张图片的类别:
这个模型
结果需要时间:平均27ms每张!
我乱编了一个较简短的模型 如下:
可是时间却长些?
每张平均46ms! 为什么呢 好奇怪?
/今天下班就可以去嗨了哈哈
七天假哈哈/嘴巴都笑烂了哈哈
对我自己的图片重新来训练:
一、转换lmdb:
E:\pyCaffe_GPU\Build\x64\Release\convert_imageset.exe E:\pyCaffe_GPU\Build\x64\Release\test_mine\ E:\pyCaffe_GPU\Build\x64\Release\test_mine\test_labels.txt E:\pyCaffe_GPU\examples\imagenet\test_lmdb_mine --shuffle -backend=lmdb
pause
二、算mean
E:\pyCaffe_GPU\Build\x64\Release\compute_image_mean.exe E:\pyCaffe_GPU\examples\imagenet\train_lmdb_mine E:\pyCaffe_GPU\examples\imagenet\mean_mine_train.binaryproto
pause
三、prototxt文件:
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 300
mean_file: "E:/pyCaffe_GPU/examples/imagenet/mean_mine_train.binaryproto"
}
data_param {
source: "E:/pyCaffe_GPU/examples/imagenet/train_lmdb_mine/"
batch_size: 10
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 300
mean_file: "E:/pyCaffe_GPU/examples/imagenet/mean_mine_test.binaryproto"
}
data_param {
source: "E:/pyCaffe_GPU/examples/imagenet/test_lmdb_mine/"
batch_size: 1
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 102
kernel_size: 3
stride: 3
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 1
}
}
layer {
name: "norm1"
type: "LRN"
bottom: "pool1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "norm1"
top: "conv2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 204
kernel_size: 5
stride: 3
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 5
stride: 1
}
}
layer {
name: "norm2"
type: "LRN"
bottom: "pool2"
top: "norm2"
lrn_param {
local_size: 5
alpha: 0.0001
beta: 0.75
}
}
layer {
name: "conv3"
type: "Convolution"
bottom: "norm2"
top: "conv3"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 300
kernel_size: 3
stride: 1
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "pool3"
type: "Pooling"
bottom: "conv3"
top: "pool3"
pooling_param {
pool: MAX
kernel_size: 5
stride: 3
}
}
layer {
name: "fc4"
type: "InnerProduct"
bottom: "pool3"
top: "fc4"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2050
weight_filler {
type: "gaussian"
std: 0.005
}
bias_filler {
type: "constant"
value: 1
}
}
}
layer {
name: "relu4"
type: "ReLU"
bottom: "fc4"
top: "fc4"
}
layer {
name: "drop4"
type: "Dropout"
bottom: "fc4"
top: "fc4"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "fc5"
type: "InnerProduct"
bottom: "fc4"
top: "fc5"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "fc5"
bottom: "label"
top: "accuracy"
include {
phase: TRAIN
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "fc5"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc5"
bottom: "label"
top: "loss"
}
四、train.bat训练结果 并画曲线图:
http://download.csdn.net/detail/wd1603926823/9671251 plot.py
这是1600次的图 等它执行完20000次我再看。。。
快10000次了。。。
大功告成!
五、用最后一次的模型提取特征:
六、用最后一次的模型预测类别:
我只拿了8张图片进行预测。。。。。因为我没有新样本了。
七、将类别结果保存:
#http://www.111cn.net/phper/python/47504.htm
import time
start=time.clock()
import os
from myclassify1img import classify1img
import caffe
caffe.set_mode_gpu()
caffe.set_device(0)
dir_path='E:/Keras_Code/examples/imagenet/forclassify/'
'''
imgsextension=['bmp']
os.chdir(dir_path)
imglist2=[]
for extension in imgsextension:
extension='*.'+extension
imglist2+=[os.path.realpath(e) for e in glob.glob(extension)]
print imglist2
'''
imglist=[]
for path,d,filelist in os.walk(dir_path):
filelist.sort(key= lambda x:int(x[:-4]))
for filename in filelist:
mypath =dir_path + filename
#print filename
#print mypath
#imglist+=[mypath]
imglist.append(mypath)
#print imglist
net_file='E:\pyCaffe_GPU\examples\imagenet\mydeploy_mine.prototxt'
caffe_model='E:\pyCaffe_GPU\examples\imagenet\mine_iter_20000.caffemodel'
mean_file='E:\pyCaffe_GPU\examples\imagenet\mean_mine_train.binaryproto'
class_result='E:\Keras_Code\examples\imagenet\class_result.txt'
net = caffe.Net(net_file,caffe_model,caffe.TEST)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
#transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
mean_blob = caffe.proto.caffe_pb2.BlobProto()
mean_blob.ParseFromString(open(mean_file, 'rb').read())
mean_npy = caffe.io.blobproto_to_array(mean_blob)
b2=mean_npy[0,:,:,:]
transformer.set_mean('data',b2.mean(1).mean(1))
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0)) # if using RGB instead if BGR
#img=caffe.io.load_image('E:/Keras_Code/examples/imagenet/forclassify/test13.bmp')
imagenet_labels_filename = 'E:/Keras_Code/examples/imagenet/mylabel.txt'
allclass=[]
for file in imglist:
img=file
myclass=classify1img(imagenet_labels_filename,net,transformer,img)
#f.write(myclass+'\n')
allclass.append(myclass)
f=open(class_result,'w')
for ind in range(len(filelist)):
f.write(filelist[ind]+' '+allclass[ind]+'\n')
f.close()
finish=time.clock()
print "read: %f s"%(finish - start)
按我文件夹本来的顺序
可以了!
还有一个小时就要放七天假了 内心澎湃/
caffe整个流程终于全部完了 而且准确了 哈哈
训练模型、预测分类、提取特征
终于都搞完了
谢谢很多人的帮助