2017-11-10 21 views
1

TensorFlow를 배우려고하기 때문에 fibonacci 시퀀스 (일부는 OFC)를 작성하려고했습니다.TensorFlow : 내 fibonacci 서열에 문제가 있습니까?

이 연습은 IBM인지 클래스에서 영감을 얻었습니다.

#import stuff 
import tensorflow as tf 

# define the first 2 terms of the sequence 
a = tf.Variable(0) 
b = tf.Variable(1) 

# define the next term. By definition it is the sum of the previous ones 
newterm = tf.add(a,b)  # or newterm = a+b 

# define the update operations. I want a to become b, and b to become the new term 
update1 = tf.assign(a, b) 
update2 = tf.assign(b, newterm) 

# initialize variables 
init = tf.global_variables_initializer() 

# run 
with tf.Session() as sess: 
    sess.run(init) 
    fibonacci = [a.eval(), b.eval()] 
    for i in range(10): 
     new, up1, up2 = sess.run([newterm, update1, update2]) 
     fibonacci.append(new) 
    print(fibonacci) 

그러나이 [0, 1, 2, 4, 8, 12, 24, 48, 96, 144, 240, 480]을 인쇄 :

여기 내 코드입니다. 나는 정말로 내가 뭘 잘못하고 있는지 이해하지 못합니다. 다음 학기를 만들고 난 다음 abb과 같게 newterm과 동일하게 만듭니다.

+0

직선 파이썬에서 fibonacci 시퀀스를 쓸 수 있기 때문에 제목에서 "TensorFlow"를 제거하는 것과 관련된 편집을 거부했습니다. 그러나 나는 아직도 TF가 어떻게 작동하는지 이해하지 못한다. 그러므로 나의 질문은 여기에있다. –

+1

기계 학습 도구 인 텐서 흐름이 아닙니까? 나는 이것이 어떻게 fib sequence를 '배우는'방법인지 모른다. 나는 또한 텐서 흐름이 어떻게 작동 하는지를 정말로 이해하지 못한다. 그러나 시퀀스의 처음 10 개의 숫자로 그것을 훈련한다면 다음 숫자가 무엇인지 알 수있을 것이다. – alex

+0

@alex 네, tensorflow는 기계 학습, 특히 심층 학습에 매우 적합하다고 생각합니다. (그래서 나는 그것을 배우려고 노력하고 있습니다! 미래에 그것을 마스터하고 싶습니다.) 그러나, 하드 코어 깊은 학습에 빠지기 전에 구문과 메커니즘이 어떻게 작동 하는지를 이해하기를 원했기 때문에 이것은 재판이었습니다. 물론 기계 학습 방법으로 시퀀스를 배울 수는 있지만 –

답변

4

Tensorflow는 정적 그래프를 사용한 계산을 설명합니다. 먼저 그래프를 정의한 다음 실행해야합니다.

sess.run([var1,var2, ..., vaN]) 호출에 넣은 노드에서 그래프 실행 시작 : 변수의 순서는 의미가 없습니다.입니다. Tensorflow 그래프 평가는 임의의 노드에서 시작하여 리프에서 루트까지 각 노드를 따릅니다.

특정 순서로 강제 실행하려는 경우 tf.control_dependencies을 사용하여 그래프에 순서 지정 제한 조건을 도입해야하므로 특정 순서로 작업이 실행됩니다.

내가 코드를 변경하여 어떻게 작동하는지보십시오. 꽤 명확해야합니다.

import tensorflow as tf 

# define the first 2 terms of the sequence 
a = tf.Variable(0) 
b = tf.Variable(1) 

# you have to force the order of assigments: 
# first execute newterm, then execute update1 and than update2 

# define the next term. By definition it is the sum of the previous ones 
newterm = tf.add(a,b)  # or newterm = a+b 

with tf.control_dependencies([newterm]): 
    update1 = tf.assign(a, b) 

    # thus, execute update2 after update1 and newterm 
    # have been executed 

    with tf.control_dependencies([update1]): 
     update2 = tf.assign(b, newterm) 

# initialize variables 
init = tf.global_variables_initializer() 

# run 
with tf.Session() as sess: 
    sess.run(init) 
    fibonacci = [a.eval(), b.eval()] 
    for i in range(10): 
     next, up1, up2 = sess.run([newterm, update1, update2]) 
     fibonacci.append(next) 
    print(fibonacci) 
+0

와우 나는 전혀 몰랐다. 고맙습니다! 또한 나는 이탈리아 사람이다. 볼로냐의 연구 환경은 딥 러닝의 관점에서 어떻게됩니까? –

+0

또 다른 질문이 있습니다. 클래스는 IBM인지,이 운동 용 용액은 다음 'A = tf.Variable (0) = tf.Variable B (1) = tf.Variable 온도 (0) C = A + B 갱신 1 = tf.assign (온도, c) tf.assign 갱신 2 = (a, b) = tf.assign 갱신 3 (b, TEMP) init_op tf.initialize_all_variables =() 등의 tf.Session()와 : s.run 범위에 _ 대한 (init_op) (15) : 인쇄 (s.run의 (a)) s.run (갱신 1) s.run (갱신 2) s.run (업데이트 3)' 그래서 기본적으로 그들은 새로운 변수를 도입합니다. 합계에 대한 일종의 자리 표시 자입니다. 이 방법이 왜 효과가 있는지에 대한 설명이 있습니까? –

+1

반갑습니다. 내 대답이 당신의 문제를 해결 했으므로 그것을 받아 들인 것으로 기억하십시오! (또한, 연구 환경 @ 볼로냐에 대한 정보가 필요하면 내 웹 사이트 [내 프로필에서 찾았습니다]에서 스택 오버 플로우 외부의 어떤 식 으로든 저에게 연락하십시오]). – nessuno