[deep learning 학습 노트] Yusugomori의 SDA 코드인 Sda를 주석합니다.cpp - 모델 테스트

3305 단어
테스트 코드는 다음과 같습니다.
4
void test_sda() 
{
  	srand(0);

  	double pretrain_lr = 0.1;
  	double corruption_level = 0.3;
  	int pretraining_epochs = 1000;
  	double finetune_lr = 0.1;
  	int finetune_epochs = 500;

  	int train_N = 10;
  	int test_N = 4;
  	int n_ins = 28;
  	int n_outs = 2;
  	int hidden_layer_sizes[] = {15, 15};
  	int n_layers = sizeof(hidden_layer_sizes) / sizeof(hidden_layer_sizes[0]);

  	// training data
  	int train_X[10][28] = {
	    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
	    {0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
	    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
	    {0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
	    {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
	    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
	    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1},
	    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1},
	    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1},
	    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1}
  	};

	int train_Y[10][2] = {
	    {1, 0},
	    {1, 0},
	    {1, 0},
	    {1, 0},
	    {1, 0},
	    {0, 1},
	    {0, 1},
	    {0, 1},
	    {0, 1},
	    {0, 1}
 	};

  	// construct SdA
  	SdA sda(train_N, n_ins, hidden_layer_sizes, n_outs, n_layers);

  	// pretrain
  	sda.pretrain(*train_X, pretrain_lr, corruption_level, pretraining_epochs);

  	// finetune
  	sda.finetune(*train_X, *train_Y, finetune_lr, finetune_epochs);


	// test data
 	int test_X[4][28] = {
	    {1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
	    {1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
	    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1},
	    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1}
  	};

	// double test_Y[4][28]; // bug!!
      double test_Y[4][2]; // there are only two possible labels for each test sample

  	// test
  	for(int i=0; i<test_N; i++) 
  	{
    	sda.predict(test_X[i], test_Y[i]);
    	for(int j=0; j<n_outs; j++) 
		{
      		printf("%.5f ", test_Y[i][j]);
    	}
    	cout << endl;
  	}
  
}

int main() 
{
  	test_sda();
  	
  	getchar();
  	return 0;
}
모형은 먼저 훈련집으로 훈련한 다음에 테스트 집합을 제시하고 테스트 집합의 label 확률을 예측할 수 있다.그 사이에 또 하나의 버그가 바뀌었지만, 이 버그는 품위를 손상시키지 않았다.훈련 집합과 대응하는 라벨을 관찰한 결과 Sample을 입력하는 벡터 중 앞부분이'1'이 많으면 첫 번째 라벨이'1'일 가능성이 높다.그렇지 않으면 뒷꼬리표가'1'일 가능성이 높다.
실행 결과:
predict 함수에 있는 버그가 바뀌지 않았다면 (이전 블로그 참조) 결과는 다음과 같습니다.
0.34653 0.65347 0.34632 0.65368 0.18838 0.81162 0.28590 0.71410
predict 함수에 있는 버그가 현재 작성한 대로 수정되면 실행 결과는 다음과 같습니다.
0.99194 0.00806 0.99194 0.00806 0.00853 0.99147 0.00853 0.99147
뒤에 있는 이 조의 수가 좀 더 보기 좋다. 어쨌든 두 종류의 차이는 더욱 벌어졌다.
그러나 원본 프로그램을 실행할 때 버그가 발생하고 윈도우즈에 세그먼트 오류가 발생하면 메모리를 쓸 때test 를 예상할 수 있습니다sda 함수의 호출 창고가 파괴되었습니다.당분간 어딘지 못 찾았어요.

좋은 웹페이지 즐겨찾기