如果我使用tensorflow.keras模型并调用model.fit(x, y)
(其中x
和y
是numpy数组),numpy数组的dtype
是否有影响?我是否应该尽量将dtype
设为尽可能小(例如,对于二进制数据使用int8
),还是这样做会给tensorflow/keras增加转换为浮点数的工作量?
回答:
你应该将输入转换为np.float32
,这是Keras的默认dtype。可以查阅如下:
import tensorflow as tftf.keras.backend.floatx()
'float32'
如果你给Keras的输入是np.float64
,它会发出警告:
import tensorflow as tffrom tensorflow.keras.layers import Dense from tensorflow.keras import Modelfrom sklearn.datasets import load_irisiris, 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 xmodel = MyModel()_ = model(X)
警告:tensorflow:层my_model正在将输入张量从dtype float64转换为该层的dtype float32,这是TensorFlow 2中的新行为。该层具有dtype float32,因为它的dtype默认为floatx。如果你打算在float32中运行该层,可以安全地忽略此警告。如果有疑问,此警告可能仅在你将TensorFlow 1.X模型移植到TensorFlow 2时才是一个问题。要将所有层的dtype默认为float64,请调用
tf.keras.backend.set_floatx('float64')
。要仅更改此层,请在层构造函数中传递dtype=’float64’。如果你是该层的作者,你可以通过在基础Layer构造函数中传递autocast=False来禁用自动转换。
使用Tensorflow进行训练时,可以使用8位输入,这称为量化。但在大多数情况下这是具有挑战性且不必要的(即,除非你需要在边缘设备上部署模型)。
简而言之 保持你的输入为np.float32
。另见此帖子。