GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
TensorFlow > sine curveの学習 > TensorFlowコードでpredictionをグラフ化してみた > sine curveになっていなかった > sine curveになった ( 誤差:0.01以下)
のTFRecords版を実装中。
ファイル書出し処理
import numpy as np
import random
import tensorflow as tf
"""
v0.1, Jul. 08, 2017
- add _int64_feature()
- add _bytes_feature()
"""
# on
# Ubuntu 16.04 LTS
# TensorFlow v1.1
# Python 3.5.2
# codingrule: PEP8
def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def _int64_feature(value):
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
OUT_FILE = 'input_170708.tfrecords'
NUM_DATA = 100
#
x_data = np.random.rand(NUM_DATA)
y_data = np.sin(2*np.pi*x_data) + 0.3 * np.random.rand()
with tf.python_io.TFRecordWriter(OUT_FILE) as tf_writer:
for xs, ys in zip(x_data, y_data):
x_org = np.array(xs, dtype=np.float32)
y_org = np.array(ys, dtype=np.float32)
x_raw = x_org.tostring()
y_raw = y_org.tostring()
example = tf.train.Example(features=tf.train.Features(feature={
'x_raw': _bytes_feature(x_raw),
'y_raw': _bytes_feature(y_raw)}))
tf_writer.write(example.SerializeToString())
for xs, ys in zip(x_data, y_data):
print('%.5f, %.5f' % (xs, ys))
テスト読込み処理
import numpy as np
import tensorflow as tf
# codingrule: PEP8
INP_FILE = 'input_170708.tfrecords'
record_iterator = tf.python_io.tf_record_iterator(path=INP_FILE)
for record in record_iterator:
example = tf.train.Example()
example.ParseFromString(record)
x_raw = (example.features.feature['x_raw']
.bytes_list
.value[0])
x_1d = np.fromstring(x_raw, dtype=np.float32)
x_org = x_1d.reshape([1, -1])
y_raw = (example.features.feature['y_raw']
.bytes_list
.value[0])
y_1d = np.fromstring(y_raw, dtype=np.float32)
y_org = y_1d.reshape([1, -1])
print(x_org, y_org)
$ python3 test_readTFRecord_170708.py | head
[[ 0.90197307]] [[-0.52444661]]
[[ 0.39993107]] [[ 0.64140004]]
[[ 0.75747746]] [[-0.94563216]]
[[ 0.16201401]] [[ 0.9043051]]
[[ 0.34640592]] [[ 0.8753475]]
[[ 0.45442739]] [[ 0.33570865]]
[[ 0.72813314]] [[-0.93731195]]
[[ 0.00909476]] [[ 0.11037734]]
[[ 0.50905269]] [[-0.00358463]]
[[ 0.36261058]] [[ 0.81321895]]
テスト読込みはできた。
v0.1
sessionでの使用 > 失敗
import numpy as np
import tensorflow as tf
import tensorflow.contrib.slim as slim
"""
v0.1 Jul. 08, 2017
- only read [.tfrecord]
+ add inputs_xy()
+ add read_and_decode()
"""
# codingrule: PEP8
IN_FILE = 'input_170708.tfrecords'
def read_and_decode(filename_queue):
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(
serialized_example,
features={
'x_raw': tf.FixedLenFeature([], tf.string),
'y_raw': tf.FixedLenFeature([], tf.string),
})
x_raw = tf.decode_raw(features['x_raw'], tf.float32)
y_raw = tf.decode_raw(features['y_raw'], tf.float32)
x_org = tf.reshape(x_raw, [1])
y_org = tf.reshape(y_raw, [1])
return x_org, y_org
def inputs_xy():
filename = IN_FILE
filequeue = tf.train.string_input_producer(
[filename], num_epochs=1)
x_org, y_org = read_and_decode(filequeue)
return x_org, y_org
x_orgs, y_orgs = inputs_xy()
batch_size = 1 # 4
x_batch, y_batch = tf.train.shuffle_batch([x_orgs, y_orgs],
batch_size,
capacity=10,
min_after_dequeue=7)
init_op = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init_op)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
ax, ay = sess.run([x_batch, y_batch])
print(ax, ay)
finally:
coord.request_stop()
以下のようなエラーが出る。
tensorflow.python.framework.errors_impl.OutOfRangeError: RandomShuffleQueue '_0_shuffle_batch/random_shuffle_queue' is closed and has insufficient elements (requested 1, current size 0)
[[Node: shuffle_batch = QueueDequeueManyV2[component_types=[DT_FLOAT, DT_FLOAT], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](shuffle_batch/random_shuffle_queue, shuffle_batch/n)]]
current size 0となる理由について調べているが、今のところ、よくわからない。
v0.2 > current size 0エラーの対処
変更箇所
TensorFlow ファイルからの入力のいろいろ
を参考に以下の変更をした。
# init_op = tf.initialize_all_variables()
init_op = [tf.initialize_all_variables(), tf.initialize_local_variables()]
code
import numpy as np
import tensorflow as tf
import tensorflow.contrib.slim as slim
"""
v0.2 Jul. 08, 2017
- fix bug > OutOfRangeError (current size 0)
+ use [tf.initialize_local_variables()]
v0.1 Jul. 08, 2017
- only read [.tfrecord]
+ add inputs_xy()
+ add read_and_decode()
"""
# codingrule: PEP8
IN_FILE = 'input_170708.tfrecords'
def read_and_decode(filename_queue):
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(
serialized_example,
features={
'x_raw': tf.FixedLenFeature([], tf.string),
'y_raw': tf.FixedLenFeature([], tf.string),
})
x_raw = tf.decode_raw(features['x_raw'], tf.float32)
y_raw = tf.decode_raw(features['y_raw'], tf.float32)
x_org = tf.reshape(x_raw, [1])
y_org = tf.reshape(y_raw, [1])
return x_org, y_org
def inputs_xy():
filename = IN_FILE
filequeue = tf.train.string_input_producer(
[filename], num_epochs=1)
x_org, y_org = read_and_decode(filequeue)
return x_org, y_org
x_orgs, y_orgs = inputs_xy()
batch_size = 1 # 4
x_batch, y_batch = tf.train.shuffle_batch([x_orgs, y_orgs],
batch_size,
capacity=10,
min_after_dequeue=7)
# init_op = tf.initialize_all_variables()
init_op = [tf.initialize_all_variables(), tf.initialize_local_variables()]
with tf.Session() as sess:
sess.run(init_op)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
ax, ay = sess.run([x_batch, y_batch])
print(ax, ay)
finally:
coord.request_stop()
実行
$ python3 learn_sineCurve_170708.py
...
2017-07-08 11:54:04.261826: I tensorflow/core/common_runtime/gpu/gpu_device.cc:908] DMA: 0
2017-07-08 11:54:04.261844: I tensorflow/core/common_runtime/gpu/gpu_device.cc:918] 0: Y
2017-07-08 11:54:04.261853: I tensorflow/core/common_runtime/gpu/gpu_device.cc:977] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0)
[[ 0.39993107]] [[ 0.64140004]]
current size 0エラーが出なくなり、ax, ayの値がprintされるようになりました。
@learn_tensorflow さん
情報感謝です。
別途、参考にしていたfully_connected_reader.pyにおいてもlocal_variablesの初期化をしていたようだ。
init_op = tf.group(tf.global_variables_initializer(),
tf.local_variables_initializer())