184
164

More than 5 years have passed since last update.

# [TF]TensorflowのAPIについて

Last updated at Posted at 2016-02-16

# Constant Value Tensors

## zeros

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

``````import tensorflow as tf

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

[ 0.]
``````
``````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の例

``````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を指定する

``````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

dtypeが指定できない

``````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

``````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.]]
``````
``````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]]
``````
``````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を正規分布なランダム値で初期化する

``````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()
``````

## truncated_normal

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

``````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()
``````

## random_uniform

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

``````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()
``````

## set_random_seed

randomを使用すると再現性がなくなるが、seedを指定するとこで同じ値を取り出せる。

``````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]
``````
``````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]
``````
``````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)を取り出す。

``````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になっている。

``````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になっている。

``````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などで、後でサイズが決まるような場合に使用する。

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

``````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を使用する。

``````y = tf.ones(shape=tf.shape(x))
``````
``````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になってしまう。

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

<class 'list'>
``````

この場合はtf.packを使用してoperationにする。
この場合はtf.stackを使用してoperationにする。(packはstackになったようです)

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

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

# Slicing and Joining

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

## slice

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

``````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]]]
``````

``````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を結合する。

``````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.]]
``````

2次元のTensorで、Dimensionが0の場合は、結果はｚ１のように[[xxxx],[xxxx],[yyyy],[yyyy]...]という並びのTensorになる。
Dimensionが１の場合は、結果はｚ２のように[[xxxxyyyy],[xxxxyyyy],...]という並びのTensorになる。

``````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.]]
``````
``````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.]]]
``````
``````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を指定した次元方向に分割する

``````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次元方向に３つに分割した例

``````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

``````import tensorflow as tf

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

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

``````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]]
``````

１次元方向に２回繰り返した例

``````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]]
``````

０次元方向と１次元方向に２回繰り返した例

``````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]]
``````

``````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]]
``````

``````import tensorflow as tf

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

184
164
2

Register as a new user and use Qiita more conveniently

1. You get articles that match your needs
2. You can efficiently read back useful information
3. You can use dark theme
What you can do with signing up
184
164