StudyServer
web, server, java, spring 등.. 공부한 것을 기록하는 장소 입니다. 공부하면서 정리하였기 때문에 틀린 내용이 있을 수 있습니다. 이야기 해주시면 수정하겠습니다.

텐서플로우(TensorFlow) 아키텍쳐 및 Session

2019-03-16 00:00:00 +0000

https://youtu.be/QNSuzvL6SeA 내용을 정리하였습니다

텐서플로우(TensorFlow) 아키텍쳐

  • 텐서플로우란 대규모 분산 학습 및 추론을 위한 라이브러리
  • 많은 기계학습 모델을 제공
  • 크로스 플랫폼 라이브러리(C API가 아래에 존재하고 그 위에 다양한 프로그래밍 언어를 이용해 소스코드 작성 가능)
  • 클라이언트는 컴퓨터 연산 과정을 데이터 플로우 그래프 형태로 표현
  • Session을 이용해 한번의 그래프 실행 시작을 알릴 수 있음
  • 분산된 마스터는 부분 그래프를 정리
  • 작업자 서비스에 전달하기 전 그래프 조각으로 분리하고 분배함. 초기화
  • 작업자 서비스는 하드웨어에게 커널 기능을 이용하는 그래프 작업의 실행을 관리
  • 커널 기능은 개별적인 그래프 작업 처리

텐서플로우(TensorFlow) Session

  • 아래 코드 실행 시 결과는 Tensor(“Add:0”, shape=(), dtype=float32)
  • 텐서플로우의 기본 실행 단위는 텐서이기 때문이다.
  • 일종의 다차원 배열의 객체, 식이라고 볼 수 있음
  • constant 및 add는 그래프를 작성한 것이지 연산한 것이 아님
  • session은 텐서 데이터를 넣어서 데이터 흐름이 이루어지도록 만드는 것
import tensorflow as tf
a = tf.constant(2.2)
b = tf.constant(4.2)
c = tf.add(a,b)
print(c)

# 실제 연산
sess = tf.Session()
sess.run(c)

텐서플로우(TensorFlow)상수, 변수, 함수

2019-03-16 00:00:00 +0000
  • https://youtu.be/JbrBKPm1QEo 의 내용을 요약하였습니다

텐서플로우(Tensorflow) 변수와 상수

  • jupyter notebook 명령어로 GUI 환경에서 실습
  • constant는 하나의 자료형을 반환
  • session은 하나의 연산식을 실행시키는 객체
a = tf.constant(1)
b = tf.constant(2)
c = tf.add(a, b)
sess = tf.Session()
sess.run(c)
  • 만약 그냥 c를 출력하면 Tensor 정보만 나온다. 왜냐하면 c는 Tesor 자료형일 뿐이기 때문이다.
print(c)

결과
Tensor("Add:0", shape=(), dtype=int32)
  • 변수는 상수와 달리 Variable 함수를 사용한다
import tensorflow as tf
a = tf.Variable(5)
b = tf.Variable(3)
c = tf.multiply(a, b)
init= tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
sess.run(c)
  • 변수이므로 다른 값을 넣을 수 있다
  • 이 때 sess를 global_variables_initializer로 초기화 해줘야 한다
a = tf.Variable(15)
c = tf.multiply(a, b)
init = tf.global_variables_initializer()
sess.run(init)
sess.run(c)

텐서플로우(Tensorflow) 플레이스 홀더(Placeholder)

  • 학습 데이터를 포함하는 변수
  • 다른 텐서를 할당하기 위해 사용
  • 실제로 값을 할당할 때는 피딩을 수행
  • 텐서 자체가 다차원 배열과 같은 형태를 가지고 있어 플레이스 홀더로 사용할 값 또한 배열이 들어갈 수 있음
  • 사용법
tf.placeholder(dtype, shape, name)
  • dtype : 플레이스 홀더에 저장되는 자료형
  • shape : 배열의 차원
  • name : 플레이스 홀더의 이름
import tensorflow as tf
mathScore = [85, 99, 84, 97, 92]
englishScore = [59, 80, 84, 68, 77]
a = tf.placeholder(dtype=tf.float32)
b = tf.placeholder(dtype=tf.float32)
y = (a+b)/2
sess = tf.Session()
sess.run(y, feed_dict={a:mathScore, b:englishScore})

결과
array([72. , 89.5, 84. , 82.5, 84.5], dtype=float32)

텐서플로우(TensorFlow) 주요 함수

함수 설명
tf.add 덧셈을 수행
tf.subtract 뺄셈을 수행
tf.multiply 곱셈을 수행
tf.truediv 나눗셈의 몫을 구함
tf.mod 나눗셈의 나머지를 구함
tf.abs 절대값을 구함
tf.negative 음수를 반환
tf.sign 부호를 반환(음수:-1 양수:1 0:0)
tf.srquare 제곱을 수행
tf.sqrt 제곱근을 반환
tf.pow 거듭제곱을 수행
tf.maximum 더 큰 값을 반환
tf.minimum 더 작은 값을 반환
tf.exp 지수 값을 계산
tf.log 로그 값을 계산
  • Sorcecode
import tensorflow as tf
a = tf.constant(3)
b = tf.constant(5)
sess = tf.Session()
# 덧셈
c = tf.add(a,b)
sess.run(c)

# 뺄셈
c = tf.subtract(a,b)
sess.run(c)

# 곱셈
c = tf.multiply(a, b)
sess.run(c)

# 나눗셈 몫
c = tf.truediv(a, b)
sess.run(c)

# 나머지
c = tf.mod(b, a)
sess.run(c)

# 절대값
c = tf.abs(-a)
sess.run(c)

a = tf.constant(17.5)
b = tf.constant(5.0)

# 음수 반환
c = tf.negative(a)
sess.run(c)

# 부호 반환
c = tf.sign(a)
sess.run(-c)

# 제곱 함수
c = tf.square(a)
sess.run(c)

# 거듭 제곱, 너무 큰 값은 못구한다고 뜸
c = tf.pow(b, 2)
sess.run(c)

# 더 큰 값 확인
c = tf.maximum(a, b)
sess.run(c)

# 더 작은 값
c = tf.minimum(a, b)
sess.run(c)

# 지수 값
c = tf.exp(b)
sess.run(c)

머신러닝 기초

2019-03-15 00:00:00 +0000

파이썬 텐서플로우 및 머신러닝

  • https://www.youtube.com/watch?v=YK9PNTJ_aFA 머신러닝 내용 정리

파이썬 설치

  • 구글에 python release for windows 검색
  • 3.6.2버전 x86-64 executable 다운받고 Add Python 3.6 to PATH 체크해서 Path에 파이썬 추가
  • 명령 프롬프트 열고 pip3 install tensorflow
  • 아래 에러 발생 시 python -m을 붙인 명령어 실행
  • No module named pip3 라는 에러가 뜨면 pip 사용
Fatal error in launcher: Unable to create process using '"c:\users\wori\appdata\local\programs\python\python37-32\python.exe"  "C:\Users\wori\AppData\Local\Programs\Python\Python37-32\Scripts\pip3.exe" install tensorflow'
  • python idle로 들어가서 메뉴에서 file-new 선택
  • hello world 출력. 메뉴에서 Run-Run Module
import tensorflow as tf
hello = tf.constant('Hello World!')
sess = tf.Session()
print(sess.run(hello))
  • 출력 결과. b는 byte 문자형이라는 뜻
b'Hello World!'

선형 회귀

  • 변수 사이의 선형적인 관계(직선적)를 모델링한 것
  • 일을 할 수록 매출이 올라간다. 그래프를 그려보면 직선이다. 이것을 직선적인 관계라고 한다, 일상에 많은 현상들이 선형적
  • 이러한 선형적인 관계에 적용하는 대표적인 기계 학습 이론이 선형 회귀
  • 학습을 시킨다 => 주어진 데이터를 학습시켜서 가장 합리적인 ‘직선’을 찾아낸 것. 데이터 3개 이상일 때 의미가 있음
  • H(x) = Wx + b
  • 하나의 일차 방정식을 이용해 직선을 표현.(W는 기울기 b는 절편)
  • 가설을 수정해 나가면서 ‘그나마’ 가장 합리적인 식을 찾아냄
  • 즉 선형 회귀란 주어진 데이터를 이용해 일차 방정식을 수정해 나가는 것

비용

  • 가설이 얼마나 정확한 지 판단하는 기준
  • 비용 함수 (예측 값 - 실제 값)2의 평균
  • 현재의 W, b 값과 데이터를 이용하면 비용 함수를 구할 수 있음. 비용이 적을 수록 좋다.(음수값 x)

경사하강

  • 경사 하강을 이용해 합리적인 식을 도출
  • H(x) = Wx
  • 비용 함수는 (Wx - y)2
  • 그래프를 그려보면 경사를 타고 내려갔다가 다시 올라가는 곡선이 그려짐. x축을 W라고 생각하면 됨
  • 미분은 기울기를 구하기 위해 사용하는 개념. 수평일수록 좋은 식
  • 텐서플로우는 경사 하강 라이브러리 제공

한글 리스트 오름차순, 내림차순

2019-03-12 00:00:00 +0000

한글 문자열 오름차순, 내림차순 정렬

  • Arrays.sort를 이용하여 오름차순 정렬
  • 오름차순 된 배열을 리스트로 변경 후 Collections.reverse 함수로 내림차순 정렬
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Test {

	public static void main(String[] args) {
		// 문자열 배열 정렬(가나다 순으로 소탕)
		String s[] = {"오렌지", "키위", "바나나", "메론", "가나"};
		Arrays.sort(s);	// 오름차순
				
		System.out.println("**** 오름차순 ****");
		for(int i = 0; i < s.length; ++i) {
			System.out.println(s[i]);
		}
		
		// 배열을 List로 변환
		List<String> list = Arrays.asList(s);
			
		// 리스트 뒤집어 주기
		Collections.reverse(list);

		System.out.println("**** 내림차순 ****");
		for(int i = 0; i < s.length; ++i) {
			System.out.println(s[i]);
		}
		
	}
}

연속된 글자의 갯수 출력

2019-03-11 00:00:00 +0000

문제

연속된 글자의 갯수 출력 제시된 글자 String str = “aabbcccd”;

출력 a2b2c3d1

Source


public class main {

	public static void main(String[] args) {
		String str = "aabbcccd";
		int size = str.length();
		String save = "";
		char current = str.charAt(0);
		int currentCount = 0;
		for(int i = 0; i < size; ++i) {
			if(current == str.charAt(i)) {
				++currentCount;
			
			}else {
				// 같지 않으면 출력
				save += current;
				save += currentCount;
				
				if(i + 1 >= size) {
					current = str.charAt(i);	
				}else {
					current = str.charAt(i+1);
				}
				currentCount = 1;
			}
		}
		
		save += current;
		save += currentCount;
		// 마지막에 출력
		System.out.println(save);
	}
}

Posts

subscribe via RSS