2015-06-12 15 views
5

Tôi đã sử dụng GoogleNet giả định từ https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet và kết hợp nó với dữ liệu của riêng tôi (~ 100k hình ảnh, 101 lớp). Sau một ngày đào tạo, tôi đã đạt được 62% trong top-1 và 85% trong phân loại top 5 và cố gắng sử dụng mạng này để dự đoán một số hình ảnh.Caffe net.predict() đưa ra kết quả ngẫu nhiên (GoogleNet)

Tôi chỉ đi theo ví dụ từ https://github.com/BVLC/caffe/blob/master/examples/classification.ipynb,

Đây là mã Python tôi:

import caffe 
import numpy as np 


caffe_root = './caffe' 


MODEL_FILE = 'caffe/models/bvlc_googlenet/deploy.prototxt' 
PRETRAINED = 'caffe/models/bvlc_googlenet/bvlc_googlenet_iter_200000.caffemodel' 

caffe.set_mode_gpu() 

net = caffe.Classifier(MODEL_FILE, PRETRAINED, 
       mean=np.load('ilsvrc_2012_mean.npy').mean(1).mean(1), 
       channel_swap=(2,1,0), 
       raw_scale=255, 
       image_dims=(224, 224)) 

def caffe_predict(path): 
     input_image = caffe.io.load_image(path) 
     print path 
     print input_image 
     prediction = net.predict([input_image]) 


     print prediction 
     print "----------" 

     print 'prediction shape:', prediction[0].shape 
     print 'predicted class:', prediction[0].argmax() 


     proba = prediction[0][prediction[0].argmax()] 
     ind = prediction[0].argsort()[-5:][::-1] # top-5 predictions 


     return prediction[0].argmax(), proba, ind 

Trong deploy.prototxt của tôi, tôi đã thay đổi lớp cuối cùng chỉ để dự đoán 101 lớp học của tôi.

layer { 
    name: "loss3/classifier" 
    type: "InnerProduct" 
    bottom: "pool5/7x7_s1" 
    top: "loss3/classifier" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 101 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "prob" 
    type: "Softmax" 
    bottom: "loss3/classifier" 
    top: "prob" 
} 

Đây là sự phân bố sản lượng softmax:

[[ 0.01106235 0.00343131 0.00807581 0.01530041 0.01077161 0.0081002 
    0.00989228 0.00972753 0.00429183 0.01377776 0.02028225 0.01209726 
    0.01318955 0.00669979 0.00720005 0.00838189 0.00335461 0.01461464 
    0.01485041 0.00543212 0.00400191 0.0084842 0.02134697 0.02500303 
    0.00561895 0.00776423 0.02176422 0.00752334 0.0116104 0.01328687 
    0.00517187 0.02234021 0.00727272 0.02380056 0.01210031 0.00582192 
    0.00729601 0.00832637 0.00819836 0.00520551 0.00625274 0.00426603 
    0.01210176 0.00571806 0.00646495 0.01589645 0.00642173 0.00805364 
    0.00364388 0.01553882 0.01549598 0.01824486 0.00483241 0.
    0.00545738 0.0101487 0.0040346 0.01066607 0.01328133 0.01027429 
    0.01581303 0.01199994 0.00371804 0.01241552 0.00831448 0.00789811 
    0.00456275 0.00504562 0.00424598 0.01309276 0.0079432 0.0140427 
    0.00487625 0.02614347 0.00603372 0.00892296 0.00924052 0.00712763 
    0.01101298 0.00716757 0.01019373 0..00905332 0.0040798 
    0.00846442 0.00924353 0.00709366 0.01535406 0.00653238 0.01083806 
    0.01168014 0.02076091 0.00542234 0.01246306 0.00704035 0.00529556 
    0.00751443 0.00797437 0.00408798 0.00891858 0.00444583]] 

Dường như giống như phân phối ngẫu nhiên không có ý nghĩa.

Cảm ơn bạn cho bất kỳ sự giúp đỡ hoặc gợi ý Trân trọng, Alex

Trả lời

2

Giải pháp là thực sự đơn giản: Tôi chỉ quên đổi tên lớp cuối cùng trong tập tin triển khai:

layer { 
    name: "loss3/classifier" 
    type: "InnerProduct" 
    bottom: "pool5/7x7_s1" 
    top: "loss3/classifier" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
0

Vui lòng kiểm tra việc chuyển đổi hình ảnh mà bạn đang sử dụng - là nó như nhau trong đào tạo và thử nghiệm thời gian?

AFAIK bvlc_googlenet trừ hình ảnh có nghĩa là với một giá trị cho mỗi kênh, trong khi python classifier sử dụng giá trị trung bình khác nhau mean=np.load('ilsvrc_2012_mean.npy').mean(1).mean(1). Điều này có thể khiến cho mạng không thể phân loại các đầu vào của bạn một cách chính xác.

Các vấn đề liên quan