2016-09-07 8 views
2

TensorFlowの提供するサンプルは、少し複雑です.TensorFlowにニューラルネットワークを教えて、3桁の2進数の合計を予測するように教えようとしています。ネットワークは入力として2つを取得します。 3番目は不明です。したがって、「最適な」ネットワークは、合計が2つの既知のビットの和と、未知のビットの1/2になると推測します。 「損失」関数は、ネットワークによって予測された値と実際の値との差の2乗であるとしましょう。トレーニングのTensorFlowで合計を予測する

私は裁判を生成するコードを書かれている:

Filling feed dict 
inputs 1 0 
unknown 0 
sum 1 

inputs 1 0 
unknown 1 
sum 2 

inputs 0 1 
unknown 1 
sum 2 

inputs 0 1 
unknown 0 
sum 1 

inputs 0 0 
unknown 0 
sum 0 

(5, 2) 
(5,) 

しかし、私は、私はそれを終えるだろうか上の不明確だ:

import tensorflow as tf 
import numpy as np 
from random import randint 

flags = tf.app.flags 
FLAGS = flags.FLAGS 
flags.DEFINE_integer('batch_size', 5, 'Batch size. ') 
flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.') 
flags.DEFINE_integer('dim1', 3, 'layer size') 
flags.DEFINE_integer('training_epochs', 10, 'Number of passes through the main training loop') 


def ezString(list): 
    #debugging code so I can see what is going on 
    listLength = len(list) 
    r = '' 
    for i in range(listLength): 
     value = list[i] 
     valueString = str(value) 
     r = r + ' ' 
     r = r + valueString 
    return r 

def generateTrial(): 
    inputs = np.zeros(2, dtype=np.int) 
    for i in range(2): 
     inputs[i] = randint(0,1) 
    unknownInput = randint(0,1) 
    sum = 0 
    for j in range(2): 
     sum = sum + inputs[j] 
    sum = sum + unknownInput 
    inputTensor = tf.pack(inputs) 
    print 'inputs' + ezString(inputs) 
    print 'unknown ' + str(unknownInput) 
    print 'sum ' + str(sum) 
    print '' 
    return inputTensor, sum 

def printTensor(tensor): 
    sh = tensor.get_shape() 
    print(sh) 

def placeholder_inputs(size): 
    output_placeholder = tf.placeholder(tf.int32, shape=(size)) 
    input_placeholder = tf.placeholder(tf.int32, shape=(size, 
                               2)) 
    return input_placeholder, output_placeholder 

def fill_feed_dict(inputs_pl, output_pl): 
    print ('Filling feed dict') 
    inputs_placeholder, output_placeholder = placeholder_inputs(FLAGS.batch_size) 
    inputs = [] 
    outputs = [] 
    for i in range(FLAGS.batch_size): 
     input, output = generateTrial() 
     inputTensor = tf.pack(input) 
     inputs.append(input) 
     outputs.append(output) 
    inputs_placeholder = tf.pack(inputs) 
    outputs_placeholder = tf.pack(outputs) 

def run_training(): 
    input_placeholder, output_placeholder = placeholder_inputs(FLAGS.batch_size) 
    fill_feed_dict(input_placeholder, output_placeholder) 
    printTensor(input_placeholder) 
    printTensor(output_placeholder) 




run_training() 

出力はこのくらいが動作していることを示唆しています。特に、私は損失関数を定義する必要があります。また、私のネットワークからの出力が、さらなるトレーニングステップの推測を生成するために使用されるように物事を引き上げる必要があります。誰も助けることができますか?

答えて

1

このコードが得たいかどうかは分かりませんが、とにかく便利だと思います。平均2乗誤差は実際には反復に沿って減少していますが、予測するためのテストは行っていませんので、それはあなた次第です!

import tensorflow as tf 
import numpy as np 
from random import randint 

flags = tf.app.flags 
FLAGS = flags.FLAGS 
flags.DEFINE_integer('batch_size', 50, 'Batch size.') 
flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.') 
flags.DEFINE_integer('dim1', 3, 'layer size') 
flags.DEFINE_integer('training_epochs', 10, 'Number of passes through the main training loop') 
flag.DEFINE_integer('num_iters', 100, 'Number of iterations') 


def ezString(list): 
    #debugging code so I can see what is going on 
    listLength = len(list) 
    r = '' 
    for i in range(listLength): 
     value = list[i] 
     valueString = str(value) 
     r = r + ' ' 
     r = r + valueString 
    return r 

def generateTrial(): 
    inputs = np.zeros(2, dtype = np.float) 
    for i in range(2): 
     inputs[i] = randint(0, 1) 
    unknownInput = randint(0, 1) 
    um = 0 
    for j in range(2): 
     sum = sum + inputs[j] 
    sum = sum + unknownInput 
    inputTensor = np.asarray(inputs) 
    return inputTensor, sum 

def printTensor(tensor): 
    sh = tensor.get_shape() 
    print(sh) 

def placeholder_inputs(size): 
    output_placeholder = tf.placeholder(tf.float32, shape=(size)) 
    input_placeholder = tf.placeholder(tf.float32, shape=(size, 2)) 
    return input_placeholder, output_placeholder 

def fill_feed_dict(inputs_pl, output_pl): 
    inputs = [] 
    outputs = [] 
    for i in range(FLAGS.batch_size): 
     input, output = generateTrial() 
     inputs.append(input) 
     outputs.append(output) 

    return {inputs_pl: inputs, output_pl: outputs} 

def loss(y, pred): 
    return tf.reduce_mean(tf.pow(y - pred, 2)) 

def NN(x, y, W1, b1, W2, b2): 
    layer1 = tf.add(tf.matmul(x, W1), b1) 
    layer1 = tf.nn.relu(layer1) 
    output = tf.add(tf.matmul(layer1, W2), b2) 
    return output, loss(y, output) 

def get_params(dim_hidden): 
    with tf.variable_scope('nn_params'): 
     return tf.Variable(tf.truncated_normal([2, dim_hidden], stddev = 0.05)), tf.Variable(0.0, (dim_hidden)),\ 
     tf.Variable(tf.truncated_normal([dim_hidden, 1], stddev = 0.05)), tf.Variable(0.0, 1) 

def run_training(): 
    input_placeholder, output_placeholder = placeholder_inputs(FLAGS.batch_size) 
    W1, b1, W2, b2 = get_params(FLAGS.dim1) 
    pred, loss = NN(input_placeholder, output_placeholder, W1, b1, W2, b2) 
    optm = tf.train.AdamOptimizer(FLAGS.learning_rate).minimize(loss) 
    init = tf.initialize_all_variables() 
    sess = tf.Session() 
    sess.run(init) 

    for iters in range(FLAGS.num_iters): 
     l, _ = sess.run([loss, optm], feed_dict = fill_feed_dict(input_placeholder, output_placeholder)) 
     print l, iters + 1 
関連する問題