Có vấn đề gì không quan trọng loại dtype một mảng numpy cho đầu vào vào mạng nơron tensorflow / keras?

Aug 15 2020

Nếu tôi lấy một mô hình tensorflow.keras và gọi model.fit(x, y)(ở đâu xvà ở đâu ylà các mảng numpy) thì liệu dtypemảng numpy là gì? Tốt nhất là tôi chỉ nên làm cho nó dtypecàng nhỏ càng tốt (ví dụ: int8đối với dữ liệu nhị phân) hay điều này khiến tensorflow / keras phải làm việc thêm để truyền nó vào float?

Trả lời

1 NicolasGervais Aug 15 2020 at 17:20

Bạn nên truyền đầu vào của mình np.float32, đó là kiểu mặc định cho Keras. Tìm kiếm:

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

Nếu bạn nhập Keras vào np.float64, nó sẽ phàn nàn:

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)

CẢNH BÁO: tensorflow: Layer my_model đang truyền một tensor đầu vào từ kiểu float64 đến kiểu dtype float32 của lớp, đây là hành vi mới trong TensorFlow 2. Lớp có kiểu float32 vì kiểu dtype được mặc định là floatx. Nếu bạn định chạy lớp này trong float32, bạn có thể bỏ qua cảnh báo này một cách an toàn. Nếu nghi ngờ, cảnh báo này có thể chỉ là sự cố nếu bạn đang chuyển mô hình TensorFlow 1.X sang TensorFlow 2. Để thay đổi tất cả các lớp để có dtype float64 theo mặc định, hãy gọi tf.keras.backend.set_floatx('float64'). Để chỉ thay đổi lớp này, hãy truyền dtype = 'float64' cho hàm tạo lớp. Nếu bạn là tác giả của lớp này, bạn có thể vô hiệu hóa tính năng autocast bằng cách chuyển autocast = False đến phương thức khởi tạo của Lớp cơ sở.

Có thể sử dụng Tensorflow để đào tạo với đầu vào 8bit , được gọi là lượng tử hóa. Nhưng nó là thách thức và không cần thiết trong hầu hết các trường hợp (tức là, trừ khi bạn cần triển khai các mô hình của mình trên các thiết bị cạnh).

tl; dr giữ đầu vào của bạn np.float32. Xem thêm bài đăng này .