TensorFlow > sine curveの学習 > weight and bias表示 > それらしい値を表示できたようだ

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

sine curveを学習した時のweightとbiasをC言語のツールで使うために出力しようとしている。

関連　http://qiita.com/7of9/items/b364d897b95476a30754

### get_model_variables()の返す値

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/api_docs/python/functions_and_classes/shard3/tf.contrib.framework.get_model_variables.md

上記によると
tf.contrib.framework.get_model_variables()は`a list of variables in collection with scope and suffix.`を返すようだ。
ということはsuffixで個々の値？を出力できるのだろう。

### code 

参考 [How to print the value of a Tensor object in TensorFlow?](http://stackoverflow.com/questions/33633370/how-to-print-the-value-of-a-tensor-object-in-tensorflow)

> answered May 31 at 10:28
> JeeZ
...
> print (sess.run(normal_rv))

sess.run()を使うとのこと。

こんな感じだろうか。

```py
      model_variables = slim.get_model_variables()
      for elem in model_variables:
        res = sess.run(elem)
        print res
```

以下のコードとした。

```linreg2_reprod.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import tensorflow as tf
import tensorflow.contrib.slim as slim

# ファイル名の Queue を作成
filename_queue = tf.train.string_input_producer(["input.csv"])

# CSV を parse
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
input1, output = tf.decode_csv(value, record_defaults=[[0.], [0.]])
inputs = tf.pack([input1])
output = tf.pack([output])

batch_size=4 # [4]
inputs_batch, output_batch = tf.train.shuffle_batch([inputs, output], batch_size, capacity=40, min_after_dequeue=batch_size)

input_ph = tf.placeholder("float", [None,1])
output_ph = tf.placeholder("float",[None,1])

## NN のグラフ生成
hiddens = slim.stack(input_ph, slim.fully_connected, [1,7,7,7], 
  activation_fn=tf.nn.sigmoid, scope="hidden")
prediction = slim.fully_connected(hiddens, 1, activation_fn=tf.nn.sigmoid, scope="output")
loss = tf.contrib.losses.mean_squared_error(prediction, output_ph)

#train_op = slim.learning.create_train_op(loss, tf.train.AdamOptimizer(0.01))
train_op = slim.learning.create_train_op(loss, tf.train.AdamOptimizer(0.001))

#def feed_dict(inputs, output):
#    return {input_ph: inputs.eval(), output_ph: output.eval()}


init_op = tf.initialize_all_variables()

#if 1 // show variables
#model_variables = slim.variables.get_variables()
#model_variables = slim.get_variables()
#model_variables = slim.get_model_variables()
#print model_variables
#print model_variables[0]
#print "VARIABLES", tf.get_collection(tf.GraphKeys.VARIABLES,scope='output')
#print "TRAINABLE_VARIABLES", tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,scope='output')
#print "TABLE_INITIALIZERS", tf.get_collection(tf.GraphKeys.TABLE_INITIALIZERS)
#print "SUMMARIES", tf.get_collection(tf.GraphKeys.SUMMARIES)
#print "QUEUE_RUNNERS", tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS)
#print ""
#sys.exit()
#endif

with tf.Session() as sess:
  coord = tf.train.Coordinator()
  threads = tf.train.start_queue_runners(sess=sess, coord=coord)

  try:
    sess.run(init_op)
    for i in range(30000): #[10000]
      inpbt, outbt = sess.run([inputs_batch, output_batch])
      _, t_loss = sess.run([train_op, loss], feed_dict={input_ph:inpbt, output_ph: outbt})

#if 1 // show variables
      model_variables = slim.get_model_variables()
      for elem in model_variables:
        res = sess.run(elem)
        print 'Line68:', res
      coord.request_stop()
      coord.join(threads)
      sys.exit()
#endif


      if (i+1) % 100 == 0:
        print("%d,%f" % (i+1, t_loss))
#        print("%d,%f,#step, loss" % (i+1, t_loss))
  finally:
    coord.request_stop()

  coord.join(threads)
```

```txt:結果
$ python linreg2_reprod.py
...
major: 6 minor: 1 memoryClockRate (GHz) 1.7715
pciBusID 0000:01:00.0
Total memory: 7.91GiB
Free memory: 7.45GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0)
Line68: [[ 0.94589925]]
Line68: [-0.00099828]
Line68: [[ 0.15489505 -0.67040539 -0.37120041 -0.57326907  0.66030556  0.56937599
   0.61653686]]
Line68: [-0.00099887  0.0009965   0.00099773  0.00099789 -0.00099908 -0.00099963
  0.00099783]
Line68: [[ 0.03091327 -0.03635821 -0.11330063  0.37608758  0.04179297 -0.41162547
   0.29026181]
 [-0.44189912  0.01253085 -0.08440933  0.42205667 -0.50114781 -0.55908924
   0.45049205]
 [ 0.16686913  0.09551693  0.32629153 -0.50930303 -0.50801337 -0.40856847
   0.43577355]
 [-0.00277449  0.07384727  0.01996554 -0.39363375  0.13418977 -0.52793413
   0.17117806]
 [-0.1087206  -0.04942479  0.48945561 -0.09312291  0.48900801 -0.36051333
  -0.03793412]
 [ 0.3897748   0.08573826  0.47367421  0.57270825 -0.33688992 -0.40961364
   0.48551279]
 [-0.49923599 -0.64370239  0.0455177  -0.24338391  0.15893711 -0.48385823
  -0.43445072]]
Line68: [-0.00099988  0.00099954 -0.00099987 -0.00099989 -0.00099962  0.00099965
  0.00099948]
Line68: [[ 0.03193286  0.09996852  0.18707725  0.40370801 -0.43075067  0.39302191
  -0.41768256]
 [ 0.39145246  0.46159855  0.59318084 -0.32160607  0.63763559 -0.43288895
   0.36401659]
 [-0.44538125  0.09591627 -0.49282449  0.02737544 -0.19565833  0.57365066
  -0.38456506]
 [-0.33688158 -0.14048897 -0.51101643 -0.60279489 -0.5617674   0.03322543
   0.50955415]
 [ 0.31675866 -0.52620232  0.08483043 -0.050979   -0.64664257  0.08840903
   0.03504052]
 [ 0.41301569 -0.51811165 -0.25201547 -0.61750001 -0.4783645  -0.1634451
  -0.50088382]
 [-0.08244981  0.22269434  0.47569817  0.63638896 -0.50700283 -0.65284562
   0.37371144]]
Line68: [ 0.00099998 -0.00099995 -0.00099998  0.00099998  0.00099997 -0.00099998
 -0.0009999 ]
Line68: [[-0.58056289]
 [ 0.239429  ]
 [ 0.70154941]
 [-0.46686992]
 [-0.5538711 ]
 [ 0.75470519]
 [ 0.11268931]]
Line68: [-0.001]
```

何か値が出てきた。

それぞれの値が何かについては未消化。

## 出力された値について

使用したネットワークはこちら。
http://qiita.com/7of9/items/c8c521fa808b133a801a#network

biasは7個。weightは7x7個というのが複数個あるだろう。

上の値の個数を数えてみた。
(scopeとかで絞り込みしてみた。)

- (scope='hidden')
  - 1 : 入力?
  - 1 : ?
  - 7 : weight(1層目)?
  - 7 : bias?
  - 7 x 7 : weight(2層目)?
  - 7 : bias?
  - 7 x 7 : weight(3層目)
  - 7 : bias?
- (scope='output')
  - 7 : weight? (出力層)
  - 1 : bias? (出力層)

なんとなく見えてきたかもしれない。

自分が作ったネットワーク図は間違っているのかもしれない。

```
hiddens = slim.stack(input_ph, slim.fully_connected, [1,7,7,7], 
  activation_fn=tf.nn.sigmoid, scope="hidden")
```

上記の場合、hiddenの１層目が1つのノードになっているかもしれない。

```
hiddens = slim.stack(input_ph, slim.fully_connected, [7,7,7], 
  activation_fn=tf.nn.sigmoid, scope="hidden")
```

にする前とした後の比較。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4f3790ac-0266-8110-784a-a2fffaaed149.png)


上記のweightとbiasをもとにネットワークを再構築して出力を計算できるようにするにはslim.fully_connected()の計算を再現することになる。
http://qiita.com/7of9/items/5f24c60360e7ba250732