Quiet Time

 
5 . 복수행 함수
    • 5 목차
    • max, min, avg, sum, count 함수
    • 그룹함수에서의 null 값의 의미
    • having
    • 그룹함수를 중첩하는 방법
 
    • max 함수
: 최대값을 출력하는 함수
 
문제 101. 최대 월급을 출력하시오 !
SELECT MAX(sal) FROM EMP;
 
문제102. 직업이 SALESMAN 사원들중에서의 최대월급을 출력하시오
SELECT MAX(sal) FROM EMP WHERE JOB = 'SALESMAN'
 
 
문제103. SK 텔레콤 사용 학생중 최대 나이를 출력하시오
SELECT  MAX(age)
FROM EMP2
WHERE TELECOM = 'sk';
 
3 SELECT telecom  MAX(age)
1 FROM EMP2
2 WHERE TELECOM = 'sk';
telecom 여러개 나오려고 하고 max 하나만 나오려고하니까 에러남
 
4 SELECT  telecom, MAX(age)
1 FROM EMP2
2 WHERE TELECOM = 'sk'
3 GROUP BY telecom;
 
    • group by 역할 : 데이터를 grouping 하는 역할
    • select
    • from
    • where group by
 
 
문제104. 부서번호, 부서번호별 최대월급을 출력하시오!
SELECT  deptno, MAX(sal)
FROM EMP
GROUP BY deptno;
 
문제105. 전공, 전공별 최대나이를 출력하시오
SELECT major, MAX(age)
FROM EMP2
GROUP BY major;
 
문제106. 성씨별 최대나이를 출력하시오
SELECT substr(ename,1,1), MAX(age)
FROM EMP2
GROUP BY  substr(ename,1,1);
 
문제107. 위의 결과를 다시 출력하는데 나이가 높은 성부터 출력되게 하시오
SELECT substr(ename,1,1), MAX(age) 나이
FROM EMP2
GROUP BY  substr(ename,1,1)
ORDER BY  나이 desc;
 
문제108. 서울시 물가 데이터를 오라클 database 입력하시오 !
 
문제109. a_price (가격)
서울시 물가 데이터중 최대 가격을 출력하시오!!
 
SELECT MAX(a_price) FROM price;
 
 
    • min 함수
: 최소값을 출력하는 함수
 
 
 
 
문제 110. 사원테이블에서 최소 월급을 출력하시오
SELECT MIN(sal) FROM EMP;
문제111. 직업, 직업별 최소월급을 출력하시오!
 
SELECT job, MIN(sal)
FROM EMP
GROUP BY job;
 
문제112. 위의 결과를 다시 출력하는데 직업이 null
출력 안되게 하시오
 
SELECT job, MIN(sal)
FROM EMP
WHERE job IS NOT null
GROUP BY job;
 
문제113. 위의 결과를 다시 출력하는데 최소 월급이 높은 것부터 출력하시오
SELECT job, MIN(sal)
FROM EMP
WHERE job IS NOT null
GROUP BY job
ORDER BY min(sal) desc;
 
문제114. 사원 테이블에 가장 먼저 입사한 사원의 입사일을 출력하시오
select min(hiredate)
from emp;
 
문제115. 전공 , 전공별 최소나이를 출력하는데 컴공은 제외하고 출력하시오
select major, min(age)
  from emp2
 where major <> '컴퓨터공학'
group by major;
 
문제116. 주소, 주소별 최소나이를 출력하시오
select substr(address,1,7), min(age)
from emp2
group by substr(address,1,7);
 
    • count 함수 : 건수를 세는 함수
문제117. 사원 테이블의 전체 건수를 출력하시오
 
select count(empno)
from emp;
 
select count(*)
 from emp;
 
문제118. 커미션을 count하시오
select count(comm)
from emp;
 
 
문제119. 직업이 SALESMAN 사원들이 몇명이 잇는가
 
SELECT COUNT(*)
FROM EMP
WHERE job = 'SALESMAN';
 
문제120. 직업이 ANALYST 사원들은 몇명이 있는가?
 
SELECT COUNT(*)
FROM EMP
WHERE JOB='ANALYST';
 
GROUP 함수는 NULL 값을 무시한다!!
 
문제121. 직업 , 직업별 인원수를 출력하시오
SELECT JOB, COUNT(*)
FROM EMP;
 
 
문제122. 전공, 전공별 인원수를 출력하시오
SELECT MAJOR, COUNT(*)
FROM EMP2
GROUP BY MAJOR
문네123. 위의 결과를 다시 출력하는데 전공별 인원수가 높은 부터
SELECT MAJOR, COUNT(*)
FROM EMP2
GROUP BY MAJOR
ORDER BY COUNT(*) DESC;
 
문제124. 지역, 지역별 인원수를 출력하시오
 
 
SELECT SUBSTR(ADDRESS,1,7), COUNT(*)
FROM EMP2
GROUP BY SUBSTR(ADDRESS,1,7)
ORDER BY COUNT(*) DESC;
 
 
*avg 함수
: 평균값을 출력하는 함수
문제125. 사원 테이블에 월급을 평균내시오
 
select avg(sal)
  from emp
 ;
 
 
문제126. 우리반 평균나이를 구하세요
 
select avg(age)
  from emp2;
 
문제127. 통신사 , 통신사별 평균나이를 구하시오
 
SELECT telecom, AVG(age)
FROM EMP2
GROUP BY telecom;
 
문제128. (점심시간 문제)
 
이메일 도메인 , 이메일 도메인 인우너수를 출력하느데
이메일 도메인별 인원수가 높은것 부터 출력하고
컬럼명을 아래 같이 이메일 도메인 , 인원수로 출력되게 하시오
 
SELECT  substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1) AS "이메일 도메인" , count(*) as "인원수"
from emp2
group by substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1);
 
문제129. 커미션의 평균값을 출력하시오
 
select avg(comm)
from emp;
 
※그룹함수는 null 값을 무시하기 때문에 comm 다해서 4 나눈값이다.
 
문제130. 위의 결과를 다시 출력하는데 전체 사원수로 나눠지게 하려면 어떻게
해야하는가.
 
select avg(nvl(comm,0) )
   from emp;
 
5.2 그룹함수에서 null값의 의미
 
" group 함수는 null 값을 무시한다."
예제1: 값이 달라지는 경우
 
select avg(comm) from emp;
select avg(nvl(comm,0)) from emp;
 
 
예제2:
 
select sum(comm) form emp;
select sum(nvl(comm,0)) from emp;
결과는 같으나 어떤 SQL 성능이 좋을까?
값을 무시하지 않고 0으로 바꿔서 연산하는 밑에 연산이 비효율적이다.
 
    • group 함수의 특징 2가지
      1. group 함수는 null값을 무시한다.
      2. group 함수는 결과를 항상 출력한다.

문제131. 이름과 월급과 직업을 출력하는데 월급이 높은 사원부터 출력하시오
select ename, sal, job
from emp
order by sal desc;
 
문제132. 월급을 출력하는데 decode 이용해서 직어빙 president null 나오게 하고  다른 직업이면 월급이 출력되게 하시오
 
select decode( job, 'PRESIDENT', ''
,sal)
from emp;
 

그런데 !!
 

 
 
SELECT MAX(decode(job,'PRESIDENT', NULL,sal))
      1           2                  3        4
from emp;
decode 문에서 세번째 인자값의 데이터 유형에 네이번째 인자값의 데이터 유형이 결정된다.
 
null 데이터 유형이 문자형이다.
 
select to_char(sal)
from emp;
 
문자로 하면 9 큰값이기 때문에

 
SELECT MAX(decode(job,'PRESIDENT', 0,sal))
 
from emp;
으로 쓰는게 좋아용
 
*sum 함수
: 값을 더하는 함수
문제 133. 우리반의 나이를 더하면 얼마인가?
 
select sum(age)
  from emp2;
 
 
문제134. 직업, 직업별 토탈 월급을 출력하시오
 
select job, sum(sal)
 from emp
group by job;
 
문제135. 직업과 직업별 토탈월급을 출력하는데 SALESMAN 제외하고 출력하시오
4 select job, sum(sal)
1 from emp
2 where job <> 'SALESMAN'
3 group by job;
 
문제 135. 결과를 출력하는데 직업별 토탈월급이 6000 이상인것만 나오게 하시오
 
 
Group 함수로 조건을 사용하는 절은 where 절이 아니라 having 절을 사용해야 한다.
 
5  select job, sum(sal)
1 from emp
2 where  job <> 'SALESMAN'
3 group by job
4 HAVING SUM(sal) >= 6000;
이렇게 하세요
having 절은 group by 다음에 나와야 해요
 
 
 
select 문의 6가지절
 
5 select        --- 컬럼명
1  from        --- 테이블명
2  where      --- 검색조건
3 group by   --- grouping 컬럼
4 having       --- group 함수로 조건을
5 order by   ---- 데이터를 정렬하는
 
문제137. 통신사, 통신사별 인원수를 출력하는데
통신사가 sk 제외하고 출력하고
통신사별 인원수가 6명이상인 것만 출력하시오
 
 
 
데이터 게시판 : 6 범죄원인
 
 
문제138. 범죄유형에는 무엇이 있는지 조회하시오 !
(중복제거해서 표기하시오 )
SELECT DISTINCT crime_type
  FROM crime_cause2;
 
문제139. 범죄 원인은 무엇이 있는지 조회하시오 .
SELECT distinct term  FROM crime_cause2;
 
 
 
문제140. 범죄유형, 범죄유형별 건수를 출력하시오!
 
SELECT crime_type, SUM(cnt)
  from crime_cause2
  GROUP BY crime_type;
 
 
문제141. 위결과에서 건수 합계가 높은것 부터출력
SELECT crime_type, SUM(cnt)
  from crime_cause2
  GROUP BY crime_type
  ORDER BY SUM(cnt) desc;
 
문제142. 위의 결과에서 단위가 1000단위가 표시되게 하시오
 
SELECT crime_type, TO_CHAR(SUM(cnt),'999,999')
  from crime_cause2
  GROUP BY crime_type
  ORDER BY SUM(cnt) desc;
 
 
5.4 그룹함수를 중첩하는 방법
문제143. 직업, 직업별 토탈월급을 출력하시오 !
select job, sum(sal)
  from emp
 group by job;
 
문제144. 위의 결과중에 최대 값을 출력하시오.
  select MAX(sum(sal))
  from emp
 group by job;
 
문제145. 통신사중 가장 많은 인원수인 통신사의 인원수가 몇명인지 출력하라
 
 
 SELECT MAX(COUNT(*))
 FROM EMP2
 GROUP BY telecom;
 
 
 
문제146. 직업, 직업별 토탈월급을 출력하는데 직업이 SALESMAN은 제외하고
출력하고 직업별 토탈 월급이 4000이상인 것만 출력하고
직업별 토탈 월급을 높은 부터 출력하는데
직업별 토탈월급에 천단위를 부여하라.
 
 
 SELECT job, TO_CHAR(SUM(sal),'999,999')
   FROM EMP
  WHERE job <> 'SALESMAN'
  GROUP BY job
  HAVING SUM(sal) >= 4000
  ORDER BY SUM(sal) DESC;
 
 
 
 
 
 SELECT job, TO_CHAR(SUM(sal),'999,999')
   FROM EMP
 
  GROUP BY job
  HAVING SUM(sal) >= 5000 AND job <> 'SALESMAN'
  ORDER BY SUM(sal) DESC;
성능이 좋지 않음 SQL 인덱스를 사용하지 못함
 
 
 SELECT job, TO_CHAR(SUM(sal),'999,999') aaa
   FROM EMP
 
  GROUP BY job
  HAVING SUM(sal) >= 5000 AND job <> 'SALESMAN'
  ORDER BY aaa DESC;
해도 문자 순으로 구별하는게 아니라 숫자로 정렬해줌
 
문제 147. 직업, 직업별  부서번호별 토탈 월급을 출력하시오
select job,deptno, sum(sal)
  from emp
 group by job;
 
문제148. 통신사별 , 전공별, 인원수를 출력하시오!
  select telecom, major, count(*)
 from emp2
group by telecom, major
ORDER BY telecom , major;
 
 
 
결과를 가로로 출력하는 방법
 
문제 149. 부서번호, 부서번호별 토탈월급을 출력하시오
  select deptno, sum(sal)
  from emp
 group by deptno;
 

 이거를
 
-가로 :
 
10
20
30      
8750
10875
9400
가로로 나오게 케로로하라
 
 
힌트
 
 select ( decode(dettno, 10,sal ,0) as "10"
 from emp;
 
 
 
 
 
정답:
 
 select SUM(decode(deptno, 10,sal ,0)) AS "10",
                 SUM(decode(deptno, 20,sal ,0)) AS "20",
                 SUM(decode(deptno, 30,sal ,0)) AS "30"
   from emp;
 
 

 
 
 
삼성 sql 악성 SQL입니당!
 
 
문제150 통신사, 통신사별 인원수를 세로, 가로로 출력하시오
-세로
 
 SELECT telecom, COUNT(*)
 FroM EMP2
 GROUP BY telecom;
 
 
 
-가로
(카운트는 Null 무시함)
SELECT COUNT(DECODE(telecom, 'sk',telecom,null)) AS "sk",
         COUNT(DECODE(telecom, 'lg',telecom,null)) AS "lg",
             COUNT(DECODE(telecom, 'kt',telecom,null)) AS "kt"
                 
 from EMP2;
 
 
 SELECT sum(DECODE(telecom, 'sk',1,0)) AS "sk",
         sum(DECODE(telecom, 'lg',1,0)) AS "lg",
              sum(DECODE(telecom, 'kt',1,0)) AS "kt"
                 
 from EMP2;
 
 
 SELECT sum(DECODE(telecom, 'sk',1,null)) AS "sk",
         sum(DECODE(telecom, 'lg',1,null)) AS "lg",
              sum(DECODE(telecom, 'kt',1,null)) AS "kt"
                 
 from EMP2;
 
널로 바꾸면 빨라짐
 
 
 
 
문제151. 나이 , 나이별 인원수를 출력하는데 세로, 가로로 출력하시오
-세로
 SELECT age, COUNT(*)
   FROM EMP2
  GROUP BY age
  ORDER BY age desc;
 
 
 
-가로
  SELECT SUM(DECODE(age,24,1,null)) AS "24",
   SUM(DECODE(age,25,1,null)) AS "25",
   SUM(DECODE(age,26,1,null)) AS "26",
   SUM(DECODE(age,27,1,null)) AS "27",
   SUM(DECODE(age,28,1,null)) AS "28",
   SUM(DECODE(age,29,1,null)) AS "29",
   SUM(DECODE(age,30,1,null)) AS "30",
   SUM(DECODE(age,31,1,null)) AS "31",
   SUM(DECODE(age,33,1,null)) AS "33",
   SUM(DECODE(age,35,1,null)) AS "35"
  FROM EMP2;
 
 
문제152. 위의 결과에서 전공도 같이 출력하시오!
  SELECT major, SUM(DECODE(age,24,1,null)) AS "24",
   SUM(DECODE(age,25,1,null)) AS "25",
   SUM(DECODE(age,26,1,null)) AS "26",
   SUM(DECODE(age,27,1,null)) AS "27",
   SUM(DECODE(age,28,1,null)) AS "28",
   SUM(DECODE(age,29,1,null)) AS "29",
   SUM(DECODE(age,30,1,null)) AS "30",
   SUM(DECODE(age,31,1,null)) AS "31",
   SUM(DECODE(age,33,1,null)) AS "33",
   SUM(DECODE(age,35,1,null)) AS "35"
  FROM EMP2
group by major;
 
 
문제153. (오늘의 마지막 문제!)메일 도메인 , 전공별 인원수를 출력하시오
가로로 이쁘게
SELECT  substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1) AS "이메일 도메인" , 
SUM(DECODE(major,'산업경영공학',1,null)) AS "산업경영공학",
SUM(DECODE(major,'미술경영학',1,null)) AS "미술경영학",
SUM(DECODE(major,'경영정보학',1,null)) AS "경영정보학",
SUM(DECODE(major,'신문방송학',1,null)) AS "신문방송학",
SUM(DECODE(major,'정보통신공학',1,null)) AS "정보통신공학",
SUM(DECODE(major,'경영학',1,null)) AS "경영학",
SUM(DECODE(major,'컴퓨터공학',1,null)) AS "컴퓨터공학",
SUM(DECODE(major,'응용수학',1,null)) AS "응용수학",
SUM(DECODE(major,'관광학',1,null)) AS "관광학",
SUM(DECODE(major,'행정학',1,null)) AS "행정학",
SUM(DECODE(major,'경제학',1,null)) AS "경제학",
SUM(DECODE(major,'산업심리학',1,null)) AS "산업심리학",
SUM(DECODE(major,'전자공학',1,null)) AS "전자공학",
SUM(DECODE(major,'글로벌금융학',1,null)) AS "글로벌금융학",
SUM(DECODE(major,'통계학',1,null)) AS "통계학",
SUM(DECODE(major,'정보통계학',1,null)) AS "정보통계학",
SUM(DECODE(major,'물리학',1,null)) AS "물리학",

from emp2
group by substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1);
 
은총이문제 학과별 이메일 도메인(갯수) 나타내어라
컴퓨터공학과
 naver(3), gmail(1)
응용수학
gmail(1)
 
 
select major , substr(email,instr(email,'@')+1,instr(email,'.') - instr(email,'@')-1)
from emp2
group major;
 

딥러닝 5장 .

딥러닝2017. 7. 26. 10:52
NCS 시험문제 2번

import numpy as np

x = np.random.rand(100, 784)

def softmax(x):
    if x.ndim == 2:
        x = x.T
        print(np.max(x,axis=0))
        x = x - np.max(x, axis=0)


    return x.T


x2 = softmax(x)
print(x2.shape)

print(sum(x[0]))
print(sum(x2[0]))





■ 4장. 신경망 학습

* 4장 목차

   1. 신경망의 학습이 무엇인지?
   2. 비용함수(손실함수) 2가지
      -평균 제곱 오차
      - 교차 엔트로피 오차
   3. 미니 배치 학습
   4. 수치 미분
   5. 편미분
   6. 기울기
   7. 경사하강법
   8. 신경망에서의 기울기
   9. 학습 신경망 구현하기



■ 4. 수치미분

진정한 미분은 컴퓨터로 구현하기 어렵기 때문에
중앙 차분 오차가 발생하지만 컴퓨터로 미분을 구현하기 위해서
수치미분을 사용해야한다.



p 123(수치 미분 공식)

   f(x+h) - f(x-h)
   ---------------
      2*h

h = 0.0001 ( 0을 4개)



문제 74. 아래의 함수를 미분해서 x = 3 에서의 미분계수를 구하시오 !

y = x^2 + 4^2


def samplefun1(x):
    return x **2 + 4**2

def numericalDiff(f,x):
    h = 0.0001
    return(f(x+h) - f(x-h)) / (2*h)

print (numericalDiff(samplefun1, 3) )

결과 :

6.00000000000378

■ 미분한 함수를 x =4 로 했을때는

def samplefun1(x):
    return x **2 + 4**2

def numericalDiff(f,x):
    h = 0.0001
    return(f(x+h) - f(x-h)) / (2*h)

print (numericalDiff(samplefun1, 4) )

결과 :

7.999999999999119
---------------------------
중앙 차분 오차 ---> 진정한 미분이 아니라 수치미분이기 때문에
            중앙 차분 오차가 발생하고 있다.



문제 75. 아래의 함수를 시각화하시오 ! (matplotlib 사용)

x = np.arrange(0.0, 20.0, 0.1) #부터 20까지 0.1 간격의 배열 x 생성

y = x^2 + 4^2 <---- 이 함수를 시각화 하시오 !

import numpy as np
import matplotlib.pylab as plt

def samplefunc1(x):
    return x **2 + 4**2

x = np.arange(0.0, 20.0, 0.1)
y = samplefunc1(x)
plt.plot(x,y)
plt.show()




■ 5. 편미분

변수가 2개 이상인 함수를 미분할 때 미분 대상 변수 외에
나머지 변수를 상수처럼 고정시켜 미분하는것을 편미분이라고 한다.

f(x0,x1) = x0^2 + x1^2 의 그래프를 보면 아래와 같다.










문제 76. f(x0,x1) = x0^2 + x1^2 함수를 편미분하는데
   x0=3, x1=4 일때

         ∂ f
     ---------- = 2*x0 = 2*3 = 6
           ∂ x0



def samplefun3(x):
    return x**2 + 4**2

def numericalDiff(f,x):
    h = 0.0001
    return(f(x+h) - f(x-h)) / (2*h)

print( numericalDiff(samplefun3, 3) )

결과 :

6.00000000000378




문제 77. x0=3 이고 x1 =4 일때 아래의 함수를 아래와 같이 편미분하시오 !

f(x0, x1) = x0^2 + x1^2


        ∂ f
     ---------- 
       ∂ x1


import numpy as np
def func1(x):
    return np.square(x) + np.square(3)

def numberical_diff(f,x,h=1e-4):
    return (f(x+h) - f(x-h)) / (h*2)

print(numerical_diff(func1,4))



결과 :

8.0

문제 78. 아래의 함수를 x0 로 편미분 하시오!
(x0=3, x1=4)

f(x0,x1) = 2*x^2 + 3*x1^2

        ∂ f
     ---------- 
       ∂ x0



import numpy as np
def func1(x):
    return 2*np.square(x) + 3*np.square(4)

def numberical_diff(f,x,h=1e-4):
    return (f(x+h) - f(x-h)) / (h*2)

print(numerical_diff(func1,3))

결과 :

12.0




문제 79. 아래의 함수를 편미분하시오!
   (x0=6, x1=7)

   f(x0,x1) = 6*x0^2 + 2*x1^2

        ∂ f
     ---------- 
       ∂ x1



func = lambda x1 : 6*6**2 + 2*x1**2
print(numerical_diff(func, 7))

결과 :

27.999999999792635



문제 80. (점심시간 문제) for loop 문을 이용해서 아래의 함수를 x0 로
편미분하고 x1 로 편미분이 각각 수행되게 하시오 !
(x=0.6, x1=7)

f(x,x1) = 6*x0^2 + 2*x1^2

                   ∂ f
   1.      ---------- 
                  ∂ x1

           ∂ f
   2.     ---------- 
          ∂ x0

코드 :

func = {}
func[0] = lambda x0:6*x0**2
func[1] = lambda x1:2*x1**2
value = [6,7]
for idx,value in enumerate(value):
    print(numerical_diff(func[idx],value))


결과 :

71.9999999998322
27.999999999934744

■ 기울기

앞에서는 x0 와 x1 편미분을 변수별로 따로따로 계산을 했다.
그럼 x0 와 x1의 편미분을 동시에 계산을 하고 싶다면
어떻게 해야할까?

모든 변수의 편미분을 벡터 정리한것을 기울기 (gradient) 라고 한다.
그럼 x0와 x1의 편미분을 동시에 계산을 하고 싶다면 어떻게 해야할까? 
가령 x0 = 3, x1 = 4 일때 (x0, x1) 양쪽의 편미분을 묶어서 

f(x0,x1) = x0^2 + x1^2

   ∂f  ∂f
( ---, --- ) = (6, 8)
  ∂x0  ∂x1

모든 변수의 편미분을 벡터 정리한것을 기울기(gradient)라고 한다. 


문제81. 위의 편미분을 벡터로 나타내는것을 파이썬으로 구현하시오 




def _numerical_gradient_no_batch(f, x):
    h = 1e-4 # 0.0001
    grad = np.zeros_like(x) # x와 형상이 같은 배열을 생성

    for idx in range(x.size):
        tmp_val = x[idx]

        # f(x+h) 계산
        x[idx] = float(tmp_val) + h
        fxh1 = f(x)

        # f(x-h) 계산
        x[idx] = tmp_val - h
        fxh2 = f(x)

        grad[idx] = (fxh1 - fxh2) / (2*h)
        x[idx] = tmp_val # 값 복원

    return grad

def samplefunc4(x):
     return x[0] **2 + x[1] ** 2



print(_numerical_gradient_no_batch(samplefunc4, np.array(3.0,4.0)))

x = np.array([3.0, 4.0])
grad = np.zeros_like(x)

print(grad.shape) 

문제83. x0= 0.0 x1 =2.0 일때의 기울기 벡터를 구하시오  !


문제84. x0=3.0 , x1=0.0 일대의 기울기 벡터를 구하시오















■ 경사 감소법 (p129)

딥러닝은 경사감소법으로 싲가해서 경사감소법으로 끝난다 해도 과언이 아니다
지난번 배운 선형회귀를 복습해보면 y = ax + b 의 직선식을 구하는게 선형회귀의 목표였다. 그런데 딥러닝에서는 
위의 식을 y = W1 * x + B 로 나타낼 수 있다. 

잔차 오차 에러를 우리는 cost라고 할 것이다. 틀리면 틀릴수록 손해를 보는 비용이 많이 든다는 얘기

y = W*x + B에서 w와 b의 값ㅇ르 계속 튜닝해 나갈 것이다

그러면 이 값을 어떻게 업데이트 해 나갈것이냐?

cost = ∑ 1/2 * ( y - y` ) ^2
               실제값 - 예상값 


제곱을 쓰는 이유는 음수가 있을 수 있기 때문이고 

음수가 안나오게 하면서 차이에 대해 제곱을 하면 

패널티를 더 크게 해줄 수 있다. 

y = W*x + B 
y 의 B절편은 축으로 두고 직선을 돌리면서 점점데이터에 맞느 ㄴ직선을 알아내 간다고 보면 COST에 대해서는 
2차 함수가 그려지게된다. 




오차를 알고 있으니까 W(기울기) 값을 변화시켜 위의 그래프를 그린게 COST함수 그래프이다
깅루기가 점점작아질수록COST도 점점작아진다

대신 COST 가 0 은 안된다 .왜냐면 데이터가 완전한 직서에 있기는 불가능하기 때문이다.데이터들은 
어떻게든 랜덤함 특성이 있기 때문에 0 이되긴 어렵다 만약 0 이 된다면 굳이 

LINE FITTING을 할 필요가 없다 우리가 찾아야할것은 COST가 가장 작은 W의 값이 얼마냐 인것을 찾는것이다.

COST를 분석해서 W의 지점을 알아야 하는게 이것을 찾는 가장 쉬운 방법이있다. 바로 COST를 미분했을때 0 
이되는 그 지점이 최솟점이 된다. 거기에 W를 읽어오면 된다.

 df
-----  이게 0 인 점을 찾아가는 것이다.
 d w1
그런데 한번에 익밧을 알아내기는 힘들다

그래서 추정값을 찾아서 계속 근사값을 찾아가는데 경사 감소법이다. 

w1 이 3에서 기울기가 5가 나왔다면 3-5 = -2 쪽으로 갑니다. 


y = W1 * x1 +  W2 * x2 + W3 * x3
집값     평수       학군      편의시설

w1 = w1 - ? * ∂f/∂w1
w2 = w2 - ? * ∂f/∂w2

? : 러닝 레이트 (학습률)
왜 러닝 레이트가 필요한가 ? 미분한 기울기 값이 너무 크면 발산해버리기 때문에 cost를 
0 으로 수렴시키기 위해서 필요하다. 

너무 크면 발산하고 
너무 작으면 학습이 안된다. 


안장점이나 극소값이 최소 값인줄알고 정체기에 빠진다느 말이 무엇인가. 




책 p130 페이지 안장점과 극솟값이 최솟값인줄 알고 정체기에 빠진다는것은 ?







문제85. 경사 감소 함수를 파이썬으로 구현하시오 ! 
(비용함수를 미분해서 기울기가 0에 가까워지는 그 지점의 기울기를 구한다 )
def gradient_descent(f, init_x, lr = 0.01, step_num = 100):
     x = init_x
 
     for i in range(step_num):
          grad = numerical_gradient(f, x)
          x -= lr * grad
     return x  


import numpy as np

def numerical_gradient(f, x):  # x의 모습[3.0, 4.0]
    h = 1e-4 # 0.0001
    grad = np.zeros_like(x) # x와 형상이 같은 배열을 생성

    for idx in range(x.size): # x.size에 2가 들어가니까 0,1fh loop 돈다.
        tmp_val = x[idx]

        # f(x+h) 계산
        x[idx] = float(tmp_val) + h #x의 모습[3.00001, 4.0]

        fxh1 = f(x)

        # f(x-h) 계산 25.00060001
        x[idx] = tmp_val - h #[2.9999,4.0]
        fxh2 = f(x)
        #print(fxh1) #25.00060001
        #print(fxh2) #24.99940001
        grad[idx] = (fxh1 - fxh2) / (2*h)
        #print('ekq')
        #print((fxh1 - fxh2) / (2*h))
        x[idx] = tmp_val # 값 복원

    return grad
def gradient_descent(f, init_x, lr=0.01, step_num=100):
    x = init_x

    for i in range(step_num):
        grad = numerical_gradient(f, x)
        x -= lr * grad
    return x
def function_2(x):
    return x[0]**2 + x[1]**2
def samplefunc4(x):
    return x[0] **2 + x[1] ** 2
init_x = np.array([2.0,4.0])
print( gradient_descent(function_2, init_x, lr=0.1, step_num=10))

print(numerical_gradient(samplefunc4, np.array([3.0, 4.0])))
print(numerical_gradient(samplefunc4, np.array([0.0, 2.0])))
print(numerical_gradient(samplefunc4, np.array([3.0, 0.0])))
print(numerical_gradient(samplefunc4, np.array([1.0, 0.0])))


[  4.07407195e-10   8.14814391e-10]

거의 (0 , 0 )에 가까운 결과가 출력되었다.

문제86. 위의 식을 글대로 사용해서 테스트를 수행하는데 학습률이 너무 크면 (10)면 발산하고 
학습률이 작으면(1e-10)으면 수렴을 못한다는 것을 테스트 하시오 ! 



문제87. 러닝 레이트를 1e-10으로 했을때 기울기가 0 으로 수렴하려면 
step_num을 몇으로 줘야하나? 




* 4장 목차

   1. 신경망의 학습이 무엇인지?
   2. 비용함수(손실함수) 2가지
      -평균 제곱 오차
      - 교차 엔트로피 오차
   3. 미니 배치 학습
   4. 수치 미분
   5. 편미분
   6. 기울기
   7. 경사하강법
   8. 신경망에서의 기울기
   9. 학습 신경망 구현하기
■ 4.8. 신경망에서의 기울기 (p 133) 

어제 경사감소법에서 구했떤 기울기는? 

f(x0, x1) = x0^2 + x1^2

x0 =3 , x1 = 4 일때 각각 x0와 x1로 편미분한 결과 기울기를 벡터로 
(6,8)로 구현한 기울기 였고 .

신경망에서의 기울기를 구한다는것은?
      w11  w21  w31 
w = (               )
      w12  w22  w32

비용함수의 기울기를 구하기 위해서 비요함수를 수치미분했다.

∂ 비용함수(L)
------------ = ( 
    ∂ w 

문제88. p134를 코딩해보자

문제89. 문제88번에서 만든 신경망에 입력값 [0.6, 0.9] 을 입력하고 
target은 [0,0,1]로 해서 즉 정답 레이블이 2번이다 라고 가정하고서 
오차 [에러] 가 얼마나 발생하는지 확인하시오 




문제90. 어제 만든 수치미분함수에 위에서 만든 신경망 비용함수와 가중치(2x3)의 가중치를 입력해서 기울기를 구하시오(2x3)

def f(W):
     return net.loss(x,t)

dw = numerical_gradient(f, net.W)

■ 기울기를 구한 이유? 
     손실(비용) 함수의 값을 가장 작게하는 방향을 제시하게끔 
     가중치를 갱신할대 필요한 값이기 때문에 기울기를 구해야한다. 

     
  • 경사하강법
  1. 확률적 경사 하강법 : 훈련 데이터에서 하나씩 데이터를 선택해 가중치를 갱신하는 방법
               
               단점 : 하나의 데이터 마다 오차를 계산해서 신경망의 가중치를 
                    조절하기 대문에 가중치 조절은 빠르나 학습 데이터마다 
                    가중치가 갱신됨으로써 성느잉 들숙날쑥하다
          
  1. 배치법  : 모든 데이터를 학습하고 오차를 이용하여 가중치를 갱신하는 방법
              
               단점: global mininum(최소값) 이 아닌 local mininum(극소값)에 수렴할 수도 있다. 
               최소값? -> 우리가 수렴해야할 값 
               극소값  -> 오해할수 있는 수렴점 (안장점 같은곳) 

  1. 미니 배치법 : 위 두개의 단점을 보완한 방법

               훈련데이터에서 소량의 데이터를 적당히 선택해 가중치를 갱신하는 방법

               " 위의 두가지 경사 하강법의 단점을 보완하면서 또한 
                GPU기반의 병렬처리가 가능하다. "

■ 학습 알고리즘 구현하기 (p136)

1단계 - 미니배치               : 데이터를 미니배치로 무작위(랜덤 사용)로 선정한다.=확률적 경사 하강법 이라고 한다. 
2단계 - 기울기 산출
3단계 - 매개변수 갱신
4단계 - 1단계 ~ 3단계 반복


■ 2층 신경망 구현하기

단층      입력층 ---> 출력층
다층      얕은 신경망 (2층) : 입력층 --> 은닉층 1개 --> 출력층
          심층 신경망(3층) : 입력층  ---> 은닉층 들 --> 출력층 

문제 93. 아래의 배열을 눈으로 확인하시오 !

import numpy as np

b1 = np.zeros(50)

print(b1)

결과:

[ 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.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]

문제 94. 아래의 x(입력값), t(target 값) y(예상값) 을 아래와 같이 설정하고
   위에서 만든 2층 신경망을 객체화 해서 W1,W2,B1,B2의 차원이 어떻게
   되는지 프린트하시오 !

net = TwoLayerNet(input_size=784, hidden_size=100, ouput_size=10)
x = np.random.rand(100,784)
y = net.predict(x)
t = np.random.rand(100,10)

===================================================================================

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.functions import *
from common.gradient import numerical_gradient

class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
        self.params = {}
        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
        self.params['b2'] = np.zeros(output_size)

    def predict(self, x):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']

        a1 = np.dot(x, W1) + b1  # 100 x 784 * 784 * 50 + 50 = 100 x 50
        z1 = sigmoid(a1) # 100 x 50
        a2 = np.dot(z1, W2) + b2 # 100 x 50 * 50 x 10 + 10 = 100 x 10
        y = softmax(a2) # 100 x 10

        return y


    def loss(self, x,t):
        y = self.predict(x)

        return cross_entropy_error(y, t)

    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        t = np.argmax(t, axis=1)

        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy

    def numerical_gradient(self,x,t):
        loss_W = lambda W: self.loss(x,t)

        grads = {}
        grads['W1'] = numerical_gradient(loss_W, self.params['W1']) # 784 x 50 기울기
        grads['b1'] = numerical_gradient(loss_W, self.params['b1']) # 50개의 bias
        grads['W2'] = numerical_gradient(loss_W, self.params['W2']) # 50 x 10 기울기
        grads['b2'] = numerical_gradient(loss_W, self.params['b2']) # 10개의 bias

        return grads

net = TwoLayerNet(input_size=784, hidden_size=100, output_size=10)
x = np.random.rand(100,784)
y = net.predict(x)
t = np.random.rand(100,10)


print(net.params['W1'].shape) #(784, 100)
print(net.params['W2'].shape) #(100, 10)
print(net.params['b1'].shape) #(100,)
print(net.params['b2'].shape) #(10,)

결과 :

(784, 100)
(100, 10)
(100,)
(10,)

문제 95. 아래의 x(입력값), t(target 값) y(예상값) 을 아래와 같이 설정하고
   위에서 만든 2층 신경망을 객체화 해서 W1,W2,B1,B2의 기울기의 차원이 어떻게
   되는지 프린트하시오 !

net = TwoLayerNet(input_size=784, hidden_size=100, output_size=10)

x = np.random.rand(100,784)
y = net.predict(x)
t = np.random.rand(100,10)



# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.functions import *
from common.gradient import numerical_gradient

class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
        self.params = {}
        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
        self.params['b2'] = np.zeros(output_size)

    def predict(self, x):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']

        a1 = np.dot(x, W1) + b1  # 100 x 784 * 784 * 50 + 50 = 100 x 50
        z1 = sigmoid(a1) # 100 x 50
        a2 = np.dot(z1, W2) + b2 # 100 x 50 * 50 x 10 + 10 = 100 x 10
        y = softmax(a2) # 100 x 10

        return y


    def loss(self, x,t):
        y = self.predict(x)

        return cross_entropy_error(y, t)

    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        t = np.argmax(t, axis=1)

        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy

    def numerical_gradient(self,x,t):
        loss_W = lambda W: self.loss(x,t)

        grads = {}
        grads['W1'] = numerical_gradient(loss_W, self.params['W1']) # 784 x 50 기울기
        grads['b1'] = numerical_gradient(loss_W, self.params['b1']) # 50개의 bias
        grads['W2'] = numerical_gradient(loss_W, self.params['W2']) # 50 x 10 기울기
        grads['b2'] = numerical_gradient(loss_W, self.params['b2']) # 10개의 bias

        return grads

net = TwoLayerNet(input_size=784, hidden_size=100, output_size=10)

x = np.random.rand(100,784)
y = net.predict(x)
t = np.random.rand(100,10)


#print(net.params['W1'].shape) #(784, 100)
#print(net.params['W2'].shape) #(100, 10)
#print(net.params['b1'].shape) #(100,)
#print(net.params['b2'].shape) #(10,)


print(net.params['W1'].shape)
grads=net.numerical_gradient(x,t)
print(grads['W1'].shape)
print(grads['W2'].shape)
print(grads['b1'].shape)
print(grads['b2'].shape)





■ 미니배치 학습 구현하기 (pg 141)


문제96. 10000번 돌때 마다 정확도가 조금씩 오라가는지 
아래와 같이 출력되게 코드를 수정하시오 

train acc, test acc | 0.112366666667, 0.1135
train acc, test acc | 0.708783333333, 0.7126
train acc, test acc | 0.8502, 0.8537
train acc, test acc | 0.884533333333, 0.8878
train acc, test acc | 0.898816666667, 0.9018
train acc, test acc | 0.906716666667, 0.9098
train acc, test acc | 0.9126, 0.9149
train acc, test acc | 0.917033333333, 0.9196
train acc, test acc | 0.919666666667, 0.9223
train acc, test acc | 0.924016666667, 0.9261
train acc, test acc | 0.9276, 0.9285
train acc, test acc | 0.930216666667, 0.9315
train acc, test acc | 0.932316666667, 0.9325
train acc, test acc | 0.935583333333, 0.9346
train acc, test acc | 0.936483333333, 0.9363
train acc, test acc | 0.9393, 0.9383
train acc, test acc | 0.94075, 0.9402




# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

# 데이터 읽기
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)

network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)

# 하이퍼파라미터
iters_num = 10000  # 반복 횟수를 적절히 설정한다.
train_size = x_train.shape[0]
batch_size = 100  # 미니배치 크기
learning_rate = 0.1

train_loss_list = []
train_acc_list = []
test_acc_list = []

# 1에폭당 반복 수
iter_per_epoch = max(train_size / batch_size, 1)

for i in range(iters_num):
    # 미니배치 획득
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]

    # 기울기 계산
    #grad = network.numerical_gradient(x_batch, t_batch)
    grad = network.gradient(x_batch, t_batch)

    # 매개변수 갱신
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key]

    # 학습 경과 기록
    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)

    # 1에폭당 정확도 계산
    if i % iter_per_epoch == 0:
        train_acc = network.accuracy(x_train, t_train)
        test_acc = network.accuracy(x_test, t_test)
        train_acc_list.append(train_acc)
        test_acc_list.append(test_acc)
        print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))

# 그래프 그리기
markers = {'train': 'o', 'test': 's'}
x = np.arange(len(train_acc_list))
plt.plot(x, train_acc_list, label='train acc')
plt.plot(x, test_acc_list, label='test acc', linestyle='--')
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
plt.show()

문제97. (오늘의 마지막 문제) numerical_gradient 함수 말고 5장에서 배울 오차 역전파로 (gradient)함수를 사용해서
정확도를 계산하게 코드를 수정하시오 














 







 





























 


'딥러닝' 카테고리의 다른 글

딥러닝 4장. 신경망 학습  (0) 2017.07.26
딥러닝 3장. 신경망  (0) 2017.07.26
딥러닝 2장. 퍼셉트론  (0) 2017.07.26
딥러닝 1장. Numpy, matplotlib 사용법  (0) 2017.07.26

  • 4장 목차
  1. 신경망의 학습이 무엇인가?
  2. 비용함수(손실함수) 2가지
     - 평균 제곱 오차
     - 교차 엔트로피 오차
  1. 미니 배치 학습
  2. 수치 미분
  3. 편미분
  4. 기울기
  5. 경사하강법
  6. 신경망에서의 기울기
  7. 학습 신경망 구현하기 
■ 1. 신경망의 학습이 무엇인지? 

- 학습이란 ? 신경망에서 우너하는 결과를 얻기 위해 뉴런 사이의 적당한 가중치를 알아내는것을 말한다.
          즉, 가중치를 최적화 하는 것이다. 
     - 퍼셉트론에서는 가중치 매개변수를 사람이 수작업으로 설정했다.
          왜냐면 매개변수가 겨울 3개였기 때문이다. 
     예 : and 연산의 가중치 : 0.5 , 0.5  세타 : 0.7
           or 연산의 가중치 : 0.5 , 0.5  세타 : 0.7
     
     그러나 신경망에서는 매개변수가 몇개가 될까

     어제 구현한 mnist의 가중치도 은닉층 1만 50개, 은닉층 2가 100개 였다. 
     층이 더 깊어지면 수억에 이를 수도 있기 때문에
     
     사람이 일일이 수작업을 할 수가 없다. 
     이미지(필기체) 숫자 5를 기계가 인식하게 하는 방법 3가지 ? (p110)

1.5 ----------- 사람이 생각한 알고리즘 ------------> 결과
2.5 ----------- 사람이 생각한 특징   -- 기계학습 ---> 결과
               (sift, hog 등)       (svm, knn)
3.5 ----------- 신경망(딥러닝) -------------------> 결과

딥러닝을 종단간 기계학습(end-to-end 머신러닝) 이라고 한다 .
                         ↓
                         이미지, 영상을 던져주고 알아서 분석

■ 훈련데이터와 시험 데이터 
학습(훈련) 데이터에 너무 지나치게 맞추다 보면 일빈화 성능이 떨어지는 것을 과적합이라고 한ㄷㅏ.



  1. 평균 제곱 오차

import numpy as np

def mean_squared_error(y, t):
    return 0.5 * np.sum((y-t)**2)
t = [0,0,1,0,0,0,0,0,0,0]
y = [0.1, 0.05, 0.6 ,0.0, 0.05, 0.1 , 0.0 , 0.1, 0.0, 0.0]
print(np.shape(t))
print(np.shape(y))
print(mean_squared_error(np.array(y),np.array(t)))

y = [0.1, 0.05, 0.6 ,0.0, 0.05, 0.1 , 0.0 , 0.6, 0.0, 0.0]
print(mean_squared_error(np.array(y),np.array(t)))
결과 :
0.0975
0.2725

  1. 교차 엔트로피 

import numpy as np
def cross_entropy_error(y,t):
    delta = 1e-7
    return -np.sum(t*np.log(y+delta))

t = [0,0,1,0,0,0,0,0,0,0]
y = [0.1, 0.05, 0.6 ,0.0, 0.05, 0.1 , 0.0 , 0.1, 0.0, 0.0]
print(cross_entropy_error(np.array(y),np.array(t)))
y = [0.1, 0.05, 0.1 ,0.0, 0.05, 0.1 , 0.0 , 0.6, 0.0, 0.0]
print(cross_entropy_error(np.array(y),np.array(t)))
결과 :
0.510825457099
2.30258409299

설명 : 정답 레이블과의 오차가 mse 보다 훨씬 더 큰 것으로 확인이 되고 잇ㄷ.

문제67. (점심시간문제) 아래의 넘파이 배열(확률)을 교차 엔트로피 오차 함수를 이용해서 
     오차율이 어떻게 되는지 for loop 문을 사용해서 한번에 알아내시오 !



t = [0,0,1,0,0,0,0,0,0,0]    # 숫자2

y1 = [0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0]  
y2 = [0.1,0.05,0.2,0.0,0.05,0.1,0.0,0.6,0.0,0.0] 
y3 = [0.0,0.05,0.3,0.0,0.05,0.1,0.0,0.6,0.0,0.0] 
y4 = [0.0,0.05,0.4,0.0,0.05,0.0,0.0,0.5,0.0,0.0] 
y5 = [0.0,0.05,0.5,0.0,0.05,0.0,0.0,0.4,0.0,0.0] 
y6 = [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0] 
y7 = [0.0,0.05,0.7,0.0,0.05,0.0,0.0,0.2,0.0,0.0] 
y8 = [0.0,0.1,0.8,0.0,0.1,0.0,0.0,0.2,0.0,0.0] 
y9 = [0.0,0.05,0.9,0.0,0.05,0.0,0.0,0.0,0.0,0.0]


정리 :
1.one-hot-encoding = False
  입력값 ----> 신경망 ----> 출력값 (숫자) ---> 라벨 비교 ---> 정확도
                                             
                                             숫자가 맞냐 안맞냐  
2.one-hot-encoding =True
  입력값 ----> 신경망 ----> 소프트맥스 함수 ---> 출력값(확률) ---> 비용함수 
                                                              ↓
                                                             오차 
                                                            0.23, 0.59
 
정확도를 올리거나 오차를 낮추거나 해야해요 

정확도보다 오차를 보는게 더 유용한 이유 . 

정확도는 23 24이렇게 생겼는데

오차는 0.2424, .54

매개변수값에 예민한것 => 비용함수의 값


0.23.
0.21 
0.19
비용함수에 넣고 오차를 구하는것이 더 학습에 유리하다 . 

매개변수에 더 잘 반응 함 . 

□ 4.3 미니 배치 학습

미니배치 학습이란 훈련 데이터로 부터 일부만 골라서 학습을 수행하는 방식이다.

앞에서 손실함수를 배웠는데 손실함수가 필요한 이유는 
예상값과 실제값을 오차를 계산해서 오차를 줄이는 방향으로 
가중치를 조정하려고 필요했다. 

지금까지는 딱 하나의 데이터만 가지고 손실함수 계산을 한 것이었다. 

t = [0,0,1,0,0,0,0,0,0,0]    # 숫자2

y1 = [0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0]  

mnist 데이터만 해도 훈련데이터가 6만장인데 ---> 비용함수 
                                     계산

한장씩 입력하면 계산을 6만번을 해야하기 때문에 여러장을 모아서 입력하고 계산을 한번만 하게 하자 
  
이것이 미니배치 학습입니다. 

훈련데이터 중 일부만 골라서 학습 하는 방법 : 표본을 뽑아서 학습 한다. 

표본을 뽑아서 학습 시키는 장점 :

한번에 넣어서 한번에 계산하게함 == 미니배치학습

mnist 데이터를 가지고 미니배치 학습을 시켜보자 


문제68
6만 미만의 숫자중에 무작위로 10만 출력하시오

print(np.random.choice(60000, 10))

문제69. mnnist 60000장의 훈련 데이터 중에 무작위로 10장을 골라

import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import pickle
# (p98) mmist 데이터셋을 읽어올 때 인터넷이 연결되어 있는 상태에서 가져와야하는데 이때 시간이 걸린다.
# 가져온 이미지를 로컬에 저장할 때 pickle 파일로 생성이 되고 로컬에 저장되어 있으면 순식간에 읽을 수 있기 때문에 임포트 해야함
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax


(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=True)

print(x_train.shape)
print(t_train.shape)

train_size = 60000
batch_size = 10
batch_mask == np.random.choice(   train_size ,  batch_size   )
x_batch = x_train[batch_mask]
t_batch = x_train[batch_mask]

print(len(x_batch)) # 10
print( x_batch.shape) 

문제70. 데이터 1개를 가지고 오차를 구하는 교차 엔트로피 오차 함수는 아래와 같이 만들었다.
     그렇다면 배치용 교차 엔트로피 오차는 어떻게 생성해야 하는가 ? 

import numpy as np

def corss_entropy_error(y, t):
     delta = 1e-7
     return -np.sum(t * np.log(y + delta))

답 : 

import numpy as np

def corss_entropy_error(y, t):
     delta = 1e-7
     return -np.sum(t * np.log(y + delta)) / len(y)

문제71. SK PT 64 페이지를 참고해서 교차 엔트로피 오차 사용 코드를 구현하시오 ! 
(mnist 데이터셋의 테스트 데이터를 가지고 구현) 














언제 몇시까지 ?

몇시까지 갈게영! 

되물어여! 

잘 못들었을때 한번더 ㅋ캐캐캐캨



정보조사

홈페이지 인재상 기업연역 
대표인사 ?


열정 리더쉬 키워드 ㅋㅋ

아이티는 앙데 

아이티는 사업영역
 아이티는 
내가 사용한적있는 제품? 

고객사? 

솔루션 제품 
솔루션 제품 의 기능 

블로그나 카페? 

최근 게시글 릭고가 여 ㅇ ㅋ


나에 맞추어서 질문 준비 

복장 






속도 =  거리 / 시간
df(x) / dx = 

속도는 거리를 시간으로 나눈것인데 순간 속도는 시간이 한없이 0 으로 가는 멈춰있는 그  특정 순간의 속도를 말한다.

고등학교 때 배운 미분을 컴퓨터 구현하면 문제가 생긴다. 왜냐면 시간이 0 은 아닌데 0 에 무한히 가까워지는 그 수식을 표현하려면 
0.00000000 .... 000001 로 표현해야 한다.

print( np.float32(1e-50))
결과 0.0

그래서 그냥 0.0001로 표현할 수 밖에 없다. 

 h 를 0으로 좁히는 게 불가능 하다 보니
  df(x)            f(x+h) - f(x)           f(x+h) - f(x-h)
--------- = limit --------------- = limit -------------------
   dx        h->0        h           h->0      2 * h
                         ↓                      ↓
                    진정한 미분식            근사로 구한 접선 (수치미분) 


 


문제72. 근사로 구한 미분 함수를 파이썬으로 구하시오 
       ( h - 0.0001 ) 함수 이름 : numerical_diff
      f(x+h) - f(x-h)
limit ----------------
 h->0       2 * h

답 : 

def numerical_diff(f,x):
     h = 0.0001
     return ( f(x+h) - f(x-h) / (2*h) 

문제73.  y= 0.01 * x^2 + 0.1 * x 함수를 미분하는데 x 가 10일때 미분 계수는 어떻게 되는가 ?

def func73(x):
    return 0.01 * x ** 2 + 0.1 * x

def numerical_diff(f,x):
     h = 0.0001
     return (f(x+h) - f(x-h)) / (2*h)
print(numerical_diff(func73,10))

0.2999999999986347
































'딥러닝' 카테고리의 다른 글

딥러닝 5장 .  (0) 2017.07.26
딥러닝 3장. 신경망  (0) 2017.07.26
딥러닝 2장. 퍼셉트론  (0) 2017.07.26
딥러닝 1장. Numpy, matplotlib 사용법  (0) 2017.07.26