前提・実現したいこと
csvデータをpythonでライブラリnumpyやテンソルフローデータセットなどでパースしたい。
例えばbatch(4)であれば4つずつデータを分けていくはずなのですが、なぜbatch(32)としているのか、またそれをコメントアウトすることでなぜ以下のようなエラーが出るのか理由が明確にわからなくアドバイス頂けないでしょうか。
発生している問題・エラーメッセージ
tf.Tensor(7.7, shape=(), dtype=float32) tf.Tensor(2.6, shape=(), dtype=float32) tf.Tensor(2.3, shape=(), dtype=float32) --------------------------------------------------------------------------- InvalidArgumentError Traceback (most recent call last) <ipython-input-287-3286b6a94e0f> in <module>() 3 print(features[1]) 4 print(features[3]) ----> 5 print(label[0]) C:\ProgramData\Anaconda3\envs\tensorflow_hajimete\lib\site-packages\tensorflow\python\ops\array_ops.py in _slice_helper(tensor, slice_spec, var) 523 ellipsis_mask=ellipsis_mask, 524 var=var, --> 525 name=name) 526 527 C:\ProgramData\Anaconda3\envs\tensorflow_hajimete\lib\site-packages\tensorflow\python\ops\array_ops.py in strided_slice(input_, begin, end, strides, begin_mask, end_mask, ellipsis_mask, new_axis_mask, shrink_axis_mask, var, name) 689 ellipsis_mask=ellipsis_mask, 690 new_axis_mask=new_axis_mask, --> 691 shrink_axis_mask=shrink_axis_mask) 692 693 parent_name = name C:\ProgramData\Anaconda3\envs\tensorflow_hajimete\lib\site-packages\tensorflow\python\ops\gen_array_ops.py in strided_slice(input, begin, end, strides, begin_mask, end_mask, ellipsis_mask, new_axis_mask, shrink_axis_mask, name) 10555 else: 10556 message = e.message > 10557 _six.raise_from(_core._status_to_exception(e.code, message), None) 10558 10559 C:\ProgramData\Anaconda3\envs\tensorflow_hajimete\lib\site-packages\six.py in raise_from(value, from_value) InvalidArgumentError: Index out of range using input dim 0; input has only 0 dims [Op:StridedSlice] name: strided_slice/
該当のソースコード
python
1#IRIS prediction by TensorFlow 2#https://www.tensorflow.org/get_started/eager 3from __future__ import absolute_import, division, print_function 4 5import os 6import matplotlib.pyplot as plt 7 8import tensorflow as tf 9import tensorflow.contrib.eager as tfe 10 11 12## TensorFlowのバージョンチェック 13tf.enable_eager_execution() 14 15print("TensorFlow version: {}".format(tf.VERSION)) 16print("Eager execution: {}".format(tf.executing_eagerly())) 17 18 19 20## 訓練データ(CSV)を指定URLからダウンロード 21train_dataset_url = "http://download.tensorflow.org/data/iris_training.csv" 22 23train_dataset_fp = tf.keras.utils.get_file(fname=os.path.basename(train_dataset_url),origin=train_dataset_url) 24 25print("Local copy of the dataset file: {}".format(train_dataset_fp)) 26 27 28## ダウンロードしたデータを整形 29def parse_csv(line): 30 example_defaults = [[0.], [0.], [0.], [0.], [0]] # sets field types 31 parsed_line = tf.decode_csv(line, example_defaults) 32 # First 4 fields are features, combine into single tensor 33 features = tf.reshape(parsed_line[:-1], shape=(4,)) 34 # Last field is the label 35 label = tf.reshape(parsed_line[-1], shape=()) 36 return features, label 37 38 39## Create the training tf.data.Dataset 40train_dataset = tf.data.TextLineDataset(train_dataset_fp) 41train_dataset = train_dataset.skip(1) # skip the first header row 42train_dataset = train_dataset.map(parse_csv) # parse each row 43train_dataset = train_dataset.shuffle(buffer_size=1000) # randomize 44#train_dataset = train_dataset.batch(32) 45 46## View a single example entry from a batch 47features, label = tfe.Iterator(train_dataset).next() 48print(features[0]) 49print(features[1]) 50print(features[3]) 51print(label[0])
試したこと
.batch(32)の行のコメントアウトをはずした場合の出力は以下でした。
tf.Tensor([6.7 3.1 5.6 2.4], shape=(4,), dtype=float32) tf.Tensor([5.4 3.9 1.3 0.4], shape=(4,), dtype=float32) tf.Tensor([4.8 3. 1.4 0.3], shape=(4,), dtype=float32) tf.Tensor(2, shape=(), dtype=int32)
また、以下別サイト説明からも32区切りになるとは思うのですが、なぜ32なのか疑問です。
ここでは4つの葉の長さとそのラベルとして1つを足した5つのデータごとに区切り1つのレコードになっているはずです。
(別サイト説明)
補足情報(FW/ツールのバージョンなど)
win10
python 3.6
TensorFlow 1.12.0
あなたの回答
tips
プレビュー