web-dev-qa-db-ja.com

tfデータセット入力を使用したTensorflowkeras

私はテンソルフローケラとデータセットに不慣れです。次のコードが機能しない理由を誰かが理解するのを手伝ってもらえますか?

import tensorflow as tf
import tensorflow.keras as keras
import numpy as np
from tensorflow.python.data.ops import dataset_ops
from tensorflow.python.data.ops import iterator_ops
from tensorflow.python.keras.utils import multi_gpu_model
from tensorflow.python.keras import backend as K


data = np.random.random((1000,32))
labels = np.random.random((1000,10))
dataset = tf.data.Dataset.from_tensor_slices((data,labels))
print( dataset)
print( dataset.output_types)
print( dataset.output_shapes)
dataset.batch(10)
dataset.repeat(100)

inputs = keras.Input(shape=(32,))  # Returns a placeholder tensor

# A layer instance is callable on a tensor, and returns a tensor.
x = keras.layers.Dense(64, activation='relu')(inputs)
x = keras.layers.Dense(64, activation='relu')(x)
predictions = keras.layers.Dense(10, activation='softmax')(x)

# Instantiate the model given inputs and outputs.
model = keras.Model(inputs=inputs, outputs=predictions)

# The compile step specifies the training configuration.
model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),
          loss='categorical_crossentropy',
          metrics=['accuracy'])

# Trains for 5 epochs
model.fit(dataset, epochs=5, steps_per_Epoch=100)

次のエラーで失敗しました:

model.fit(x=dataset, y=None, epochs=5, steps_per_Epoch=100)
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 1510, in fit
validation_split=validation_split)
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 994, in _standardize_user_data
class_weight, batch_size)
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 1113, in _standardize_weights
exception_prefix='input')
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_utils.py", line 325, in standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking input: expected input_1 to have 2 dimensions, but got array with shape (32,)

Tf.kerasガイドによると、この例が示すように、データセットをmodel.fitに直接渡すことができるはずです。

Tf.dataデータセットを入力します

Datasets APIを使用して、大規模なデータセットまたはマルチデバイストレーニングにスケーリングします。 tf.data.Datasetインスタンスをfitメソッドに渡します。

# Instantiates a toy dataset instance:
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)
dataset = dataset.repeat()

データセットでfitを呼び出すときは、steps_per_Epochを指定することを忘れないでください。

model.fit(dataset、epochs = 10、steps_per_Epoch = 30)ここで、fitメソッドはsteps_per_Epoch引数を使用します。これは、モデルが次のエポックに移動する前に実行するトレーニングステップの数です。データセットはデータのバッチを生成するため、このスニペットはbatch_sizeを必要としません。

データセットは検証にも使用できます。

dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32).repeat()

val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_labels))
val_dataset = val_dataset.batch(32).repeat()

model.fit(dataset, epochs=10, steps_per_Epoch=30,
      validation_data=val_dataset,
      validation_steps=3)

私のコードの問題は何ですか、そしてそれを行う正しい方法は何ですか?

3
wxy

エラーが発生する理由に関する元の質問に対して:

_Error when checking input: expected input_1 to have 2 dimensions, but got array with shape (32,)
_

コードが壊れている理由は、次のように.batch()dataset変数に適用していないためです。

_dataset = dataset.batch(10)
_

単にdataset.batch()を呼び出しました。

batch()がないと、出力テンソルはバッチ処理されないため、これは機能しません。つまり、_(32,)_ではなく_(1,32)_の形状になります。

3
Roy Shilkrot

エラーが発生する理由であるイテレータの定義が欠落しています。

data = np.random.random((1000,32))
labels = np.random.random((1000,10))
dataset = tf.data.Dataset.from_tensor_slices((data,labels))
dataset = dataset.batch(10).repeat()
inputs = Input(shape=(32,))  # Returns a placeholder tensor

# A layer instance is callable on a tensor, and returns a tensor.
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# Instantiate the model given inputs and outputs.
model = keras.Model(inputs=inputs, outputs=predictions)

# The compile step specifies the training configuration.
model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),
          loss='categorical_crossentropy',
          metrics=['accuracy'])

# Trains for 5 epochs
model.fit(dataset.make_one_shot_iterator(), epochs=5, steps_per_Epoch=100)

エポック1/5100/100 [==============================]-1秒8ミリ秒/ステップ-損失:11.5787-acc :0.1010

エポック2/5100/100 [==============================]-0秒4ms /ステップ-損失:11.4846-acc :0.0990

エポック3/5100/100 [==============================]-0秒4ms /ステップ-損失:11.4690-acc :0.1270

エポック4/5100/100 [==============================]-0秒4ms /ステップ-損失:11.4611-acc :0.1300

エポック5/5100/100 [==============================]-0秒4ms /ステップ-損失:11.4546-acc :0.1360

これは私のシステムの結果です。

2
kvish