Trình khởi tạo và Autograd API Python
Chương này đề cập đến autograd và API khởi tạo trong MXNet.
mxnet.autograd
Đây là API tự động của MXNet cho NDArray. Nó có lớp sau:
Lớp: Hàm ()
Nó được sử dụng để phân biệt tùy chỉnh trong autograd. Nó có thể được viết làmxnet.autograd.Function. Nếu vì bất kỳ lý do gì, người dùng không muốn sử dụng các gradient được tính toán theo quy tắc chuỗi mặc định, thì họ có thể sử dụng lớp Hàm của mxnet.autograd để tùy chỉnh sự khác biệt cho tính toán. Nó có hai phương thức là Forward () và Backward ().
Hãy để chúng tôi hiểu hoạt động của lớp này với sự trợ giúp của các điểm sau:
Đầu tiên, chúng ta cần xác định tính toán của chúng ta trong phương pháp chuyển tiếp.
Sau đó, chúng ta cần cung cấp sự khác biệt tùy chỉnh trong phương pháp lạc hậu.
Bây giờ trong quá trình tính toán gradient, thay vì hàm lùi do người dùng xác định, mxnet.autograd sẽ sử dụng hàm lùi do người dùng xác định. Chúng ta cũng có thể ép kiểu sang mảng numpy và lùi lại đối với một số thao tác tiến và lùi.
Example
Trước khi sử dụng lớp mxnet.autograd. Chức năng, hãy xác định một hàm sigmoid ổn định với các phương thức lùi và chuyển tiếp như sau:
class sigmoid(mx.autograd.Function):
def forward(self, x):
y = 1 / (1 + mx.nd.exp(-x))
self.save_for_backward(y)
return y
def backward(self, dy):
y, = self.saved_tensors
return dy * y * (1-y)
Bây giờ, lớp hàm có thể được sử dụng như sau:
func = sigmoid()
x = mx.nd.random.uniform(shape=(10,))
x.attach_grad()
with mx.autograd.record():
m = func(x)
m.backward()
dx_grad = x.grad.asnumpy()
dx_grad
Output
Khi bạn chạy mã, bạn sẽ thấy kết quả sau:
array([0.21458015, 0.21291625, 0.23330082, 0.2361367 , 0.23086983,
0.24060014, 0.20326573, 0.21093895, 0.24968489, 0.24301809],
dtype=float32)
Các phương thức và tham số của chúng
Sau đây là các phương thức và các tham số của lớp mxnet.autogard. Chức năng:
Các phương thức và các tham số của nó | Định nghĩa |
---|---|
về phía trước (đầu [, head_grads, giữ lại_graph,…]) | Phương pháp này được sử dụng để tính toán chuyển tiếp. |
lùi (đầu [, head_grads, giữ lại_graph,…]) | Phương pháp này được sử dụng để tính toán ngược. Nó tính toán độ dốc của phần đầu đối với các biến được đánh dấu trước đó. Phương pháp này sử dụng nhiều đầu vào như đầu ra của kỳ hạn. Nó cũng trả về nhiều NDArray như các đầu vào của phía trước. |
get_symbol (x) | Phương pháp này được sử dụng để truy xuất lịch sử tính toán được ghi lại như Symbol. |
grad (đầu, biến [, head_grads,…]) | Phương pháp này tính toán độ dốc của phần đầu đối với các biến. Sau khi được tính toán, thay vì lưu trữ vào variable.grad, các gradient sẽ được trả về dưới dạng NDArrays mới. |
is_recording () | Với sự trợ giúp của phương pháp này, chúng tôi có thể nhận được trạng thái ghi và không ghi. |
Đó là hành trình() | Với sự trợ giúp của phương pháp này, chúng tôi có thể nhận được tình trạng đào tạo và dự đoán. |
mark_variables (biến, gradient [, grad_reqs]) | Phương thức này sẽ đánh dấu NDArrays là các biến để tính toán gradient cho autograd. Phương thức này giống như hàm .attach_grad () trong một biến nhưng sự khác biệt duy nhất là với lệnh gọi này, chúng ta có thể đặt gradient thành bất kỳ giá trị nào. |
tạm dừng ([train_mode]) | Phương thức này trả về một ngữ cảnh phạm vi được sử dụng trong câu lệnh 'with' cho các mã không cần tính toán độ dốc. |
Pred_mode () | Phương thức này trả về một ngữ cảnh phạm vi được sử dụng trong câu lệnh 'with' trong đó hành vi chuyển tiếp được đặt thành chế độ suy luận và điều đó không thay đổi trạng thái ghi. |
bản ghi ([train_mode]) | Nó sẽ trả về một autograd ghi lại ngữ cảnh phạm vi được sử dụng trong câu lệnh 'with' và nắm bắt mã cần được tính toán độ dốc. |
set_recording (is_recording) | Tương tự như is_recoring (), với sự trợ giúp của phương thức này, chúng ta có thể nhận được trạng thái ghi và không ghi. |
set_training (is_training) | Tương tự như is_traininig (), với sự trợ giúp của phương thức này, chúng ta có thể đặt trạng thái thành huấn luyện hoặc dự đoán. |
train_mode () | Phương thức này sẽ trả về một ngữ cảnh phạm vi được sử dụng trong câu lệnh 'with' trong đó hành vi chuyển tiếp được đặt thành chế độ huấn luyện và điều đó không thay đổi trạng thái ghi. |
Ví dụ triển khai
Trong ví dụ dưới đây, chúng tôi sẽ sử dụng phương thức mxnet.autograd.grad () để tính toán gradient của head liên quan đến các biến -
x = mx.nd.ones((2,))
x.attach_grad()
with mx.autograd.record():
z = mx.nd.elemwise_add(mx.nd.exp(x), x)
dx_grad = mx.autograd.grad(z, [x], create_graph=True)
dx_grad
Output
Đầu ra được đề cập bên dưới -
[
[3.7182817 3.7182817]
<NDArray 2 @cpu(0)>]
Chúng ta có thể sử dụng phương thức mxnet.autograd.posystem_mode () để trả về một phạm vi được sử dụng trong câu lệnh 'with' -
with mx.autograd.record():
y = model(x)
with mx.autograd.predict_mode():
y = sampling(y)
backward([y])
mxnet.intializer
Đây là API của MXNet cho bộ khởi tạo cân. Nó có các lớp sau:
Các lớp và tham số của chúng
Sau đây là các phương thức và tham số của chúng mxnet.autogard.function lớp học:
Các lớp và các thông số của nó | Định nghĩa |
---|---|
Bilinear () | Với sự trợ giúp của lớp này, chúng ta có thể khởi tạo trọng lượng cho các lớp lấy mẫu lên. |
Giá trị hiện có) | Lớp này khởi tạo các trọng số thành một giá trị nhất định. Giá trị có thể là một đại lượng vô hướng cũng như NDArray phù hợp với hình dạng của tham số được đặt. |
FusedRNN (init, num_hiised, num_layers, mode) | Như tên của nó, lớp này khởi tạo các tham số cho các lớp Mạng thần kinh tái tạo (RNN) được hợp nhất. |
InitDesc | Nó hoạt động như bộ mô tả cho mẫu khởi tạo. |
Bộ khởi tạo (** kwargs) | Đây là lớp cơ sở của trình khởi tạo. |
LSTMBias ([quên_bias]) | Lớp này khởi tạo tất cả các thành kiến của một LSTMCell thành 0,0 nhưng ngoại trừ cổng quên có thiên vị được đặt thành giá trị tùy chỉnh. |
Tải (param [, default_init, verbose]) | Lớp này khởi tạo các biến bằng cách tải dữ liệu từ tệp hoặc từ điển. |
MSRAPrelu ([loại_số_lượng, độ dốc]) | Như tên của nó, lớp này Khởi tạo trọng lượng theo giấy MSRA. |
Hỗn hợp (mẫu, bộ khởi tạo) | Nó khởi tạo các tham số bằng nhiều bộ khởi tạo. |
Bình thường ([sigma]) | Lớp Normal () khởi tạo các trọng số với các giá trị ngẫu nhiên được lấy mẫu từ phân phối chuẩn với giá trị trung bình bằng 0 và độ lệch chuẩn (SD) là sigma. |
Một() | Nó khởi tạo các trọng số của tham số thành một. |
Trực giao ([scale, rand_type]) | Như tên của nó, lớp này khởi tạo trọng số dưới dạng ma trận trực giao. |
Đồng phục ([quy mô]) | Nó khởi tạo các trọng số với các giá trị ngẫu nhiên được lấy mẫu đồng nhất từ một phạm vi nhất định. |
Xavier ([rnd_type, factor_type, độ lớn]) | Nó thực sự trả về một trình khởi tạo thực hiện khởi tạo “Xavier” cho các trọng số. |
Số không() | Nó khởi tạo các trọng số của tham số bằng không. |
Ví dụ triển khai
Trong ví dụ dưới đây, chúng ta sẽ sử dụng lớp mxnet.init.Normal () để tạo một trình khởi tạo và truy xuất các tham số của nó -
init = mx.init.Normal(0.8)
init.dumps()
Output
Đầu ra được đưa ra dưới đây -
'["normal", {"sigma": 0.8}]'
Example
init = mx.init.Xavier(factor_type="in", magnitude=2.45)
init.dumps()
Output
Đầu ra được hiển thị bên dưới -
'["xavier", {"rnd_type": "uniform", "factor_type": "in", "magnitude": 2.45}]'
Trong ví dụ dưới đây, chúng tôi sẽ sử dụng lớp mxnet.initializer.Mixed () để khởi tạo các tham số bằng cách sử dụng nhiều trình khởi tạo -
init = mx.initializer.Mixed(['bias', '.*'], [mx.init.Zero(),
mx.init.Uniform(0.1)])
module.init_params(init)
for dictionary in module.get_params():
for key in dictionary:
print(key)
print(dictionary[key].asnumpy())
Output
Đầu ra được hiển thị bên dưới -
fullyconnected1_weight
[[ 0.0097627 0.01856892 0.04303787]]
fullyconnected1_bias
[ 0.]