밑바닥부터 시작하는 딥러닝 <chapter 1 헬로 파이썬>

유현지·2021년 7월 12일
0

ZeroDeep

목록 보기
1/3

chapter 1 헬로 파이썬

👋hello, python!

  • ❗ 지난 2주동안 파이썬마스터를 진행했고 chapter 2에 대한 시간확보 위해 빠른 진행 필요

  • 파이썬을 사용하여 딥러닝 시스템 구현하기 위해 파이썬, 넘파이, matplotlib에 대한 설명 진행

1.1 파이썬이란?

  • 간단하고 배우기 쉬운 프로그래밍 언어
  • 오픈소스로 무료이며 영어와 유사한 문법으로 프로그램을 작성할 수 있으며 불편한 컴파일 과정도 없어 입문자에게 최적인 언어
  • 과학분야,특히 기계학습과 데이터 과학분야에 널리 쓰임
  • 카페, 텐서플로, 체이너, 테아노 같은 유명 딥러닝 프레임 워크들이 파이썬용 API를 제공

1.2 파이썬 설치하기

1.2.1 파이썬 버전

  • 파이썬 2와 3은 100% 호환되지 않음(하위호환성이 없음)

1.2.2 사용하는 외부 라이브러리

  • 효율화를 위해 넘파이,matplotlib 사용
  • 넘파이는 수학 알고리즘과 배열을 조작하기 위한 매서드가 많이 있음
  • matplotlib는 그래프를 그려주는 라이브러리 ➡️ 시각화

1.2.3아나콘다 배포판

  • 아나콘다에서 자신의 OS에 맞는 배포판 설치

1.3 파이썬 인터프리터

파이썬 인터프리터란?
'대화모드' 대화하듯이 프로그래밍을 할 수 있다.

1.3.1 산술 연산

덧셈과 곱셈 등의 산술 연산

>>> 1 - 2
-1
>>> 4 * 5
20
>>> 7 / 5
1.4
>>> 3 ** 2
9

*은 곱셈, /는 나눗셈, 는 거듭제곱을 의미
참고로, 파이썬 2에서는 정수끼리 계산한 결과는 정수지만, 파이썬 3에서는 정수를 나눈 결과는 실수가 됩니다.

1.3.2 자료형

자료형(data type)이란 데이터의 성질을 나타내는 것으로, 예를 들어 정수, 실수, 문자열과 같은 형태가 있습니다.
파이썬에는 type() 함수로 특정 데이터의 자료형을 알아볼 수 있습니다.

>>> type(10)
<class 'int'>
>>> type(2.718)
<class 'float'>
>>> type("hello")
<class 'str'>

1.3.3 변수

x와 y 등의 알파벳을 사용하여 변수(variable)를 사용하여 계산하거나 변수에 다른 값을 대입할 수도 있습니다.

>>> x = 10   # 초기화
>>> print(x) # x의 값 출력
10
>>> x = 100  # 변수에 값 대입
>>> print(x)
100
>>> y = 3.14
>>> x * y
314.0
>>> type(x * y)
<class 'float'>

파이썬은 동적 언어로 분류되는 프로그래밍 언어입니다.
동적이라 함은 변수의 자료형을 상황에 맞게 자동으로 결정한다는 뜻입니다.
앞의 예에서 x의 자료형이 int (정수)라는 것을 사용자가 명시한 적이 없지만, 10이라는 정수로 초기화할 때, x의 형태가 int임을 파이썬이 스스로 판단하는 것입니다.
또, 정수와 실수를 곱한 결과는 실수가 되었습니다(자동 형변환).
마지막으로 #은 주석의 시작을 알리는 문자입니다. # 이후의 문자는 모두 무시해버립니다.

1.3.4 리스트(list)

>>> a = [1, 2, 3, 4, 5] # 리스트 생성
>>> print(a)  # 리스트의 내용 출력
[1, 2, 3, 4, 5]
>>> len(a)     # 리스트의 길이 출력
5
>>> a[0]      # 첫 원소에 접근
1
>>> a[4]      # 다섯 번째 원소에 접근
5
>>> a[4] = 99 # 값 대입
>>> print(a)
[1, 2, 3, 4, 99]

원소에 접근할 때는 a[0]처럼 합니다.
[] 안의 수를 인덱스(색인)라 하며 인덱스는 0부터 시작합니다.
또 파이썬 리스트에는 슬라이싱(slicing)을 이용하면 범위를 지정해 원하는 부분 리스트를 얻을 수 있습니다.

>>> print(a)
[1, 2, 3, 4, 99]
>>> a[0:2] # 인덱스 0부터 2까지 얻기(2번째는 포함하지 않는다!)
[1, 2]
>>> a[1:]  # 인덱스 1부터 끝까지 얻기
[2, 3, 4, 99]
>>> a[:3]  # 처음부터 인덱스 3까지 얻기(3번째는 포함하지 않는다!)
[1, 2, 3]
>>> a[:-1] # 처음부터 마지막 원소의 1개 앞까지 얻기
[1, 2, 3, 4]
>>> a[:-2] # 처음부터 마지막 원소의 2개 앞까지 얻기
[1, 2, 3]

1.3.5. 딕셔너리

리스트는 인덱스 번호로 0, 1, 2, ... 순으로 값을 저장하는 반면, 딕셔너리(dictionary)는 키(key)와 값(value)을 한 쌍으로 저장합니다. 즉, 영한사전처럼 단어와 그 의미를 짝지어 저장합니다.

>>> me = {'height':180} # 딕셔너리 생성
>>> me['height']        # 원소에 접근
180
>>> me['weight'] = 70   # 새 원소 추가
>>> print(me)
{'weight': 70, 'height': 180}

1.3.6 bool

파이썬에는 bool(불 혹은 불리언)이라는 자료형은 True(참)와 False(거짓)라는 두 값 중 하나를 취합니다.
또 bool에는 and, or, not 연산자를 사용할 수 있습니다(수치용 연산자로는 +, -, *, / 등이 있듯이 자료형에 따라 사용할 수 있는 연산자가 정해져 있습니다).

>>> hungry = True     # 배가 고프다.
>>> sleepy = False    # 졸리지 않다.
>>> type(hungry)
<class 'bool'>
>>> not hungry
False
>>> hungry and sleepy # 배가 고프다 그리고 졸리지 않다.
False
>>> hungry or sleepy  # 배가 고프다 또는 졸리지 않다.
True

1.3.7 if문

>>> hungry = True
>>> if hungry:
...     print("I'm hungry")
...
I'm hungry

>>> hungry = False
>>> if hungry:
...     print("I'm hungry")   # 들여쓰기는 공백 문자로
... else:
...     print("I'm not hungry")
...     print("I'm angry")
...
I'm not hungry
I'm angry

파이썬에서는 공백 문자가 중요한 의미를 지닙니다.
이번 if 문에서도 if hungry: 다음 줄은 앞쪽에 4개의 공백 문자가 있습니다. 이 들여쓰기는 지난 조건(if hungry)이 충족될 때 실행되는 코드를 표현합니다.

⚠️주의: 공백 대신 탭(tab) 문자를 써도 되지만 파이썬에서는 공백 문자 쪽을 권장합니다. 그리고 한 단계 더 들여 쓸 때마다 공백 4개씩을 더 추가하는 것이 일반적입니다.

1.3.8 for문

반복(루프) 처리에는 for 문을 사용합니다.

>>> for i in[1, 2, 3]:
...     print(i)
...
1
2
3

여기에서는 [1, 2, 3]이라는 리스트 안의 원소를 하나씩 출력하는 예를 보여줬습니다.
for ... in ... : 구문을 사용하면 리스트 등 데이터 집합의 각 원소에 차례로 접근할 수 있습니다.

1.3.9 함수

특정 기능을 수행하는 일련의 명령들을 묶어 하나의 함수(function)로 정의할 수 있습니다.

>>> def hello():
...     print("Hello World!")
...
>>> hello()
Hello World!

함수는 인수를 취할 수 있습니다. 또한, + 연산자를 사용하여 문자열을 이어 붙일 수 있습니다.

>>> def hello(object):
...     print("Hello " + object + "!")
...
>>> hello("전어")
Hello 전어!

파이썬 인터프리터를 종료하려면 리눅스와 맥에서는 Ctrl + D(Ctrl 키를 누른 상태에서 D 키를 누른다)를 입력합니다. 윈도우에서는 Ctrl + Z를 입력하고 키를 누릅니다.

1.4 파이썬 스크립트 파일

파이썬 스크립트 파일
파이썬 프로그램을 파일로 저장하고 그 파일을 실행 시킬 수 있다.

1.4.1 파일 저장

print('석종이의 생일은 12월 22일입니다.')

위 코드를 seokjong_birthday.py로 파일을 저장하고
~/deep-learning-from-scratch/ch01에 저장 되어 있다고 가정한다.

$ cd ~/deep-learning-from-scratch/ch01 # 디렉터리로 이동
$ python seokjong_birthday.py
석종이의 생일은 12월 22일입니다.

이처럼 파이썬 코드를 담은 파일을 인수로 지정해 파이썬 프로그램을 실행할 수 있습니다.

1.4.2 클래스⭐

지금까지 int와 str 등의 자료형을 살펴봤으며 이들은 파이썬이 기본으로 제공하는 자료형입니다.
이번 절에서는 새로운 클래스를 정의합니다.
개발자가 직접 클래스를 정의하면 독자적인 자료형을 만들 수 있습니다.
또한, 클래스에는 그 클래스만의 전용 함수(메서드)와 속성을 정의할 수도 있습니다.

파이썬에서는 class라는 키워드를 사용하여 클래스를 정의합니다. 클래스의 구조는 다음과 같습니다.

class 클래스 이름:
    def __init__(self, 인수, ...): # 생성자
        ...
    def 메서드 이름 1(self, 인수, ...): # 메서드 1
        ...
    def 메서드 이름 2(self, 인수, ...): # 메서드 2
        ...

클래스 정의에는 __init__라는 특별한 메서드가 있는데, 클래스를 초기화하는 방법을 정의합니다.
이 초기화용 메서드를 생성자(constructor)라고도 하며, 클래스의 인스턴스가 만들어질 때 한 번만 불립니다.
또, 파이썬에서는 메서드의 첫 번째 인수로 자신(자신의 인스턴스)을 나타내는 self를 명시적으로 쓰는 것이 특징입니다.

그럼 간단한 클래스를 하나 만들어보겠습니다. 다음 코드를 man.py 파일로 저장하세요.

class Man:
    def __init__(self, name):
        self.name = name
        print("초기화!")

    def hello(self):
        print("Hello " + self.name + "!")

    def goodbye(self):
        print("Good-bye " + self.name + "!")

m = Man("주현")
m.hello()
m.goodbye()

터미널에서 실행해보자!

$ python man.py
초기화!
Hello 주현!
Good-bye 주현!

여기에서는 Man이라는 새로운 클래스를 정의했습니다.
그리고 Man 클래스에서 m이라는 인스턴스(객체)를 생성합니다.

Man의 생성자(초기화 메서드)는 name이라는 인수를 받고, 그 인수로 인스턴스 변수인 self.name을 초기화합니다. 인스턴스 변수는 인스턴스별로 저장되는 변수입니다.
파이썬에서는 self.name처럼 self 다음에 속성 이름을 써서 인스턴스 변수를 작성하거나 접근할 수 있습니다.

1.5 넘파이

1.5.1 넘파이 가져오기

넘파이는 외부 라이브러리입니다. 여기서 말하는 ‘외부’는 표준 파이썬에는 포함되지 않는다는 것입니다. 그래서 우선 넘파이 라이브러리를 쓸 수 있도록 가져와야(import) 합니다.

>>> import numpy as np # 넘파이를 가져오며(import) np라고 부른다(as).

1.5.2 넘파이 배열 생성하기

np.array ( ) 메서드를 이용하며, 파이썬의 리스트를 인수로 받아 넘파이 라이브러리가 제공하는 특수한 형태의 배열(numpy.ndarray)을 반환합니다.

>>> x = np.array([1.0, 2.0, 3.0])
>>> print(x)
[1. 2. 3.]
>>> type(x)
<class 'numpy.ndarray'>

1.5.3 넘파이의 산술 연산

>>> x = np.array([1.0, 2.0, 3.0])
>>> y = np.array([2.0, 4.0, 6.0])
>>> x + y # 원소별 덧셈
array([ 3., 6., 9.])
>>> x - y
array([ -1., -2., -3.])
>>> x * y # 원소별 곱셈
array([ 2., 8., 18.])
>>> x / y
array([ 0.5, 0.5, 0.5])



원소 수가 다르면 오류가 발생하니 원소 수 맞추기는 중요합니다.

>>> x = np.array([1.0, 2.0, 3.0])
>>> x / 2.0
array([ 0.5, 1., 1.5])

넘파이 배열과 수치 하나(스칼라값)의 조합으로 된 산술 연산도 수행할 수 있습니다.
이 경우 스칼라값과의 계산이 넘파이 배열의 원소별로 한 번씩 수행됩니다.
이 기능을 브로드캐스트라고 합니다(자세한 것은 1.5.5절에서 설명하겠습니다).

1.5.4 넘파이의 N차원 배열

>>> A = np.array([[1, 2], [3, 4]])
>>> print(A)
[[1 2]
 [3 4]]
>>> A.shape
(2, 2)
>>> A.dtype
dtype('int64')

형상이 같은 행렬끼리면 행렬의 산술 연산도 대응하는 원소별로 계산됩니다. 배열과 마찬가지로 말이죠.

>>> B = np.array([[3, 0], [0, 6]])
>>> A + B
array([[ 4, 2],
       [ 3, 10]])
>>> A * B
array([[ 3, 0],
       [ 0, 24]])

스칼라배 곱도 가능하며 브로드캐스트에 대해서는 하기 설명하도록 하겠습니다.

>>> print(A)
[[1 2]
 [3 4]]
>>> A * 10
array([[ 10, 20],
       [ 30, 40]])

❗노트: 넘파이 배열(np.array )은 N차원 배열을 작성할 수 있습니다.
1차원 배열, 2차원 배열, 3차원 배열처럼 원하는 차수의 배열을 만들 수 있다는 뜻입니다.
수학에서는 1차원 배열은 벡터(vector), 2차원 배열은 행렬(matrix)이라고 부릅니다. 또 벡터와 행렬을 일반화한 것을 텐서(tensor)라 합니다.
이 책에서는 기본적으로 2차원 배열을 ‘행렬’, 3차원 이상의 배열을 ‘다차원 배열’이라 하겠습니다.

1.5.5 브로드캐스트

넘파이에서는 형상이 다른 배열끼리도 계산할 수 있습니다
칼라값이 해당 행렬로 확대된 후 연산이 이뤄집니다. 이 똑똑한 기능을 브로드캐스트(broadcast)라고 합니다.

1.5.6 원소 접근

인덱스,for문, 인덱스를 배열로 지정해 접근가능합니다.

>>> X = X.flatten()        # X를 1차원 배열로 변환(평탄화)
>>> print(X)
[51 55 14 19 0 4]
>>> X[np.array([0, 2, 4])] # 인덱스가 0, 2, 4인 원소 얻기
array([51, 14, 0])
>>> X > 15
array([ True, True, False, True, False, False], dtype = bool)
>>> X[X>15]
array([51, 55, 19])

넘파이 배열에 부등호 연산자를 사용한(앞 예에서 X>15) 결과는 bool 배열입니다. 여기에서는 이 bool 배열을 사용해 배열 X에서 True에 해당하는 원소, 즉 값이 15보다 큰 원소만 꺼내고 있습니다.

❗노트: 파이썬 같은 동적 언어는 C나 C++ 같은 정적 언어(컴파일 언어)보다 처리 속도가 늦다고 합니다. 실제로 무거운 작업을 할 때는 C/C++로 작성한 프로그램을 쓰는 편이 좋습니다.
그래서 파이썬에서 빠른 성능이 요구될 경우 해당 부분을 C/C++로 구현하곤 합니다.
그때 파이썬은 C/C++로 쓰인 프로그램을 호출해주는, 이른바 ‘중개자’ 같은 역할을 합니다. 넘파이도 주된 처리는 C와 C++로 구현했습니다. 그래서 성능을 해치지 않으면서 파이썬의 편리한 문법을 사용할 수 있는 것이죠.

1.6 matplotlib

딥러닝 실험에서는 그래프 그리기와 데이터 시각화도 중요하답니다. matplotlib은 그래프를 그려주는 라이브러리입니다. matplotlib을 사용하면 그래프 그리기와 데이터 시각화가 쉬워집니다. 이번 절에서는 그래프를 그리고 이미지를 화면에 표시하는 방법을 설명합니다.

1.6.1. 단순그래프 그리기

그래프를 그리려면 matplotlib의 pyplot 모듈을 이용합니다. 당장 sin 함수를 그리는 예를 살펴봅시다.

import numpy as np
import matplotlib.pyplot as plt

# 데이터 준비
x = np.arange(0, 6, 0.1) # 0에서 6까지 0.1 간격으로 생성
y = np.sin(x)

# 그래프 그리기
plt.plot(x, y)
plt.show()

1.6.2 pyplot 기능

여기에 cos 함수도 추가로 그려보겠습니다. 또, 제목과 각 축의 이름(레이블) 표시 등, pyplot의 다른 기능도 사용해보겠습니다.

import numpy as np
import matplotlib.pyplot as plt

# 데이터 준비
x = np.arange(0, 6, 0.1) # 0에서 6까지 0.1 간격으로 생성
y1 = np.sin(x)
y2 = np.cos(x)

# 그래프 그리기
plt.plot(x, y1, label="sin")
plt.plot(x, y2, linestyle = "--", label="cos") # cos 함수는 점선으로 그리기
plt.xlabel("x")        # x축 이름
plt.ylabel("y")        # y축 이름
plt.title('sin & cos') # 제목
plt.legend()          # 범례
plt.show()

1.6.3 이미지 표시하기

pyplot에는 이미지를 표시해주는 메서드인 imshow()도 준비되어 있습니다. 이미지를 읽어들일 때는 matplotlib.image 모듈의 imread() 메서드를 이용합니다.

import matplotlib.pyplot as plt
from matplotlib.image import imread

img = imread('TFmaster03.png') # 이미지 읽어오기(적절한 경로를 설정하세요!)

plt.imshow(img)
plt.show()

앞의 코드에서는 TFmaster03.png라는 이미지 파일이 현재 작업 디렉터리에 있다고 가정했습니다. 여러분은 자신의 환경에 맞게 파일 이름과 경로를 적절히 수정해야 합니다.

1.7 정리

이번 장에서 배운 내용

  • 파이썬은 간단하고 익히기 쉬운 프로그래밍 언어다.
  • 파이썬은 오픈 소스여서 자유롭게 사용할 수 있다.
  • 이 책은 딥러닝 구현에 파이썬 3 버전을 이용한다.
  • 외부 라이브러리로는 넘파이와 matplotlib을 이용한다.
  • 파이썬을 실행하는 방식에는 ‘인터프리터’와 ‘스크립트 파일’ 두 가지가 있다.
  • 파이썬에서는 함수와 클래스 같은 모듈로 구현을 정리할 수 있다.
  • 넘파이는 다차원 배열을 다루는 편리한 메서드를 많이 제공한다.

최소한의 정리이기에 추천 책/사이트 기재
같은 출판사인 한빛미디어의 처음 시작하는 파이썬 ,파이썬 라이브러리를 활용한 데이터분석 2권과
scipy 강의노트 사이트 추천한다고 합니다.
http://www.turbare.net/transl/scipy-lecture-notes/index.html
https://github.com/scipy-lectures/scipy-lecture-notes

발표에 대해서

  • 해당 장은 우선 중요한 내용에 대한 간략한 안내가 되어 있습니다.
  • 위에 적었듯이 이후 내용을 위해 빠른 진행을 하였으므로 질문 받겠습니다.
  • 이후 내용을 위해 선수학습 되어야 할 부분이며 지난 2주간 모두가 잘 공부해왔을 부분이라고 생각합니다.
  • 들어주셔서 감사합니다.😌

참고자료
밑바닥부터 시작하는 딥러닝
소스코드 Repo

사진 자료: 1.5.3 넘파이의 산술 연산, 1.5.5 브로드캐스트, 1.5.6 원소 접근
제이알라머 블로그
➡️ 발표를 위해 책의 내용을 (거의 통채로 옮긴...) 가져왔기에 발표 및 학습 이후 삭제 될 수 있음

profile
굴러가는 토마토

0개의 댓글