numpy配列を機能とラベルとして使用して、TensorflowでKerasモデルをトレーニングするための簡単なコードがあります。次にtf.data.Dataset.from_tensor_slices
、テンソルフローデータセットを使用して同じKerasモデルをトレーニングするために、を使用してこれらのnumpy配列をラップすると、エラーが発生します。理由を理解できませんでした(テンソルフローまたはkerasのバグである可能性がありますが、何かが不足している可能性もあります)。私はPython3を使用しており、tensorflowは1.10.0、numpyは1.14.5、GPUは関与していません。
OBS1:tf.data.DatasetをKeras入力として使用する可能性は、https://www.tensorflow.org/guide/kerasの「Inputtf.datadatasets」の下に示されています。
OBS2:以下のコードでは、「#Train with numpy arrays
」の下のコードがnumpy配列を使用して実行されています。このコードにコメントを付け、#Train with tf.data datasets
代わりに「」の下のコードを使用すると、エラーが再現されます。
OBS3:コメントで「###WORKAROUND 1###
」で始まる13行目で、コメントを削除してに使用するtf.data.Dataset inputs
と、理由がよくわからなくてもエラーが変わります。
完全なコードは次のとおりです。
import tensorflow as tf
import numpy as np
np.random.seed(1)
tf.set_random_seed(1)
print(tf.__version__)
print(np.__version__)
#Import mnist dataset as numpy arrays
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()#Import
x_train, x_test = x_train / 255.0, x_test / 255.0 #normalizing
###WORKAROUND 1###y_train, y_test = (y_train.astype(dtype='float32'), y_test.astype(dtype='float32'))
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1]*x_train.shape[2])) #reshaping 28 x 28 images to 1D vectors, similar to Flatten layer in Keras
batch_size = 32
#Create a tf.data.Dataset object equivalent to this data
tfdata_dataset_train = tf.data.Dataset.from_tensor_slices((x_train, y_train))
tfdata_dataset_train = tfdata_dataset_train.batch(batch_size).repeat()
#Creates model
keras_model = tf.keras.models.Sequential([
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2, seed=1),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
#Compile the model
keras_model.compile(optimizer='adam',
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'])
#Train with numpy arrays
keras_training_history = keras_model.fit(x_train,
y_train,
initial_epoch=0,
epochs=1,
batch_size=batch_size
)
#Train with tf.data datasets
#keras_training_history = keras_model.fit(tfdata_dataset_train,
# initial_epoch=0,
# epochs=1,
# steps_per_epoch=60000//batch_size
# )
print(keras_training_history.history)
tf.data.Dataset
入力として使用するときに観察されるエラーは次のとおりです。
(...)
ValueError: Tensor conversion requested dtype uint8 for Tensor with dtype float32: 'Tensor("metrics/acc/Cast:0", shape=(?,), dtype=float32)'
During handling of the above exception, another exception occurred:
(...)
TypeError: Input 'y' of 'Equal' Op has type float32 that does not match type uint8 of argument 'x'.
上記のOBS3でコメントされているように、13行目からコメントを削除するときのエラーは次のとおりです。
(...)
tensorflow.python.framework.errors_impl.InvalidArgumentError: In[0] is not a matrix
[[Node: dense/MatMul = MatMul[T=DT_FLOAT, _class=["loc:@training/Adam/gradients/dense/MatMul_grad/MatMul_1"], transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_sequential_input_0_0, dense/MatMul/ReadVariableOp)]]
エラーを再現できたというコメントを含め、ご協力いただければ幸いです。その場合は、バグを報告できます。
tf-nightlyビルドをインストールし、いくつかのテンソルのdtypeを変更すると(tf-nightlyをインストールするとエラーが変化します)、問題が解決したので、(うまくいけば)1.11で解決される問題です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加