テンソルフロー/ケラスニューラルネットワークへの入力用に、numpy配列がどのdtypeであるかは重要ですか?

Aug 15 2020

私はtensorflow.kerasモデルと電話を取る場合model.fit(x, y)xおよびyどのような問題ではないnumpyの配列です)dtypenumpyの配列がありますか?dtypeできるだけ小さくするのが最善int8ですか(バイナリデータなど)、またはこれにより、テンソルフロー/ケラスにフロートにキャストするための余分な作業が発生しますか?

回答

1 NicolasGervais Aug 15 2020 at 17:20

入力をnp.float32にキャストする必要があります。これはKerasのデフォルトのdtypeです。調べる:

import tensorflow as tf
tf.keras.backend.floatx()
'float32'

にKeras入力を与えるとnp.float64、次のように文句を言います。

import tensorflow as tf
from tensorflow.keras.layers import Dense 
from tensorflow.keras import Model
from sklearn.datasets import load_iris
iris, target = load_iris(return_X_y=True)

X = iris[:, :3]
y = iris[:, 3]

ds = tf.data.Dataset.from_tensor_slices((X, y)).shuffle(25).batch(8)

class MyModel(Model):
  def __init__(self):
    super(MyModel, self).__init__()
    self.d0 = Dense(16, activation='relu')
    self.d1 = Dense(32, activation='relu')
    self.d2 = Dense(1, activation='linear')

  def call(self, x):
    x = self.d0(x)
    x = self.d1(x)
    x = self.d2(x)
    return x

model = MyModel()

_ = model(X)

警告:tensorflow:Layer my_modelは、入力テンソルをdtype float64からレイヤーのdtypeであるfloat32にキャストしています。これは、TensorFlow2の新しい動作です。dtypeのデフォルトがfloatxであるため、レイヤーにはdtypefloat32があります。このレイヤーをfloat32で実行する場合は、この警告を無視しても問題ありません。疑わしい場合、この警告は、TensorFlow1.XモデルをTensorFlow2に移植する場合にのみ問題になる可能性があります。すべてのレイヤーをデフォルトでdtypefloat64に変更するには、を呼び出しますtf.keras.backend.set_floatx('float64')。このレイヤーだけを変更するには、dtype = 'float64'をレイヤーコンストラクターに渡します。このレイヤーの作成者である場合は、autocast = Falseをベースレイヤーコンストラクターに渡すことで、オートキャストを無効にできます。

量子化と呼ばれる8ビット入力でのトレーニングにTensorflowを使用することができます。ただし、ほとんどの場合(つまり、モデルをエッジデバイスに展開する必要がない限り)、困難で不要です。

tl; drは入力をnp.float32。に保持します。この投稿も参照してください。