2016-08-31 3 views
1

python 내에서 이미지 + 레이블 배치를로드하고 네트워크를 훈련 시키려고 할 때 몇 가지 문제가 있습니다. 한 쌍의 이미지로 작업하면서 한 이미지로 변환 한 다음 (예 : 두 이미지에서 동일한 픽셀을 평균하여) 네트워크로 피드합니다. 쌍의 수가 너무 많아서 (개별 이미지를 두 개씩 조합하여) 모두를 메모리에 저장하기 때문에 각 반복마다 각 배치를 만들고 네트워크에 제공하고 싶습니다. 입력 네트워크 계층이 정의되어Caffe : 미세 조정을 위해 python 내에서 이미지 및 레이블로드

solver = caffe.get_solver(path_to_solver_file) 

: 내 이전 실험에서

layer { 
    name: "data" 
    type: "ImageData" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    image_data_param { 
    batch_size: 1 
    new_height: 227 
    new_width: 227 
    } 
} 
layer { 
    name: "data" 
    type: "ImageData" 
    top: "data" 
    top: "label" 
    include { 
    phase: TEST 
    } 
    image_data_param { 
    batch_size: 1 
    new_height: 227 
    new_width: 227 
    } 
} 

, 나는 image_data_param 내부 소스 매개 변수를했다

나는이 방법으로 네트워크를 인스턴스화하고, 교육 및 테스트를 위해 이미지와 레이블이 포함 된 파일을 전달합니다. 내가 파이썬 내에서로드 원하는대로 그러나, 나는 source 매개 변수를 제거하지만, 다음과 같은 오류 있어요 :

0830 17:01:49.014819 1967923200 layer_factory.hpp:77] Creating layer data 

I0830 17:01:49.014858 1967923200 net.cpp:91] Creating Layer data 

I0830 17:01:49.014868 1967923200 net.cpp:399] data -> data 

I0830 17:01:49.014890 1967923200 net.cpp:399] data -> label 

I0830 17:01:49.014910 1967923200 image_data_layer.cpp:38] Opening file 

I0830 17:01:49.014935 1967923200 image_data_layer.cpp:53] A total of 0 images. 

Segmentation fault: 11 

나는 아직이 점에 도착하지 않은,하지만 난을 인스턴스화 할 수있어 후

net.blobs["data"].data[...] = images 
net.blobs["label"].data[...] = labels 
net.step(1) 

내가 미세 조정을 수행하는 (예를 들어, herehere) 예제와 튜토리얼을 검색하고 파이썬을 사용하여 테스트 : 네트워크, 나는 배치를로드하고 사용하여 SGD 최적화의 한 단계를 수행하기 위해 가고 있었다 그러나 대다수의 사람들은 테스트 단계에서 전달 경로에 대해서만 논의하지만 반면에 네트워크를 미세하게 튜닝하는 것은 파이썬 인터페이스에서 직접로드하는 것이 아니라 소스 매개 변수를 사용하여 교육 데이터 (레이블 및 이미지)를 정의합니다.

+0

이 답변을 확인하십시오 : http://stackoverflow.com/a/39097123/5465000 – AHA

답변

1

레이어 ImageData은 각 라인의 이미지 주소를 보유하고있는 텍스트 파일에서만 이미지를 읽을 수 있습니다. ImageData 레이어를 사용하여 즉시 이미지를 피드 할 수 없습니다.

이미지를 즉시로드하는 데 관심이있는 경우이 체크는 link입니다. 배포 버전을 사용하는 것이 좋습니다 (3 번째 옵션은 해당 게시물에서 설명했습니다). 이는 더 손쉽고 유연합니다.

배포 버전을 사용하는 경우,이 같은 네트워크에 입력 데이터를 설정할 수 있습니다

x = data; 
y = labels; 
solver.net.blobs['data'].data[...] = x 
net.blobs['label'].data[...] = y 

그런 다음 중 하나에서만 출력을 볼 수 solver.net.forward()를 호출 할 수 있습니다; 또는 solver.net.step(1)으로 전화하여 앞뒤를 실행할 수 있습니다 (1 반복에 대해 훈련).

+0

안녕하세요, @AHA, 답변 해 주셔서 감사합니다. 하지만 두 가지 질문이 있습니다. (1) 배포 버전을 사용하여 네트워크를 미세 조정할 수 있습니까? (2) 그렇다면 데이터를이 레이어로 전달하는 방법은 무엇입니까? 게시물에서 내가 한 것과 비슷합니까? – rafaspadilha

+0

예, 게시물에서 수행했던 것과 비슷합니다. 나는 그것을 명확하게하기 위해 나의 대답을 편집하고 확장했다. – AHA

+0

그 좋은 소식! 내 코드에서 그것을 변경하지 않아도 될 것 같습니다. 나는 그것을 시험해보고 나는 다시보고 할 것이다! 다시 한번 감사드립니다. @AHA! – rafaspadilha

관련 문제