[TF]TensorflowのAPIについて

# Constant Value Tensors
## zeros
numpyのzerosみたいなもの
TensorのデータタイプとShapeを指定する

```python
import tensorflow as tf

x = tf.zeros([1], dtype=tf.float32)
with tf.Session() as sess:
    print(x.eval())

[ 0.]
```

```python
import tensorflow as tf

x = tf.zeros([10], dtype=tf.float32)
with tf.Session() as sess:
    print(x.eval())

[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
```
2x10のTensorの例

```python
import tensorflow as tf

x = tf.zeros([2,10], dtype=tf.float32)
with tf.Session() as sess:
    print(x.eval())

[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
```

## ones
numpyのonesみたいなもの
TensorのデータタイプとShapeを指定する


```python
import tensorflow as tf

x = tf.ones([2,10], dtype=tf.float32)
with tf.Session() as sess:
    print(x.eval())

[[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]]
```

## fill
定数のTensorを作る
dtypeが指定できない

```python
import tensorflow as tf

x = tf.fill([2,10], 9.)
with tf.Session() as sess:
    print(x.eval())

[[ 9.  9.  9.  9.  9.  9.  9.  9.  9.  9.]
 [ 9.  9.  9.  9.  9.  9.  9.  9.  9.  9.]]
```

## constant
定数のTensorを作る

```python
import tensorflow as tf

x = tf.constant(9,shape=[2,10],dtype=tf.float32)
with tf.Session() as sess:
    print(x.eval())

[[ 9.  9.  9.  9.  9.  9.  9.  9.  9.  9.]
 [ 9.  9.  9.  9.  9.  9.  9.  9.  9.  9.]]
```

```python
In [8]: x = tf.constant(9,shape=[2,10],dtype=tf.int32)
   ...: with tf.Session() as sess:
   ...:     print(x.eval())
   ...: 
   ...: 
[[9 9 9 9 9 9 9 9 9 9]
 [9 9 9 9 9 9 9 9 9 9]]
```

```python
import tensorflow as tf
import numpy as np

x = tf.constant(np.arange(20).astype(float),shape=[2,10],dtype=tf.float32)
with tf.Session() as sess:
    print(x.eval())

[[  0.   1.   2.   3.   4.   5.   6.   7.   8.   9.]
 [ 10.  11.  12.  13.  14.  15.  16.  17.  18.  19.]]
```

# Random Tensors
Tensorをランダムな値で初期化する。
Weightの初期化でよく使われる

## random_normal
Tensorを正規分布なランダム値で初期化する

```python
import tensorflow as tf

x = tf.random_normal(shape=[20000],mean=0.0, stddev=1.0,dtype=tf.float32)
with tf.Session() as sess:
    y = x.eval()
```
![random_normal.png](https://qiita-image-store.s3.amazonaws.com/0/100523/8c513eb2-a0d6-67e5-d664-32d1a68d6bd5.png)

## truncated_normal
Tensorを正規分布かつ標準偏差の２倍までのランダムな値で初期化する

```python
import tensorflow as tf

x = tf.truncated_normal(shape=[20000],mean=0.0, stddev=1.0,dtype=tf.float32)
with tf.Session() as sess:
    y = x.eval()
```
![truncated_normal.png](https://qiita-image-store.s3.amazonaws.com/0/100523/eb1e8fbd-1a71-8e12-16a5-cc6cce9a4def.png)

## random_uniform
Tensorを一様分布なランダム値で初期化する

```python
import tensorflow as tf

x = tf.random_uniform(shape=[20000], minval=-1.0,maxval=1.0,dtype=tf.float32)
with tf.Session() as sess:
    y = x.eval()
```
![random_uniform.png](https://qiita-image-store.s3.amazonaws.com/0/100523/09193cde-c3d9-2b08-4769-c3ba3cc8b8d9.png)

## set_random_seed
randomを使用すると再現性がなくなるが、seedを指定するとこで同じ値を取り出せる。
指定の仕方は、operationに指定するか、set_random_seedでgraph levelで指定する方法がある。

```python
import tensorflow as tf

a = tf.random_uniform([1])
print('session1')
with tf.Session() as sess:
    print(a.eval())
    print(a.eval())    


print('session2')
with tf.Session() as sess:
    print(a.eval())
    print(a.eval())  

session1
[ 0.85636878]
[ 0.81764412]
session2
[ 0.36246026]
[ 0.87940264]
```

```python
import tensorflow as tf

a = tf.random_uniform([1],seed=1234)
print('session1')
with tf.Session() as sess:
    print(a.eval())
    print(a.eval())    


print('session2')
with tf.Session() as sess:
    print(a.eval())
    print(a.eval())   
session1
[ 0.84830701]
[ 0.64822805]
session2
[ 0.84830701]
[ 0.64822805]
```

```python
import tensorflow as tf

tf.set_random_seed(1234)
a = tf.random_uniform([1])
b = tf.random_uniform([1])
print('session1')
with tf.Session() as sess:
    print(a.eval())
    print(a.eval())    
    print(b.eval())
    print(b.eval())


print('session2')
with tf.Session() as sess:
    print(a.eval())
    print(a.eval())
    print(b.eval())
    print(b.eval())

session1
[ 0.340114]
[ 0.65625393]
[ 0.78275204]
[ 0.14843035]
session2
[ 0.340114]
[ 0.65625393]
[ 0.78275204]
[ 0.14843035]
```
# Shapes and Shaping
## Shape
Tensorのサイズ（Sharp)を取り出す。

```python
import tensorflow as tf

x = tf.constant(np.arange(60.),shape=[3,4,5],dtype=tf.float32)    
with tf.Session() as sess:
    print(x.eval())

[[[  0.   1.   2.   3.   4.]
  [  5.   6.   7.   8.   9.]
  [ 10.  11.  12.  13.  14.]
  [ 15.  16.  17.  18.  19.]]

 [[ 20.  21.  22.  23.  24.]
  [ 25.  26.  27.  28.  29.]
  [ 30.  31.  32.  33.  34.]
  [ 35.  36.  37.  38.  39.]]

 [[ 40.  41.  42.  43.  44.]
  [ 45.  46.  47.  48.  49.]
  [ 50.  51.  52.  53.  54.]
  [ 55.  56.  57.  58.  59.]]]
```

get_shape()でサイズを取得する場合
TypeはTensorShapeになっている。

```python
import tensorflow as tf

s = x.get_shape()
print(type(s))
print(s)

<class 'tensorflow.python.framework.tensor_shape.TensorShape'>
(3, 4, 5)
```

tf.shape()でサイズを取得する場合
Typeはoperationになっている。

```python
import tensorflow as tf

s = tf.shape(x)
print(type(s))
print(s)
<class 'tensorflow.python.framework.ops.Tensor'>
Tensor("Shape:0", shape=(3,), dtype=int32)
```

## get_shape(), tf.shape()
tf.shape()はplaceholderなどで、後でサイズが決まるような場合に使用する。

```python
x = tf.placeholder(tf.float32, shape=[None,32])
```

例えばplaceholderと同じサイズのTensorを作る場合にget_shapeを使用するとエラーになる

```python
y = tf.ones(shape=x.get_shape())
Traceback (most recent call last):

  File "<ipython-input-23-366d94fbb0a4>", line 1, in <module>
    y = tf.ones(shape=x.get_shape())

  File "/home/user/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 699, in ones
    shape = ops.convert_to_tensor(shape, name="shape")

  File "/home/user/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 529, in convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)

  File "/home/user/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", line 195, in _tensor_shape_tensor_conversion_function
    "Cannot convert a partially known TensorShape to a Tensor: %s" % s)

ValueError: Cannot convert a partially known TensorShape to a Tensor: (?, 32)
```
このような場合にはtf.shapeを使用する。

```python
y = tf.ones(shape=tf.shape(x))
```

```python
import tensorflow as tf

x = tf.placeholder(tf.float32, shape=[None,32])
y = tf.ones(shape=tf.shape(x))

z = y + x
with tf.Session() as sess:    
    # sess.run(y)  
    b = np.arange(3*32).reshape((3,32))
    print(sess.run(z, feed_dict={x:b}))

[[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.  11.  12.  13.  14.
   15.  16.  17.  18.  19.  20.  21.  22.  23.  24.  25.  26.  27.  28.
   29.  30.  31.  32.]
 [ 33.  34.  35.  36.  37.  38.  39.  40.  41.  42.  43.  44.  45.  46.
   47.  48.  49.  50.  51.  52.  53.  54.  55.  56.  57.  58.  59.  60.
   61.  62.  63.  64.]
 [ 65.  66.  67.  68.  69.  70.  71.  72.  73.  74.  75.  76.  77.  78.
   79.  80.  81.  82.  83.  84.  85.  86.  87.  88.  89.  90.  91.  92.
   93.  94.  95.  96.]]
```

このようにtf.shapeの一部分を使用して[]でくくるとListになってしまう。

```python
print(type([tf.shape(x)[0],1]))

<class 'list'>
```
~~この場合はtf.packを使用してoperationにする。~~
この場合はtf.stackを使用してoperationにする。(packはstackになったようです)

```python
print(type(tf.stack([tf.shape(x)[0],1])))

<class 'tensorflow.python.framework.ops.Tensor'>
```

# Slicing and Joining
※concat,splitの引数の順番が変更になったので修正しました。

## slice
Tensorの一部分を取り出す。
beginで開始場所、sizeで切り出す大きさを指定する。

```python
import tensorflow as tf

n = np.arange(25).reshape((1,5,5))
x = tf.concat([n, n*10, n*100],0)
with tf.Session() as sess:   
    print(x.eval())

[[[   0    1    2    3    4]
  [   5    6    7    8    9]
  [  10   11   12   13   14]
  [  15   16   17   18   19]
  [  20   21   22   23   24]]

 [[   0   10   20   30   40]
  [  50   60   70   80   90]
  [ 100  110  120  130  140]
  [ 150  160  170  180  190]
  [ 200  210  220  230  240]]

 [[   0  100  200  300  400]
  [ 500  600  700  800  900]
  [1000 1100 1200 1300 1400]
  [1500 1600 1700 1800 1900]
  [2000 2100 2200 2300 2400]]]
```

下記の例では、６の位置から、０次元方向に３，１次元方向に２、３次元方向に４つ分取り出す。

```python
import tensorflow as tf

y = tf.slice(x, [0,1,1], [3,2,4])    
with tf.Session() as sess:   
    print(y.eval())

[[[   6    7    8    9]
  [  11   12   13   14]]

 [[  60   70   80   90]
  [ 110  120  130  140]]

 [[ 600  700  800  900]
  [1100 1200 1300 1400]]]
```

## concat
Tensorを結合する。

```python
import tensorflow as tf

x = tf.ones([3,4], dtype=tf.float32)
y = tf.constant(2,shape=[3,4], dtype=tf.float32)

with tf.Session() as sess:   
    print(x.eval())
    print(y.eval())

[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]]
[[ 2.  2.  2.  2.]
 [ 2.  2.  2.  2.]
 [ 2.  2.  2.  2.]]
```
~~最初の引数~~２番目の引数で結合するDimensionを決定する。
2次元のTensorで、Dimensionが0の場合は、結果はｚ１のように[[xxxx],[xxxx],[yyyy],[yyyy]...]という並びのTensorになる。
Dimensionが１の場合は、結果はｚ２のように[[xxxxyyyy],[xxxxyyyy],...]という並びのTensorになる。

```python
import tensorflow as tf

z1 = tf.concat([x, y],0)
z2 = tf.concat([x, y],1)
with tf.Session() as sess:   
    print('z1')
    print(z1.eval())
    print('z2')
    print(z2.eval())

z1
[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 2.  2.  2.  2.]
 [ 2.  2.  2.  2.]
 [ 2.  2.  2.  2.]]
z2
[[ 1.  1.  1.  1.  2.  2.  2.  2.]
 [ 1.  1.  1.  1.  2.  2.  2.  2.]
 [ 1.  1.  1.  1.  2.  2.  2.  2.]]
```


```python
import tensorflow as tf

x = tf.ones([3,4,5], dtype=tf.float32)
y = tf.constant(2,shape=[3,4,5], dtype=tf.float32)
with tf.Session() as sess:   
    print(x.eval())
    print(y.eval())

[[[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]]

 [[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]]

 [[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]]]
[[[ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]

 [[ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]

 [[ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]]
```

```python
import tensorflow as tf

z1 = tf.concat([x, y],0)
z2 = tf.concat([x, y],1)
z3 = tf.concat([x, y],2)
with tf.Session() as sess:   
    print('z1')
    print(z1.eval())
    print('z2')
    print(z2.eval())
    print('z3')
    print(z3.eval())

z1
[[[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]]

 [[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]]

 [[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]]

 [[ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]

 [[ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]

 [[ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]]
z2
[[[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]

 [[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]

 [[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]
  [ 2.  2.  2.  2.  2.]]]
z3
[[[ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]
  [ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]
  [ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]
  [ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]]

 [[ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]
  [ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]
  [ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]
  [ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]]

 [[ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]
  [ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]
  [ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]
  [ 1.  1.  1.  1.  1.  2.  2.  2.  2.  2.]]]
```

## split
Tensorを指定した次元方向に分割する

```python
import tensorflow as tf

n = np.arange(25).reshape((1,5,5))
x = tf.concat([n, n*10, n*100],0)
with tf.Session() as sess:   
    print(x.eval())

[[[   0    1    2    3    4]
  [   5    6    7    8    9]
  [  10   11   12   13   14]
  [  15   16   17   18   19]
  [  20   21   22   23   24]]

 [[   0   10   20   30   40]
  [  50   60   70   80   90]
  [ 100  110  120  130  140]
  [ 150  160  170  180  190]
  [ 200  210  220  230  240]]

 [[   0  100  200  300  400]
  [ 500  600  700  800  900]
  [1000 1100 1200 1300 1400]
  [1500 1600 1700 1800 1900]
  [2000 2100 2200 2300 2400]]]
```
0次元方向に３つに分割した例

```python
import tensorflow as tf

y1, y2, y3 = tf.split(x, 3, 0)
with tf.Session() as sess:
    print('y1')
    print(y1.eval())
    print('y2')
    print(y2.eval())
    print('y3')
    print(y3.eval())

y1
[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]
  [10 11 12 13 14]
  [15 16 17 18 19]
  [20 21 22 23 24]]]
y2
[[[  0  10  20  30  40]
  [ 50  60  70  80  90]
  [100 110 120 130 140]
  [150 160 170 180 190]
  [200 210 220 230 240]]]
y3
[[[   0  100  200  300  400]
  [ 500  600  700  800  900]
  [1000 1100 1200 1300 1400]
  [1500 1600 1700 1800 1900]
  [2000 2100 2200 2300 2400]]]
```

## tile

```python
import tensorflow as tf

x = tf.constant([[1,0],[0,1]])
with tf.Session() as sess:   
    print(x.eval())

[[1 0]
 [0 1]]
```
繰り返したい次元方向を指定する。下記は０次元方向に２回繰り返した例。

```python
import tensorflow as tf

y = tf.tile(x, [2,1])
with tf.Session() as sess:   
    print(y.eval())

[[1 0]
 [0 1]
 [1 0]
 [0 1]]
```
１次元方向に２回繰り返した例

```python
import tensorflow as tf

y = tf.tile(x, [1,2])
with tf.Session() as sess:   
    print(y.eval())

[[1 0 1 0]
 [0 1 0 1]]
```
０次元方向と１次元方向に２回繰り返した例

```python
import tensorflow as tf

y = tf.tile(x, [2,2])
with tf.Session() as sess:   
    print(y.eval())

[[1 0 1 0]
 [0 1 0 1]
 [1 0 1 0]
 [0 1 0 1]]
```

## pad
0 paddingする

```python
import tensorflow as tf

n = np.arange(25).reshape((5,5))
x = tf.constant(n)
with tf.Session() as sess:   
    print(x.eval())

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
```
topに１、bottomに２、leftに３、rightに４つ分０ paddingした例

```python
import tensorflow as tf

y = tf.pad(x,[[1,2],[3,4]])
with tf.Session() as sess:   
    print(y.eval())

[[ 0  0  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  1  2  3  4  0  0  0  0]
 [ 0  0  0  5  6  7  8  9  0  0  0  0]
 [ 0  0  0 10 11 12 13 14  0  0  0  0]
 [ 0  0  0 15 16 17 18 19  0  0  0  0]
 [ 0  0  0 20 21 22 23 24  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0]]
```

実行環境
Anaconda 4.4.0
python 3.5.3
tensorflow 1.3.0