2015-03-18 14 views
10

Tôi đang sử dụng Caffein để phân loại dữ liệu không phải hình ảnh bằng cách sử dụng cấu trúc CNN khá đơn giản. Tôi không gặp vấn đề gì khi đào tạo mạng của mình trên dữ liệu HDF5 với kích thước n x 1 x 156 x 12. Tuy nhiên, tôi đang gặp khó khăn khi phân loại dữ liệu mới.Dự đoán trong Caffein - Ngoại lệ: Các đối số blob đầu vào không khớp với đầu vào mạng

Làm cách nào để chuyển tiếp đơn giản mà không cần xử lý trước? Dữ liệu của tôi đã được chuẩn hóa và có kích thước chính xác cho Caffe (nó đã được sử dụng để đào tạo mạng). Dưới đây là mã của tôi và cấu trúc CNN.

EDIT: tôi đã cô lập các vấn đề với chức năng '_Net_forward' trong pycaffe.py và thấy rằng vấn đề phát sinh như dict self.input trống. Bất cứ ai có thể giải thích lý do tại sao? Tập hợp được cho là bằng với tập hợp đến từ dữ liệu thử nghiệm mới:

if set(kwargs.keys()) != set(self.inputs): 
      raise Exception('Input blob arguments do not match net inputs.') 

Mã của tôi đã thay đổi một chút khi tôi sử dụng phương pháp IO để chuyển dữ liệu thành dữ liệu (xem bên dưới). Theo cách đó tôi đã điền biến kwargs với dữ liệu chính xác.

Ngay cả những gợi ý nhỏ cũng sẽ được đánh giá cao!

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

    # Make sure that caffe is on the python path: 
    caffe_root = '' # this file is expected to be run from {caffe_root} 
    import sys 
    sys.path.insert(0, caffe_root + 'python') 

    import caffe 

    import os 
    import subprocess 
    import h5py 
    import shutil 
    import tempfile 

    import sklearn 
    import sklearn.datasets 
    import sklearn.linear_model 
    import skimage.io 



    def LoadFromHDF5(dataset='test_reduced.h5', path='Bjarke/hdf5_classification/data/'): 

     f = h5py.File(path + dataset, 'r') 
     dat = f['data'][:] 
     f.close() 

     return dat; 

    def runModelPython(): 
     model_file = 'Bjarke/hdf5_classification/conv_v2_simple.prototxt' 
     pretrained = 'Bjarke/hdf5_classification/data/train_iter_10000.caffemodel' 
     test_data = LoadFromHDF5() 

     net = caffe.Net(model_file, pretrained) 
     caffe.set_mode_cpu() 
     caffe.set_phase_test() 

     user = test_data[0,:,:,:] 
     datum = caffe.io.array_to_datum(user.astype(np.uint8)) 
     user_dat = caffe.io.datum_to_array(datum) 
     user_dat = user_dat.astype(np.uint8) 
     out = net.forward_all(data=np.asarray([user_dat])) 

if __name__ == '__main__': 
    runModelPython() 

CNN Prototext

name: "CDR-CNN" 
layers { 
    name: "data" 
    type: HDF5_DATA 
    top: "data" 
    top: "label" 
    hdf5_data_param { 
    source: "Bjarke/hdf5_classification/data/train.txt" 
    batch_size: 10 
    } 
    include: { phase: TRAIN } 
} 
layers { 
    name: "data" 
    type: HDF5_DATA 
    top: "data" 
    top: "label" 
    hdf5_data_param { 
    source: "Bjarke/hdf5_classification/data/test.txt" 
    batch_size: 10 
    } 
    include: { phase: TEST } 
} 

layers { 
    name: "feature_conv" 
    type: CONVOLUTION 
    bottom: "data" 
    top: "feature_conv" 
    blobs_lr: 1 
    blobs_lr: 2 
    convolution_param { 
    num_output: 10 
    kernel_w: 12 
    kernel_h: 1 
    stride_w: 1 
    stride_h: 1 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layers { 
    name: "conv1" 
    type: CONVOLUTION 
    bottom: "feature_conv" 
    top: "conv1" 
    blobs_lr: 1 
    blobs_lr: 2 
    convolution_param { 
    num_output: 14 
    kernel_w: 1 
    kernel_h: 4 
    stride_w: 1 
    stride_h: 1 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layers { 
    name: "pool1" 
    type: POOLING 
    bottom: "conv1" 
    top: "pool1" 
    pooling_param { 
    pool: MAX 
    kernel_w: 1 
    kernel_h: 3 
    stride_w: 1 
    stride_h: 3 
    } 
} 
layers { 
    name: "conv2" 
    type: CONVOLUTION 
    bottom: "pool1" 
    top: "conv2" 
    blobs_lr: 1 
    blobs_lr: 2 
    convolution_param { 
    num_output: 120 
    kernel_w: 1 
    kernel_h: 5 
    stride_w: 1 
    stride_h: 1 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layers { 
    name: "fc1" 
    type: INNER_PRODUCT 
    bottom: "conv2" 
    top: "fc1" 
    blobs_lr: 1 
    blobs_lr: 2 
    weight_decay: 1 
    weight_decay: 0 
    inner_product_param { 
    num_output: 84 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layers { 
    name: "accuracy" 
    type: ACCURACY 
    bottom: "fc1" 
    bottom: "label" 
    top: "accuracy" 
    include: { phase: TEST } 
} 
layers { 
    name: "loss" 
    type: SOFTMAX_LOSS 
    bottom: "fc1" 
    bottom: "label" 
    top: "loss" 
} 
+0

Hiển thị lên các tập tin đăng nhập cũng sẽ giúp chúng tôi thu hẹp vấn đề này hơn nữa –

+0

Chỉ cần để cho bạn biết, tôi đã nói với nó không phải là một lỗi trên theo dõi. Tôi đã hỏi cách thực hiện trên danh sách gửi thư nhưng không có câu trả lời cho đến nay https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/caffe-users/eEhSBlKcjpc/llQi9PTPAYsJ – Mark

+0

Cùng vấn đề: https : //groups.google.com/forum/#! topic/caffe-users/aojN_bmbg74 –

Trả lời

8

Đây là the answer from Evan Shelhamer I got on the Caffe Google Groups:

self._inputs thực sự là để hướng dẫn hoặc "triển khai" đầu vào theo quy định bởi các lĩnh vực đầu vào trong một prototxt. Để chạy một mạng với các lớp dữ liệu trong thông qua pycaffe, chỉ cần gọi net.forward() mà không có đối số. Không cần để thay đổi định nghĩa của tàu hoặc lưới thử nghiệm của bạn.

Xem ô mã ví dụ [10] của Python LeNet example.

Trong thực tế, tôi nghĩ rằng đó là rõ ràng hơn trong Instant Recognition with Caffe tutorial, tế bào 6:

# Feed in the image (with some preprocessing) and classify with a forward pass. 
net.blobs['data'].data[...] = transformer.preprocess('data', caffe.io.load_image(caffe_root + 'examples/images/cat.jpg')) 
out = net.forward() 
print("Predicted class is #{}.".format(out['prob'].argmax())) 

Nói cách khác, để tạo ra các kết quả đầu ra dự đoán cũng như xác suất của họ sử dụng pycaffe, một khi bạn đã được đào tạo mô hình của bạn, trước tiên, bạn phải cấp dữ liệu cho lớp dữ liệu với đầu vào của mình, sau đó thực hiện chuyển tiếp với net.forward().


Ngoài ra, như đã chỉ ra trong câu trả lời khác, bạn có thể sử dụng một prototxt triển khai đó là tương tự như bạn sử dụng để xác định mạng lưới đào tạo nhưng loại bỏ các lớp đầu vào và đầu ra, và thêm những điều sau đây ngay từ đầu (rõ ràng là thích nghi theo thứ nguyên đầu vào của bạn):

name: "your_net" 
input: "data" 
input_dim: 1 
input_dim: 1 
input_dim: 1 
input_dim: 250 

Đó là những gì họ sử dụng trong CIFAR10 tutorial.

(pycaffe thực sự nên được ghi nhận tốt hơn ...)

2

Chỉ do kinh nghiệm thực nghiệm của riêng tôi, nó không phải là một ý tưởng rất tốt để xác định tàu và lưới thử nghiệm trong một tập tin sử dụng {} GIAI ĐOẠN khoản. Tôi có nhiều lỗi lạ khi tôi sử dụng tập tin net như thế, nhưng khi tôi sử dụng phiên bản cũ của tập tin net có chứa hai tập tin riêng biệt, đào tạo và kiểm tra, nó làm việc. Tuy nhiên, tôi đã sử dụng phiên bản caffe vào tháng 11 năm 2014, có thể có một số lỗi hoặc sự cố tương thích ở đó.

Khi mô hình được sử dụng để dự đoán, không nên có tệp triển khai chỉ định cấu trúc mạng? Nếu bạn nhìn vào ImageNet, bạn sẽ tìm thấy imagenet_deploy.prototxt ở đó. Mặc dù tập tin triển khai tương tự như tệp đào tạo/kiểm tra, tôi nghe nói có một chút khác biệt do một số chất độn. Tôi không biết nếu đó là vấn đề, nhưng bất kỳ cuộc thảo luận được hoan nghênh, tôi cần phải học schema caffe mới nếu có tồn tại quá

1
Even small hints would be greatly appreciated! 

Tôi đang mắc kẹt quá nên không thể giúp ích nhiều, xin lỗi. Có thể muốn bỏ qua đến cùng.

net.inputs là chức năng @property được cho là tạo ra tên của (các) lớp đầu vào.

@property 
def _Net_inputs(self): 
    return [list(self.blobs.keys())[i] for i in self._inputs] 

đâu list(self.blobs.keys()) cho bạn sẽ là

['data', 'feature_conv', 'conv1', 'pool1', 'conv2', 'fc1', 'accuracy', 'loss'] 

Kể từ inputs có để phù hợp với kwargs.keys() = ['data'] chúng ta có thể kết luận rằng net._inputs cần phải có được [0]. Bằng cách nào đó.

_inputs không được sử dụng ở bất kỳ nơi nào khác trong pycaffe.py Tôi có xem _caffe.cpp. Xung quanh dòng 222 nó nói

.add_property("_inputs", p::make_function(&Net<Dtype>::input_blob_indices, 
    bp::return_value_policy<bp::copy_const_reference>())) 

Vì vậy _inputsinput_blob_indices và nó có ý nghĩa rằng những nên [0] cho mạng của bạn.

input_blob_indices lần lượt chỉ đơn giản là một hàm trả về net_input_blob_indices_ trong include/caffe/net.hpp

inline const vector<int>& input_blob_indices() const { return net_input_blob_indices_; } 

... mà chỉ được sử dụng trong src/caffe/net.cpp, nhưng tôi không thể tìm thấy nó được xác định hoặc phân công bất cứ nơi nào.

Tôi đã thử với type: Data và nhưng điều đó không tạo sự khác biệt. Công việc gì đang sử dụng

input: "data" 
input_dim: 1 
input_dim: 3 
input_dim: 227 
input_dim: 227 

... thay vì một lớp. Trong trường hợp đó, net._inputs = [0]net.inputs = ['data'] (thực tế net._inputscaffe._caffe.IntVec object nhưng list(net._inputs) = [0]).

TLDR: Người ta bắt đầu nhìn rất giống một lỗi vì vậy tôi gửi nó: https://github.com/BVLC/caffe/issues/2246

T.B. nó có vẻ như bạn đang chuyển đổi ndarray để datum và sau đó trở lại một lần nữa. Điều này có một mục đích?

1

Tôi có cùng một vấn đề. Đây là những gì cố định nó.

Trước tiên, hãy sử dụng cùng một tệp tin prototext như bạn đã sử dụng để đào tạo, xóa hai lớp dữ liệu.

Sau đó, thêm khối như Mark trên

name: "Name_of_your_net" 
input: "data" 
input_dim: 64 
input_dim: 1 
input_dim: 28 
input_dim: 28 

nơi input_dim của tôi là dành cho mnist, thay đổi chúng để dim của bạn.

Mọi thứ đều hoạt động.

+0

Câu trả lời hay, có thể giải quyết nó cho 90% người. Nhưng đôi khi bạn thực sự cần các lớp, ví dụ: để nạp dữ liệu vào các phần khác nhau của mạng (như thêm sau khi chập), hoặc các hình dạng dữ liệu khác nhau. Dù sao +1 – Mark

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