tensorflow1x

tensorflow (version 1.x)

ν…μ„œν”Œλ‘œ 1.x의 이해

import tensorflow as tf

message = tf.constant('hello world')
with tf.session() as sess:
    print(sess.run(message).decode())

ν…μ„œν”Œλ‘œ 1.x 계산 κ·Έλž˜ν”„(computational graph) ꡬ쑰

κ³„μ‚°κ·Έλž˜ν”„

: 계산 κ·Έλž˜ν”„λŠ” λ…Έλ“œ(node) 와 에지(edge)λ₯Ό κ°€μ§„ λ„€νŠΈμ›Œν¬μ΄λ‹€. μ—¬κΈ°μ—μ„œ μ‚¬μš©ν•  λͺ¨λ“  데이터, 즉 ν…μ„œ 객체(μƒμˆ˜, λ³€μˆ˜, ν”Œλ ˆμ΄μŠ€ν™€λ”(placeholder))와 μˆ˜μ•΅ν•  λͺ¨λ“  계산 즉연삭 객체가 μ •μ˜ λœλ‹€.

  • ν”Œλ ˆμ΄μŠ€ν™€λ”(placeholder)λŠ” λ‹¨μˆœνžˆ λ‚˜μ€‘μ— 데이터λ₯Ό ν• λ‹Ήν•˜κ·€ μœ„ν•œ λ³€μˆ˜. 이λ₯Ό μ‚¬μš©ν•˜λ©΄ 데이터 없이도 계산 κ·Έλž˜ν”„λ₯Ό 생성할 수 μžˆλ‹€

    각 λ…Έλ“œλŠ” 0개 μ΄μ‚¬μ˜ μž…λ ₯을 κ°€μ§ˆ 수 μžˆμ§€λ§Œ ν•˜λ‚˜μ˜ 좜λ ₯만 자질 수 μžˆλ‹€. λ„€νŠΈμ›Œν¬μ˜ λ…Έλ“œλŠ” 객체(ν…μ„œ(tensor)와 μ—°μ‚°(operations))λ₯Ό λ‚˜νƒ€λ‚΄κ³  μ—μ§€λŠ” μ—°μ‚° 간에 흐λ₯΄λŠ” ν…μ„œλ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 계산 κ·Έλž˜ν”„λŠ” μ‹ κ²½λ§μ˜ 청사진을 μ •μ˜ν•˜μ§€λ§Œ κ·Έμ•ˆμ˜ ν…μ„œμ—λŠ” 아직 μ—°κ³„λœ 값이 μ—†λ‹€.

κ·Έλž˜ν”„μ˜ μ‹€ν–‰

κ·Έλž˜ν”„μ˜ 싀행은 ν…μ„œμ™€ μ—°μ‚° 객체가 ν‰κ°€λ˜λŠ” ν™˜κ²½μ„ μΊ‘μŠν™”ν•˜λŠ” μ„Έμ…˜(session) 객체λ₯Ό μ‚¬μš©ν•΄ μˆ˜ν–‰λœλ‹€. μ„Έμ…˜ κ°μ²΄λŠ” ν•œ κ³„μΈ΅μ—μ„œ λ‹€λ₯Έ 게측으둜 μ •λ³΄μ˜ μ‹€μ œ 계산과 전솑이 μ΄λ€„μ§€λŠ” 곳이닀. λ‹€λ₯Έ ν…μ„œ 객체의 값은 μ„Έμ…˜ κ°μ²΄μ—μ„œλ§Œ μ΄ˆκΈ°ν™”, μ ‘κ·Ό, μ €μž₯λœλ‹€. 이 μ‹œμ κΉŒμ§€ ν…μ„œ κ°μ²΄λŠ” 좔상적인 μ •μ˜ 뢈과

κ·Έλž˜ν”„λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

  1. κ·Έλž˜ν”„λŠ” (심측) 신경망을 μ„€λͺ…ν•΄ 쀄 수 μžˆλŠ” μžμ—°μŠ€λŸ¬μš΄ λΉ„μœ κ°€ λœλ‹€

  2. κ·Έλž˜ν”„λŠ” 곡톡 ν•˜μœ„ ν‘œν˜„μ‹μ„ μ œκ±°ν•˜κ³ , 컀널을 ν•©μΉ˜κ³ , 쀑볡 ν‘œν˜„μ‹μ„ μ œκ±°ν•΄μ„œ μžλ™μœΌλ‘œ μ΅œμ ν™”ν•  수 μžˆλ‹€.

  3. κ·Έλž˜ν”„λŠ” ν›ˆλ ¨ 쀑에 μ‰½κ²Œ 배포할 수 있으며, CPU,GPU,TPU 같은 λ‹€μ–‘ν•œ ν™˜κ²½κ³Ό ν΄λΌμš°λ“œ, IOT, λͺ¨λ°”일, κΈ°μ‘΄ μ„œλ²„ 같은 λ‹€μ–‘ν•œ ν™˜κ²½μ— 배포할 수 μžˆλ‹€.

  4. κ²°κ΅­ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— μ΅μˆ™ν•˜λ‹€λ©΄ 계산 κ·Έλž˜ν”„λŠ” λ‹¨μˆœ ν”„λ¦¬λ―Έν‹°λΈŒ(primitives: 초기의 )의 ν•©μ„±μ΄λΌλŠ” 일반적인 κ°œλ…μΌ 뿐이닀.

계산 κ·Έλž˜ν”„μ˜ 예제

comGraph
  • ν…μ„œν”Œλ‘œλ₯Ό μ‚¬μš©ν•˜λ©΄ tf.device()λ₯Ό μ‚¬μš©ν•΄ 계산 κ·Έλž˜ν”„μ˜ λ‹€λ₯Έ 객체와 함꼐 νŠΉμ • μž₯치(CPU/GPU)λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

  • 이 λͺ…령은 fetches λ§€κ°œλ³€μˆ˜μ—μ„œ ν…μ„œλ₯Ό κ³„μ‚°ν•œλ‹€. μ˜ˆμ œμ—μ„œλŠ” fetches에 v_addν…μ„œκ°€ μžˆλ‹€. run λ©”μ„œλ“œλŠ” v_add둜 μ΄μ–΄μ§€λŠ” κ·Έλž˜ν”„ λ‚΄μ˜ λͺ¨λ“  ν…μ„œμ™€ 연산을 μ‹€ν–‰ν•œλ‹€.

  • fetchesλŠ” 단일 ν…μ„œλ‚˜ μ—°μ‚° 객체 ν˜Ήμ€ λ‘˜ 이상일 수 μžˆλ‹€. 예λ₯Ό λ“€λ©΄ fetchesκ°€ [v_1, V_2, V_add]λ₯Ό κ°€μ§„λ‹€λ©΄ 좜λ ₯은 [array([1, 2, 3, 4]), array([2, 1, 5, 3]), array([3, 3, 8, 7])] 이며, λ™μΌν•œ ν”„λ‘œκ·Έλž¨ μ½”λ“œ λ‚΄μ—μ„œ λ‹€μˆ˜μ˜ μ„Έμ…˜ 객체λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

μƒμˆ˜, λ³€μˆ˜, ν”Œλ ˆμ΄μŠ€ν™€λ”μ™€ μž‘μ—…

: ν…μ„œν”Œλ‘œλŠ” κ°„λ‹¨νžˆ 말해 λ‹€μ–‘ν•œ μˆ˜ν•™ 연산을 ν…μ„œλ‘œ μ •μ˜ν•˜κ³  μˆ˜ν–‰ν•˜λŠ” 라이브러리λ₯Ό μ œκ³΅ν•˜λŠ”κ²ƒμ΄λ©°, ν…μ„œλŠ” 기본적으둜 n차원 배열이닀. λͺ¨λ“  μœ ν˜•μ˜ 데이터, 즉 슀칼라, 벑터, 행렬은 νŠΉμˆ˜ν•œ ν˜•νƒœμ˜ ν…μ„œμ΄λ‹€.

데이터 ν˜•μ‹

ν…μ„œ

ν˜•νƒœ

슀칼라

0차원 ν…μ„œ

[]

벑터

1차원 ν…μ„œ

[D0]

ν–‰λ ¬

2차원 ν…μ„œ

[D0, D1]

ν…μ„œ

n차원 ν…μ„œ

[D0, D1, ... , Dn-1]

ν…μ„œν”Œλ‘œλŠ” 3κ°€μ§€ μœ ν˜•μ˜ ν…μ„œλ₯Ό 제곡 1. μƒμˆ˜ : μƒμˆ˜λŠ” ν…μ„œμ΄λ©° 값을 λ³€κ²½ν•  수 μ—†λ‹€ 2. λ³€μˆ˜ : μ„Έμ…˜ λ‚΄μ—μ„œ 값을 κ°±μ‹ ν•΄μ•Ό ν•  λ–„ λ³€μˆ˜ ν…μ„œλ₯Ό μ‚¬μš© 3. ν”Œλ ˆμ΄μŠ€ 홀더 : ν…μ„œν”Œλ‘œ κ·Έλž˜ν”„μ— 값을 넣을 λ•Œ μ‚¬μš©λœλ‹€. 보톡 신경망을 ν›ˆλ ¨μ‹œν‚€λŠ” λ™μ•ˆ μƒˆλ‘œμš΄ ν›ˆλ ¨ μ˜ˆμ‹œλ₯Ό μ œκ³΅ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

μƒμˆ˜

  • 슀칼라 μƒμˆ˜

  • λͺ¨λ“  μ›μ†Œμ˜ 값이 0인 ν…μ„œ : zeros()

  • λͺ¨λ“  μ›μ†Œμ˜ 값이 1인 ν…μ„œ : ones()

  • ν…μ„œμ˜ ν˜•νƒœ 확인 : shape

  • 기본의 λ„˜νŒŒμ΄ λ°°μ—΄ λ˜λŠ” ν…μ„œ μƒμˆ˜μ™€ λ™μΌν•œ ν˜•νƒœμ˜ ν…μ„œ λ³€μˆ˜

  • λΈŒλ‘œλ“œμΊμŠ€νŠΈ

μ‹œν€€μŠ€ (sequences)

  • startλΆ€ν„° endκΉŒμ§€ κ· λ“±ν•˜κ²Œ λΆ„ν¬ν•œ 전체 num개의 μ‹œν€€μŠ€(Sequences)λ₯Ό 생성

  • Start(κΈ°λ³Έμ„€μ • = 0) λΆ€ν„° limit(limitλŠ” ν¬ν•¨ν•˜μ§€ μ•ŠμŒ) κΉŒμ§€ delta(κΈ°λ³Έμ„€μ • = 1)만큼 μ¦κ°€ν•˜λ©΄μ„œ μ‹œν€€μŠ€ 수λ₯Ό 생성

랜덀 ν…μ„œ

  • 평균이 mean(κΈ°λ³Έμ„€μ • = 0.0), ν‘œμ€€νŽΈμ°¨κ°€ stddev(κΈ°λ³Έμ„€μ • = 1.0) 이며, ν˜•νƒœκ°€ [M, N]인 μ •κ·œ 뢄포λ₯Ό λ”°λ₯΄λŠ” 랜덀 값을 seedλ₯Ό μ΄μš©ν•΄ 생성

  • 평균이 mean(κΈ°λ³Έμ„€μ • = 0.0), ν‘œμ€€νŽΈμ°¨κ°€ stddev(κΈ°λ³Έμ„€μ • = 1.0) 이며, ν˜•νƒœκ°€ [M, N]인 μž˜λ €μ§„ μ •κ·œ 뢄포λ₯Ό λ”°λ₯΄λŠ” 랜덀 값을 seedλ₯Ό μ΄μš©ν•΄ 생성

  • seedλ₯Ό μ‚¬μš©ν•΄ [minval (κΈ°λ³Έμ„€μ • = 0), maxval] λ²”μœ„μ—μ„œ ν˜•νƒœκ°€ [M, N]인 감마 뢄포λ₯Ό λ”°λ₯΄λŠ” 랜덀 λ³€μˆ˜

  • μ£Όμ–΄μ§„ ν…μ„œλ₯Ό νŠΉμ • 크기둜 랜덀으둜 μ ˆλ‹¨

  • ν›ˆλ ¨ ν‘œλ³Έμ„ 랜덀 μˆœμ„œλ‘œ λ‚˜νƒ€λ‚Ό ν•„μš”κ°€ μžˆμ„ λ•Œλ§ˆλ‹€ tf.random_stuffle()을 μ‚¬μš©ν•΄ ν…μ„œλ₯Ό 램덀으둜 첫번 μ§Έ 차원 좕을 따라 μ„žλŠ”λ‹€. t_random이 μ„žκ³ μž ν•˜λŠ” ν…μ„œλΌλ©΄ λ‹€μŒκ³  같이 ν•œλ‹€

  • 랜덀으둜 μƒμ„±ν•œ ν…μ„œλŠ” 초기 μ‹œλ“œ(seed)에 영ν–₯을 λ°›λŠ”λ‹€. μ—¬λŸ¬ 번의 μ‹€ν–‰ λ˜λŠ” μ„Έμ…˜μ—μ„œ λ™μΌν•œ λ‚œμˆ˜λ₯Ό μ–»μœΌλ €λ©΄ μ‹œλ“œκ°€ μƒμˆ˜λ‘œ 섀정돼야 ν•œλ‹€. μ‚¬μš© 쀑인 랜덀 ν…μ„œμ˜ μˆ˜κ°€ λ§Žμ„ 경우 tf.set_random_seed()λ₯Ό μ‚¬μš©ν•΄ λͺ¨λ“  랜덀 생성 ν…μ„œμ— μ‹œλ“œλ₯Ό μ„€μ •ν•  수 μžˆλ‹€

λ³€μˆ˜ : tf.variable

  • λ³€μˆ˜ μ΄ˆκΈ°ν™” : initializer

  • λ³€μˆ˜ μ €μž₯ : saver

  • ν”Œλ ˆμ΄μŠ€ν™€λ”

Last updated

Was this helpful?