In [ ]:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
Note: これらのドキュメントは私たちTensorFlowコミュニティが翻訳したものです。コミュニティによる 翻訳はベストエフォートであるため、この翻訳が正確であることや英語の公式ドキュメントの 最新の状態を反映したものであることを保証することはできません。 この翻訳の品質を向上させるためのご意見をお持ちの方は、GitHubリポジトリtensorflow/docsにプルリクエストをお送りください。 コミュニティによる翻訳やレビューに参加していただける方は、 docs-ja@tensorflow.org メーリングリストにご連絡ください。
これは、下記の手法を示す TensorFlow の入門チュートリアルです。
tf.data.Dataset
のデモ
In [ ]:
!pip install tensorflow-gpu==2.0.0-rc1
In [ ]:
import tensorflow as tf
テンソルは多次元配列です。NumPy の ndarray
オブジェクトと同様に、tf.Tensor
にはデータ型と形状があります。これに加えて、tf.Tensor
は( GPU のような)アクセラレータのメモリに置くことができます。TensorFlow には、tf.Tensor
を使用し生成するたくさんの演算(tf.add, tf.matmul, tf.linalg.inv など)のライブラリが存在します。これらの演算では、ネイティブな Python データ型が自動変換されます。例を示します。
In [ ]:
print(tf.add(1, 2))
print(tf.add([1, 2], [3, 4]))
print(tf.square(5))
print(tf.reduce_sum([1, 2, 3]))
# Operator overloading is also supported
print(tf.square(2) + tf.square(3))
それぞれのtf.Tensor
には、形状とデータ型があります。
In [ ]:
x = tf.matmul([[1]], [[2, 3]])
print(x)
print(x.shape)
print(x.dtype)
NumPy 配列と tf.Tensor
の間のもっとも明確な違いは
TensorFlow のtf.Tensor
と NumPy の ndarray
間の変換は簡単です。
テンソルは .numpy()
メソッドを使って明示的に NumPy の ndarray に変換されます。NumPy のndarray と tf.Tensor
はその下敷きとなるメモリ上の表現が、できるかぎり共通化されているので、通常この変換のコストは小さいです。しかし、NumPy 配列はホスト側のメモリに置かれる一方、tf.Tensor
はGPU のメモリに置かれる可能性もあるため、下層の表現をいつも共通化できるとは限りません。また、変換にはGPU からホスト側メモリへのコピーも関わってきます。
In [ ]:
import numpy as np
ndarray = np.ones([3, 3])
print("TensorFlow演算によりnumpy配列は自動的にテンソルに変換される")
tensor = tf.multiply(ndarray, 42)
print(tensor)
print("またNumPy演算によりテンソルは自動的にnumpy配列に変換される")
print(np.add(tensor, 1))
print(".numpy()メソッドによりテンソルは明示的にnumpy配列に変換される")
print(tensor.numpy())
In [ ]:
x = tf.random.uniform([3, 3])
print("利用できるGPUはあるか: "),
print(tf.config.experimental.list_physical_devices("GPU"))
print("テンソルはGPU #0にあるか: "),
print(x.device.endswith('GPU:0'))
In [ ]:
import time
def time_matmul(x):
start = time.time()
for loop in range(10):
tf.matmul(x, x)
result = time.time()-start
print("10 loops: {:0.2f}ms".format(1000*result))
# CPUでの実行を強制
print("On CPU:")
with tf.device("CPU:0"):
x = tf.random.uniform([1000, 1000])
assert x.device.endswith("CPU:0")
time_matmul(x)
# GPU #0があればその上での実行を強制
if tf.config.experimental.list_physical_devices("GPU"):
print("On GPU:")
with tf.device("GPU:0"): # 2番めのGPUなら GPU:1, 3番目なら GPU:2 など
x = tf.random.uniform([1000, 1000])
assert x.device.endswith("GPU:0")
time_matmul(x)
このセクションでは tf.data.Dataset
API を使って、モデルにデータを供給するためのパイプラインを構築します。tf.data.Dataset
APIは、単純で再利用可能な部品をもとに、モデルの訓練あるいは評価ループにデータを供給する高性能で複雑な入力パイプラインを構築するために使われます。
Dataset
の作成Dataset.from_tensors やDataset.from_tensor_slices といったファクトリー関数または TextLineDataset あるいはTFRecordDataset のようなファイルを読み込むオブジェクトを使って、 元となるデータセットを作成しましょう。詳しくは、TensorFlow Dataset guide を参照してください。
In [ ]:
ds_tensors = tf.data.Dataset.from_tensor_slices([1, 2, 3, 4, 5, 6])
# CSVファイルを作成
import tempfile
_, filename = tempfile.mkstemp()
with open(filename, 'w') as f:
f.write("""Line 1
Line 2
Line 3
""")
ds_file = tf.data.TextLineDataset(filename)
In [ ]:
ds_tensors = ds_tensors.map(tf.square).shuffle(2).batch(2)
ds_file = ds_file.batch(2)
In [ ]:
print('ds_tensors の要素:')
for x in ds_tensors:
print(x)
print('\nds_file の要素:')
for x in ds_file:
print(x)