오늘 하루 배운점 또는 해본것을 기록하고, 느낀점에 대해 간단히 정리 하려고 한다. 

화이팅!

728x90

((유의)) 직접 검색해서 이해한 내용만 정리한 것이므로 틀린 부분이 있을 수 있습니다! (지적해주시면 감사하겠습니다.)

 

모델의 하이퍼파라미터를 최적화 하려면, 보통 데이터 엔지니어의 직관 또는 최적화 라이브러리를 사용한다고 한다. 

(직관이라니.)

 

케라스를 이용하여 데이터를 학습 및 예측 하다가 학습률, 감쇄율, 배치사이즈 등의 파라미터를 로또 번호맞추는 느낌으로 맞추고 있는 나자신을 발견하고, 하이퍼파라미터 최적화 라이브러리를 찾아봤다. 

 

Keras + Hyperopt: A very simple wrapper for convenient hyperparameter optimization 라고 소개되어 있다. 

(readme.md 부터 예시가 아주 친절하다.)

https://github.com/maxpumperla/hyperas

 

maxpumperla/hyperas

Keras + Hyperopt: A very simple wrapper for convenient hyperparameter optimization - maxpumperla/hyperas

github.com

 

여기서도 다운로드 가능하다.

http://maxpumperla.com/hyperas/

 

Hyperas by maxpumperla

Hyperas A very simple convenience wrapper around hyperopt for fast prototyping with keras models. Hyperas lets you use the power of hyperopt without having to learn the syntax of it. Instead, just define your keras model as you are used to, but use a simpl

maxpumperla.com


hyperas의 구조

data() : 데이터를 읽어오고 전처리하여 입력과 출력을 리턴한다. (학습용 입출력, 검증용 입출력 총 4개를 리턴)

model() : 모델 구조와 하이퍼파라미터를 지정하고 학습한다. 

optim.minimize() : data()와 model()을 반복 수행하여 최적의 파라미터를 알려준다. max_evals로 시도 횟수를 지정할 수 있다. 

 

hyperas의 동작 흐름

main함수에서 optim.minimize() 의 Trials()가 실행되어 data()와 model()이 반복적으로 수행된다. 

 

사용법 

기존 프로젝트에 hyperas의 함수들을 끼워넣어 시험하려고 했었지만 실패했다. (ㅠㅠ...)

main함수, data(), model()만 있는 테스트 모듈을 따로 만들어서 시험하니까 동작했다. 

hyperas에서 파라미터 시험을 위해 uniform() 과 choice()를 제공한다. 

 

 

시험하려는 값들의 리스트를 choice 함수 안에 입력할 수 있다. 

{{ 를 이용하는 것이 특이하다. 

배치사이즈의 경우, 결과값은 batch_size = 0 이런식인데, 리스트의 인덱스가 리턴된다고 보면 된다.

위 코드의 경우, best batch_size는 1440이다. 

 

 

또는 시험하려는 수치 범위를 uniform 내에 입력할 수 있다. 

0에서 1 사이의 값에서 시도해보자는 뜻이다. 

 

실행해보면,  {{ 로 감싸진 부분들이 def get_space() 의 변수로 들어가는 것을 콘솔에서 확인할 수 있다. 

 

위의 변수를 통해 최종 결과로 무엇이 나올 지 미리 알수 있다. 

 

 

새롭게 알게된 내용이 있으면 추가해 놓을 예정이다. 

 


혹시 도움이 되었다면 하트를 눌러주세요!

 

글 내용에 관한 의견은 댓글로 주시면 감사하겠습니다 :)

728x90

스톤헨지 커플링

 

 

구입장소 : 신도림 디큐브 현대백화점 스톤헨지

 

구입일 : 2018년 11월 

 

 

상세 샷을 올려봅니다. 

 

 

 

 

 

 

 

 

 

 

둘 다 로즈골드로 했습니다. (남 녀 골드/실버 이런식으로 다르게도 가능합니다.)

 

디자인은 마음에 쏙 들었지만, 가격이 부담스러워서 고민했더니 직원분이 조금 할인해주셨습니다. 

 

남자 여자 2개 합쳐서 총 69만원. (남자 반지가 여자꺼보다 커서 더 비쌌어요)

 

 

친구들 반응도 정말 좋고, 다른 악세사리 가게 가서도 직원분들한테 예쁘다는 말 많이 들었어요. 

 

저랑 남자친구도 디자인에 만족했습니다. 

 

 

아래는 제품 링크에요!

 

스톤헨지 커플링 Female 링크

스톤헨지 커플링 Male 링크

 

 

 

 

 

 

728x90

세인트스코트 빅토리아 탑핸들 토트백 




네이버 쇼핑에서 87710원에 구매했습니다. (무료배송) 링크


길이가 다른 끈 2개를 달아서 쓸 수 있는 것이 좋았고, 크기가 제가 원하는 앙증맞은(?) 것이라서 구매했습니다.


가방 무게가 생각보다 가볍습니다. 디자인은 제 취향이고, 이 가격에 이 정도 퀄리티면 만족스럽습니다. 


단점은 가방 뒷쪽 주머니가 크게 벌어지지 않고 얕은 편입니다. 


상세 샷을 찍어서 올려봅니다. 








728x90

도전 프로그래밍2 - 5번문제

 

 

배열에 저장되어 있는 요소들을 내림차순으로 정렬하는 함수 DesSort를 정의하자. 

그리고 이 함수를 호출하는 예제를 작성해보자.

 

일단 길이가 7인 int형 배열을 선언해서 프로그램 사용자로부터 7개의 정수를 입력 받도록 하자. 

 

그리고 입력 받은 정수를 내림차순으로 정렬하기 위해서, 배열을 인자로 전달하면서 DesSort 함수를 호출하고,

제대로 정렬이 되었는지 확인하기 위해 배열의 요소들을 순서대로 출력해보자. 

#include <stdio.h>
/*
도전 프로그래밍2 - 열혈C 333pg
*/

void DesSort(int *arr);
void Print(int *arr);

int target[7];
int len = sizeof(target) / sizeof(int);		//len==7

void DesSort(int *arr)
{
	int temp, i, j;
	for (j = 0; j < len - 1; j++)
	{
		for (i = 0; i < len - 1; i++)
		{
			if (arr[i] < arr[i + 1])
			{	//자리교환 
				temp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = temp;
			}
		}
	}
}
void Print(int *arr)
{
	int i = 0;
	for (i; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{

	int i;
	//정수 7개 입력받기 
	for (i = 0; i < 7; i++)
	{
		scanf("%d", &target[i]);
	}

	DesSort(target);
	Print(target);
	return 0;
}

 

728x90

도전 프로그래밍2 - 3번문제

 

 

길이가 10인 배열을 선언하고 총 10개의 정수를 입력받는다. 

단, 입력 받은 숫자가 홀수이면 배열의 앞에서부터 채워나가고, 짝수이면 뒤에서부터 채워나가는 형식을 취하기로 하자. 

 

따라서 사용자가 [1,2,3,4,5,6,7,8,9,10]을 입력했다면, 

배열에는 [1,3,5,7,9,10,8,6,4,2]의 순으로 저장이 되어야 한다. 

 

#include <stdio.h>
/*
도전 프로그래밍2 - 열혈C 329pg
*/

int main()
{
	int arr[10];
	int i;
	int result[10] = { 0, };
	
	//10개 입력받기 
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}

	//홀수는 result의 앞 부터 저장 
	for (i = 0; i < 10; i++)
	{
		if (arr[i] % 2 == 1) 
		{
			result[i] = arr[i];
			printf("%d ", result[i]);
		}
	}
	//짝수는 result의 뒤 부터 저장 
	for (i = 9; i >=0; i--)
	{
		if (arr[i] % 2 == 0) 
		{
			result[i] = arr[i];
			printf("%d ", result[i]);
		}
	}
	return 0;
}

 

728x90

도전 프로그래밍2 - 2번문제

 

윤성우 열혈C 328pg문제. 

프로그램 사용자로부터 10진수 형태로 정수를 하나 입력 받은 다음, 이를 2진수로 변환해서 출력하는 프로그램을 작성해보자. 

 

#include <stdio.h>

/*
도전 프로그래밍2 - 열혈C 328pg
*/

int Conversion(int input, int *result)
{
	int size=0;
	while (input != 0)
	{
		result[size] = input % 2;
		input = input / 2;
		size++;
	}
	return size;
}

void Print(int *result, int size)
{
	while (size >= 0)
	{
		printf("%d", result[size]);
		size--;
	}
}

int main()
{
	int input = 0;
	int size = 0;
	int result[100];

	printf("10진수 정수 입력:");
	scanf("%d", &input);
	
	size = Conversion(input, result);
	Print(result, size-1);
	return 0;
}

 

728x90

삽입 정렬(Insertion Sort)

배열 인덱스 [1]번부터 자기 앞의 숫자와 값의 비교를 한다. 

#include <stdio.h>

InsertionSort(int *InsertionObject, int length)
{
	int i, j, temp;

	for (i = 1; i < length; i++)       //i=1번째 부터 시작 
	{
		for (j = i; j >0; j--)	//j를 j의 앞의 수들과 비교한다 
		{
			if (InsertionObject[j - 1] > InsertionObject[j])
			{
				//SWAP
				temp = InsertionObject[j - 1];
				InsertionObject[j - 1] = InsertionObject[j];
				InsertionObject[j] = temp;
			}
		}
		//과정출력
		for (int a = 0; a < length; a++)
		{
			printf("%d ", InsertionObject[a]);
		}
		printf("\n");
	}
}

int main()
{
	int InsertionObject[] = { 6, 3, 8, 12, 2, 9, 1, 27 };
	int length = sizeof(InsertionObject) / sizeof(int);
	InsertionSort(InsertionObject, length);
	return 0;
}

 

728x90

선택정렬(Selection Sort)

 

1. 주어진 값들 중에 최소값을 찾는다 

2. 최소값을 맨 앞의 값과 교환한다. 

3. 맨 앞의 값을 뺀 위치에서 1과 2를 반복한다. 

 

#include <stdio.h>

void SelecSort(int *arr, int num)
{
	int i, j;
	int min;
	int temp;

	for (i = 0; i < num - 1; i++)
	{
		//i번째 단계: i번째 원소를 기준으로 n-1개의 원소를 비교하기 시작
		min = i;
		for (j = i + 1; j < num; j++)  	//기준원소부터 시작해 끝원소까지 중에 최소값 찾기 
		{
			if (arr[j] < arr[min])
			{
				min = j;
			}
		}
		//SWAP 
		temp = arr[min];
		arr[min] = arr[i];
		arr[i] = temp;
	}
}

int main()
{
	int arr[7] = { 9, 4, 8, 12, 2, 5, 1 };
	int i;
	SelecSort(arr, sizeof(arr) / sizeof(int));

	printf("정렬 후: ");
	for (i = 0; i < sizeof(arr)/sizeof(int); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

 

다른 방법으로 구현해봤다.

#include <stdio.h>

void SelectionSort(int *arr, int len)
{
	int i, j, temp;
	for (i = 0; i < len-1; i++)
	{
		printf("i: %d \n", i);
		for (j = i + 1; j < len; j++)
		{
			if (arr[i]>arr[j])
			{
				printf("Smallest:%d --> SWAP\n", arr[j]);
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}

		for (int a = 0; a < len; a++)
		{
			printf("%d ", arr[a]);
		}
		printf("\n\n");
	}
}

int main()
{
	int arr[] = { 5, 1, 2, 8, 26, 14 };
	int len = sizeof(arr) / sizeof(int);

	SelectionSort(arr, len);
	/*
	for (int i = 0; i < len; i++)
	{
	printf("%d ", arr[i]);
	}
	*/

	return 0;
}

728x90

이진 탐색 알고리즘을 재귀 함수를 이용하여 다시 구현해본다. 

 

first : 탐색 범위의 시작을 나타냄

last : 탐색 범위의 끝을 나타냄 

mid : 탐색 범위의 중간값을 나타냄 

 

<이진 탐색 알고리즘의 순서>

1. 중간(mid)값이 target이면 반환한다. 

2. target이 아닌 경우, 검색 대상을 반으로 줄인다. (first 또는 last를 갱신)

3. 1과 2를 반복한다. 

 

<재귀함수의 탈출조건 2가지>

1. first가 last보다 커지는 경우 재귀함수를 탈출한다. 

2. target을 찾았다면 재귀함수를 탈출한다. 

 

전체 코드 

#include <stdio.h>

int BSRecursive(int *ar, int first, int last, int target)
{
	int mid;
	if (first > last)
		return -1;		//탐색 실패 

	mid = (first + last) / 2;

	if (target == ar[mid])
		return mid;			//탐색 성공. index 반환.
	else if (ar[mid] > target)
		return BSRecursive(ar, first, mid - 1, target);
	else
		return BSRecursive(ar, mid + 1, last, target);
}

int main()
{
	int ar[] = { 1, 3, 5, 7, 9 };	//이진 검색의 전제는 '정렬된'배열이다.
	int index; 
	int first = 0, last = sizeof(ar) / sizeof(int)-1;

	index = BSRecursive(ar, first, last, 2);	//target = 2인 경우
	if (index == -1)
		printf("탐색 실패!\n");
	else
		printf("index of target : %d\n", index);
	
	index = BSRecursive(ar, first, last, 7);	//target = 7인 경우 
	if (index == -1)
		printf("탐색 실패!\n");
	else
		printf("index of 7 : %d\n", index);

	return 0;
}
728x90

+ Recent posts