Theano - Hướng dẫn nhanh

Bạn đã phát triển các mô hình Học máy bằng Python chưa? Sau đó, rõ ràng bạn biết sự phức tạp trong việc phát triển các mô hình này. Sự phát triển thường là một quá trình chậm chạp, mất hàng giờ và hàng ngày sức mạnh tính toán.

Việc phát triển mô hình Học máy đòi hỏi rất nhiều phép tính toán học. Những điều này thường yêu cầu tính toán số học, đặc biệt là các ma trận lớn có nhiều thứ nguyên. Ngày nay, chúng tôi sử dụng Mạng thần kinh thay vì các kỹ thuật thống kê truyền thống để phát triển các ứng dụng Học máy. Mạng thần kinh cần được đào tạo trên một lượng lớn dữ liệu. Việc đào tạo được thực hiện theo lô dữ liệu có kích thước hợp lý. Vì vậy, quá trình học là lặp đi lặp lại. Do đó, nếu các tính toán không được thực hiện một cách hiệu quả, việc đào tạo mạng có thể mất vài giờ hoặc thậm chí vài ngày. Do đó, mong muốn tối ưu hóa mã thực thi. Và đó chính xác là những gì Theano cung cấp.

Theano là một thư viện Python cho phép bạn xác định các biểu thức toán học được sử dụng trong Học máy, tối ưu hóa các biểu thức này và đánh giá chúng rất hiệu quả bằng cách sử dụng GPU một cách dứt khoát trong các lĩnh vực quan trọng. Nó có thể cạnh tranh với các triển khai C đầy đủ điển hình trong hầu hết các trường hợp.

Theano được viết tại phòng thí nghiệm LISA với mục đích cung cấp sự phát triển nhanh chóng của các thuật toán học máy hiệu quả. Nó được phát hành theo giấy phép BSD.

Trong hướng dẫn này, bạn sẽ học cách sử dụng thư viện Theano.

Theano có thể được cài đặt trên Windows, MacOS và Linux. Việc cài đặt trong tất cả các trường hợp là nhỏ. Trước khi cài đặt Theano, bạn phải cài đặt các phụ thuộc của nó. Sau đây là danh sách các phụ thuộc:

  • Python
  • NumPy - Bắt buộc
  • SciPy - Chỉ bắt buộc đối với Ma trận thưa và các chức năng đặc biệt
  • BLAS - Cung cấp các khối xây dựng tiêu chuẩn để thực hiện các phép toán cơ bản về vector và ma trận

Các gói tùy chọn mà bạn có thể chọn để cài đặt tùy thuộc vào nhu cầu của mình là -

  • mũi: Để chạy bộ thử nghiệm của Theano
  • Sphinx - Đối với tài liệu xây dựng
  • Graphiz và pydot - Để xử lý đồ họa và hình ảnh
  • Trình điều khiển NVIDIA CUDA - Bắt buộc để tạo / thực thi mã GPU
  • libgpuarray - Bắt buộc để tạo mã GPU / CPU trên các thiết bị CUDA và OpenCL

Chúng ta sẽ thảo luận về các bước cài đặt Theano trong MacOS.

Cài đặt MacOS

Để cài đặt Theano và các phụ thuộc của nó, bạn sử dụng piptừ dòng lệnh như sau. Đây là những phụ thuộc tối thiểu mà chúng ta cần trong hướng dẫn này.

$ pip install Theano
$ pip install numpy
$ pip install scipy
$ pip install pydot

Bạn cũng cần cài đặt công cụ nhà phát triển dòng lệnh OSx bằng lệnh sau:

$ xcode-select --install

Bạn sẽ thấy màn hình sau. Bấm vàoInstall để cài đặt công cụ.

Khi cài đặt thành công, bạn sẽ thấy thông báo thành công trên bảng điều khiển.

Kiểm tra cài đặt

Sau khi cài đặt hoàn tất thành công, hãy mở một sổ ghi chép mới trong Anaconda Jupyter. Trong ô mã, hãy nhập tập lệnh Python sau:

Thí dụ

import theano
from theano import tensor
a = tensor.dscalar()
b = tensor.dscalar()
c = a + b
f = theano.function([a,b], c)
d = f(1.5, 2.5)
print (d)

Đầu ra

Thực thi tập lệnh và bạn sẽ thấy kết quả sau:

4.0

Ảnh chụp màn hình của quá trình thực hiện được hiển thị bên dưới để bạn tham khảo nhanh -

Nếu bạn nhận được kết quả như trên thì quá trình cài đặt Theano của bạn đã thành công. Nếu không, hãy làm theo hướng dẫn gỡ lỗi trên trang tải xuống Theano để khắc phục sự cố.

Theano là gì?

Bây giờ bạn đã cài đặt thành công Theano, trước tiên chúng ta hãy thử tìm hiểu Theano là gì? Theano là một thư viện Python. Nó cho phép bạn xác định, tối ưu hóa và đánh giá các biểu thức toán học, đặc biệt là các biểu thức được sử dụng trong phát triển Mô hình Học máy. Bản thân Theano không chứa bất kỳ mô hình ML nào được xác định trước; nó chỉ tạo điều kiện cho sự phát triển của nó. Nó đặc biệt hữu ích trong khi xử lý các mảng nhiều chiều. Nó tích hợp liền mạch với NumPy, là một gói cơ bản và được sử dụng rộng rãi cho các tính toán khoa học bằng Python.

Theano tạo điều kiện thuận lợi cho việc xác định các biểu thức toán học được sử dụng trong phát triển ML. Các biểu thức như vậy thường liên quan đến Số học Ma trận, Phân biệt, Tính toán Gradient, v.v.

Trước tiên, Theano xây dựng toàn bộ Đồ thị tính toán cho mô hình của bạn. Sau đó, nó biên dịch nó thành mã hiệu quả cao bằng cách áp dụng một số kỹ thuật tối ưu hóa trên đồ thị. Mã đã biên dịch được đưa vào thời gian chạy Theano bằng một thao tác đặc biệt được gọi làfunctioncó sẵn trong Theano. Chúng tôi thực hiện điều nàyfunctionlặp đi lặp lại để đào tạo mạng nơ-ron. Thời gian đào tạo giảm đáng kể so với việc sử dụng mã hóa Python thuần túy hoặc thậm chí triển khai C đầy đủ.

Bây giờ chúng ta sẽ hiểu quá trình phát triển Theano. Chúng ta hãy bắt đầu với cách xác định một biểu thức toán học trong Theano.

Chúng ta hãy bắt đầu cuộc hành trình của mình về Theano bằng cách xác định và đánh giá một biểu hiện tầm thường trong Theano. Hãy xem xét biểu thức nhỏ sau đây có thêm hai đại lượng vô hướng:

c = a + b

Ở đâu a, b là các biến và clà đầu ra của biểu thức. Ở Theano, việc xác định và đánh giá ngay cả biểu hiện tầm thường này cũng rất khó.

Chúng ta hãy tìm hiểu các bước để đánh giá biểu thức trên.

Nhập khẩu Theano

Đầu tiên, chúng ta cần nhập thư viện Theano vào chương trình của mình, chúng ta thực hiện bằng cách sử dụng câu lệnh sau:

from theano import *

Thay vì nhập các gói riêng lẻ, chúng tôi đã sử dụng * trong câu lệnh trên để bao gồm tất cả các gói từ thư viện Theano.

Khai báo các biến

Tiếp theo, chúng ta sẽ khai báo một biến có tên là a sử dụng câu lệnh sau -

a = tensor.dscalar()

Các dscalarphương thức khai báo một biến vô hướng thập phân. Việc thực hiện câu lệnh trên tạo ra một biến được gọi làatrong mã chương trình của bạn. Tương tự như vậy, chúng tôi sẽ tạo biếnb sử dụng câu lệnh sau -

b = tensor.dscalar()

Xác định Biểu thức

Tiếp theo, chúng tôi sẽ xác định biểu thức của chúng tôi hoạt động trên hai biến này ab.

c = a + b

Trong Theano, việc thực hiện câu lệnh trên không thực hiện phép cộng vô hướng của hai biến ab.

Xác định chức năng Theano

Để đánh giá biểu thức trên, chúng ta cần xác định một hàm trong Theano như sau:

f = theano.function([a,b], c)

Chức năng functionnhận hai đối số, đối số đầu tiên là đầu vào của hàm và đối số thứ hai là đầu ra của nó. Khai báo trên nói rằng đối số đầu tiên thuộc kiểu mảng bao gồm hai phần tửab. Đầu ra là một đơn vị vô hướng được gọi làc. Hàm này sẽ được tham chiếu với tên biếnf trong mã tiếp theo của chúng tôi.

Gọi hàm Theano

Lời gọi hàm f được thực hiện bằng cách sử dụng câu lệnh sau:

d = f(3.5, 5.5)

Đầu vào cho hàm là một mảng bao gồm hai đại lượng vô hướng: 3.55.5. Đầu ra của thực thi được gán cho biến vô hướngd. Để in nội dung củad, chúng tôi sẽ sử dụng print tuyên bố -

print (d)

Việc thực thi sẽ gây ra giá trị của d được in trên bảng điều khiển, trong trường hợp này là 9.0.

Danh sách đầy đủ chương trình

Danh sách chương trình đầy đủ được đưa ra ở đây để bạn tham khảo nhanh -

from theano import *
a = tensor.dscalar()
b = tensor.dscalar()
c = a + b
f = theano.function([a,b], c)
d = f(3.5, 5.5)
print (d)

Thực thi đoạn mã trên và bạn sẽ thấy đầu ra là 9.0. Ảnh chụp màn hình được hiển thị ở đây -

Bây giờ, chúng ta hãy thảo luận về một ví dụ phức tạp hơn một chút để tính phép nhân của hai ma trận.

Chúng tôi sẽ tính tích một chấm của hai ma trận. Ma trận đầu tiên có kích thước 2 x 3 và ma trận thứ hai có kích thước 3 x 2. Các ma trận mà chúng tôi đã sử dụng làm đầu vào và tích của chúng được thể hiện ở đây -

$$ \ begin {bmatrix} 0 & -1 & 2 \\ 4 & 11 & 2 \ end {bmatrix} \: \ begin {bmatrix} 3 & -1 \\ 1 & 2 \\ 35 & 20 \ end {bmatrix} = \ begin {bmatrix} 11 & 0 \\ 35 & 20 \ end {bmatrix} $$

Khai báo các biến

Để viết một biểu thức Theano cho phần trên, trước tiên chúng ta khai báo hai biến để biểu diễn các ma trận của chúng ta như sau:

a = tensor.dmatrix()
b = tensor.dmatrix()

Dmatrix là Loại ma trận nhân đôi. Lưu ý rằng chúng tôi không chỉ định kích thước ma trận ở bất kỳ đâu. Do đó, các biến này có thể đại diện cho ma trận của bất kỳ thứ nguyên nào.

Xác định Biểu thức

Để tính toán sản phẩm chấm, chúng tôi đã sử dụng hàm tích hợp có tên dot như sau -

c = tensor.dot(a,b)

Đầu ra của phép nhân được gán cho một biến ma trận được gọi là c.

Xác định chức năng Theano

Tiếp theo, chúng ta xác định một hàm như trong ví dụ trước đó để đánh giá biểu thức.

f = theano.function([a,b], c)

Lưu ý rằng đầu vào cho hàm là hai biến a và b có kiểu ma trận. Đầu ra của hàm được gán cho biếnc mà sẽ tự động có kiểu ma trận.

Gọi hàm Theano

Bây giờ chúng ta gọi hàm bằng câu lệnh sau:

d = f([[0, -1, 2], [4, 11, 2]], [[3, -1],[1,2], [6,1]])

Hai biến trong câu lệnh trên là mảng NumPy. Bạn có thể xác định rõ ràng các mảng NumPy như được hiển thị ở đây -

f(numpy.array([[0, -1, 2], [4, 11, 2]]),
numpy.array([[3, -1],[1,2], [6,1]]))

Sau d được tính toán, chúng tôi in giá trị của nó -

print (d)

Bạn sẽ thấy kết quả sau trên đầu ra:

[[11. 0.]
[25. 20.]]

Danh sách đầy đủ chương trình

The complete program listing is given here:
from theano import *
a = tensor.dmatrix()
b = tensor.dmatrix()
c = tensor.dot(a,b)
f = theano.function([a,b], c)
d = f([[0, -1, 2],[4, 11, 2]], [[3, -1],[1,2],[6,1]])
print (d)

Ảnh chụp màn hình thực hiện chương trình được hiển thị ở đây -

Từ hai ví dụ trên, bạn có thể nhận thấy rằng trong Theano, chúng tôi tạo một biểu thức mà cuối cùng được đánh giá bằng cách sử dụng Theano function. Theano sử dụng các kỹ thuật tối ưu hóa nâng cao để tối ưu hóa việc thực thi một biểu thức. Để trực quan hóa biểu đồ tính toán, Theano cung cấpprinting gói trong thư viện của nó.

Biểu đồ tượng trưng cho phép cộng vô hướng

Để xem đồ thị tính toán cho chương trình cộng vô hướng của chúng tôi, hãy sử dụng thư viện in như sau:

theano.printing.pydotprint(f, outfile="scalar_addition.png", var_with_name_simple=True)

Khi bạn thực hiện câu lệnh này, một tệp được gọi là scalar_addition.pngsẽ được tạo trên máy của bạn. Biểu đồ tính toán đã lưu được hiển thị ở đây để bạn tham khảo nhanh -

Dưới đây là danh sách chương trình đầy đủ để tạo ra hình ảnh trên:

from theano import *
a = tensor.dscalar()
b = tensor.dscalar()
c = a + b
f = theano.function([a,b], c)
theano.printing.pydotprint(f, outfile="scalar_addition.png", var_with_name_simple=True)

Biểu đồ tượng trưng cho Hệ số ma trận

Bây giờ, hãy thử tạo đồ thị tính toán cho hệ số nhân ma trận của chúng ta. Dưới đây là danh sách đầy đủ để tạo biểu đồ này:

from theano import *
a = tensor.dmatrix()
b = tensor.dmatrix()
c = tensor.dot(a,b)
f = theano.function([a,b], c)
theano.printing.pydotprint(f, outfile="matrix_dot_product.png", var_with_name_simple=True)

Biểu đồ đã tạo được hiển thị ở đây -

Đồ thị phức tạp

Trong các biểu thức lớn hơn, các đồ thị tính toán có thể rất phức tạp. Một biểu đồ như vậy được lấy từ tài liệu của Theano được hiển thị ở đây -

Để hiểu hoạt động của Theano, điều quan trọng trước tiên là phải biết tầm quan trọng của các đồ thị tính toán này. Với sự hiểu biết này, chúng ta sẽ biết tầm quan trọng của Theano.

Tại sao lại là Theano?

Bằng cách nhìn vào độ phức tạp của các đồ thị tính toán, bây giờ bạn sẽ có thể hiểu mục đích đằng sau việc phát triển Theano. Một trình biên dịch điển hình sẽ cung cấp các tối ưu hóa cục bộ trong chương trình vì nó không bao giờ xem toàn bộ tính toán như một đơn vị duy nhất.

Theano thực hiện các kỹ thuật tối ưu hóa rất tiên tiến để tối ưu hóa đồ thị tính toán đầy đủ. Nó kết hợp các khía cạnh của Đại số với các khía cạnh của một trình biên dịch tối ưu hóa. Một phần của biểu đồ có thể được biên dịch thành mã ngôn ngữ C. Đối với các phép tính lặp lại, tốc độ đánh giá là rất quan trọng và Theano đáp ứng mục đích này bằng cách tạo ra một mã rất hiệu quả.

Bây giờ, bạn đã hiểu những điều cơ bản về Theano, hãy để chúng tôi bắt đầu với các kiểu dữ liệu khác nhau có sẵn cho bạn để tạo biểu thức của bạn. Bảng sau cung cấp cho bạn danh sách một phần các kiểu dữ liệu được xác định trong Theano.

Loại dữ liệu Loại Theano
Byte

bscalar, bvector, bmatrix, brow, bcol, btensor3, btensor4, btensor5, btensor6, btensor7

Số nguyên 16 bit

wscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4, wtensor5, wtensor6, wtensor7

Số nguyên 32 bit

iscalar, ivector, imatrix, irow, icol, itensor3, itensor4, itensor5, itensor6, itensor7

Số nguyên 64 bit

lscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4, ltensor5, ltensor6, ltensor7

Phao nổi

fscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4, ftensor5, ftensor6, ftensor7

gấp đôi

dscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4, dtensor5, dtensor6, dtensor7

phức tạp

cscalar, cvector, cmatrix, con quạ, ccol, ctensor3, ctensor4, ctensor5, ctensor6, ctensor7

Danh sách trên là không đầy đủ và người đọc được tham khảo tài liệu tạo tensor để có danh sách đầy đủ.

Bây giờ tôi sẽ cung cấp cho bạn một vài ví dụ về cách tạo các biến của nhiều loại dữ liệu khác nhau trong Theano.

Vô hướng

Để tạo một biến vô hướng, bạn sẽ sử dụng cú pháp:

Cú pháp

x = theano.tensor.scalar ('x')
x = 5.0
print (x)

Đầu ra

5.0

Mảng một chiều

Để tạo mảng một chiều, hãy sử dụng khai báo sau:

Thí dụ

f = theano.tensor.vector
f = (2.0, 5.0, 3.0)
print (f)f = theano.tensor.vector
f = (2.0, 5.0, 3.0)
print (f)
print (f[0])
print (f[2])

Đầu ra

(2.0, 5.0, 3.0)
2.0
3.0

Nếu bạn làm f[3] nó sẽ tạo ra một lỗi chỉ mục nằm ngoài phạm vi như được hiển thị ở đây -

print f([3])

Đầu ra

IndexError                          Traceback (most recent call last)
<ipython-input-13-2a9c2a643c3a> in <module>
   4 print (f[0])
   5 print (f[2])
----> 6 print (f[3])
IndexError: tuple index out of range

Mảng hai chiều

Để khai báo mảng hai chiều, bạn sẽ sử dụng đoạn mã sau:

Thí dụ

m = theano.tensor.matrix
m = ([2,3], [4,5], [2,4])
print (m[0])
print (m[1][0])

Đầu ra

[2, 3]
4

Mảng 5 chiều

Để khai báo một mảng 5 chiều, hãy sử dụng cú pháp sau:

Thí dụ

m5 = theano.tensor.tensor5
m5 = ([0,1,2,3,4], [5,6,7,8,9], [10,11,12,13,14])
print (m5[1])
print (m5[2][3])

Đầu ra

[5, 6, 7, 8, 9]
13

Bạn có thể khai báo mảng 3 chiều bằng cách sử dụng kiểu dữ liệu tensor3 thay cho tensor5, một mảng 4 chiều sử dụng kiểu dữ liệu tensor4, và như vậy cho đến tensor7.

Bộ tạo số nhiều

Đôi khi, bạn có thể muốn tạo các biến cùng kiểu trong một khai báo. Bạn có thể làm như vậy bằng cách sử dụng cú pháp sau:

Cú pháp

from theano.tensor import * x, y, z = dmatrices('x', 'y', 'z') 
x = ([1,2],[3,4],[5,6]) 
y = ([7,8],[9,10],[11,12]) 
z = ([13,14],[15,16],[17,18]) 
print (x[2]) 
print (y[1]) 
print (z[0])

Đầu ra

[5, 6] 
[9, 10] 
[13, 14]

Trong chương trước, trong khi thảo luận về các kiểu dữ liệu, chúng ta đã tạo và sử dụng các biến Theano. Để nhắc lại, chúng tôi sẽ sử dụng cú pháp sau để tạo một biến trong Theano:

x = theano.tensor.fvector('x')

Trong câu lệnh này, chúng tôi đã tạo một biến xcủa vectơ kiểu có chứa các phao 32-bit. Chúng tôi cũng đang đặt tên nó làx. Các tên thường hữu ích cho việc gỡ lỗi.

Để khai báo một vectơ gồm các số nguyên 32 bit, bạn sẽ sử dụng cú pháp sau:

i32 = theano.tensor.ivector

Ở đây, chúng tôi không chỉ định tên cho biến.

Để khai báo một vectơ ba chiều bao gồm các phao 64 bit, bạn sẽ sử dụng khai báo sau:

f64 = theano.tensor.dtensor3

Các kiểu khác nhau của hàm tạo cùng với kiểu dữ liệu của chúng được liệt kê trong bảng bên dưới:

Constructor Loại dữ liệu Kích thước
người ăn cắp float32 1
ivector int32 1
fscalar float32 0
fmatrix float32 2
ftensor3 float32 3
dtensor3 float64 3

Bạn có thể sử dụng một hàm tạo vectơ chung và chỉ định kiểu dữ liệu một cách rõ ràng như sau:

x = theano.tensor.vector ('x', dtype=int32)

Trong chương tiếp theo, chúng ta sẽ học cách tạo các biến dùng chung.

Đôi khi, bạn sẽ cần phải tạo các biến được chia sẻ giữa các hàm khác nhau và cả giữa nhiều lệnh gọi đến cùng một hàm. Để trích dẫn một ví dụ, trong khi đào tạo mạng nơ-ron, bạn tạo vectơ trọng số để gán trọng số cho từng đối tượng được xem xét. Vectơ này được sửa đổi trên mỗi lần lặp trong quá trình huấn luyện mạng. Do đó, nó phải có thể truy cập toàn cầu thông qua nhiều lệnh gọi đến cùng một chức năng. Vì vậy, chúng tôi tạo một biến chia sẻ cho mục đích này. Thông thường, Theano di chuyển các biến được chia sẻ như vậy sang GPU, miễn là có sẵn một biến. Điều này tăng tốc độ tính toán.

Cú pháp

Bạn tạo một biến chia sẻ, bạn sử dụng cú pháp sau:

import numpy
W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')

Thí dụ

Ở đây mảng NumPy bao gồm bốn số dấu phẩy động được tạo. Để đặt / lấyW giá trị bạn sẽ sử dụng đoạn mã sau -

import numpy
W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
print ("Original: ", W.get_value())
print ("Setting new values (0.5, 0.2, 0.4, 0.2)")
W.set_value([0.5, 0.2, 0.4, 0.2])
print ("After modifications:", W.get_value())

Đầu ra

Original: [0.1 0.25 0.15 0.3 ]
Setting new values (0.5, 0.2, 0.4, 0.2)
After modifications: [0.5 0.2 0.4 0.2]

Theano functionhoạt động giống như một cái móc để tương tác với biểu đồ tượng trưng. Một biểu đồ tượng trưng được biên dịch thành một mã thực thi hiệu quả cao. Nó đạt được điều này bằng cách cấu trúc lại các phương trình toán học để làm cho chúng nhanh hơn. Nó biên dịch một số phần của biểu thức thành mã ngôn ngữ C. Nó di chuyển một số bộ căng đến GPU, v.v.

Mã đã biên dịch hiệu quả hiện được cung cấp làm đầu vào cho Theano function. Khi bạn thực hiện Theanofunction, nó gán kết quả tính toán cho các biến do chúng tôi chỉ định. Loại tối ưu hóa có thể được chỉ định là FAST_COMPILE hoặc FAST_RUN. Điều này được chỉ định trong biến môi trường THEANO_FLAGS.

A Theano function được khai báo bằng cú pháp sau:

f = theano.function ([x], y)

Tham số đầu tiên [x] là danh sách các biến đầu vào và tham số thứ hai y là danh sách các biến đầu ra.

Bây giờ đã hiểu những điều cơ bản về Theano, chúng ta hãy bắt đầu viết mã Theano với một ví dụ nhỏ.

Theano khá hữu ích trong việc đào tạo mạng nơ-ron nơi chúng ta phải tính toán nhiều lần chi phí và độ dốc để đạt được mức tối ưu. Trên các tập dữ liệu lớn, điều này trở nên chuyên sâu về mặt tính toán. Theano thực hiện điều này một cách hiệu quả do các tối ưu hóa nội bộ của đồ thị tính toán mà chúng ta đã thấy trước đó.

Báo cáo vấn đề

Bây giờ chúng ta sẽ học cách sử dụng thư viện Theano để đào tạo một mạng. Chúng ta sẽ lấy một trường hợp đơn giản khi chúng ta bắt đầu với tập dữ liệu bốn tính năng. Chúng tôi tính tổng các tính năng này sau khi áp dụng một trọng số (tầm quan trọng) nhất định cho mỗi tính năng.

Mục tiêu của khóa đào tạo là sửa đổi trọng số được chỉ định cho từng đối tượng địa lý để tổng đạt giá trị mục tiêu là 100.

sum = f1 * w1 + f2 * w2 + f3 * w3 + f4 * w4

Ở đâu f1, f2, ... là các giá trị tính năng và w1, w2, ... là các trọng số.

Hãy để tôi lượng hóa ví dụ để hiểu rõ hơn về câu lệnh vấn đề. Chúng tôi sẽ giả định giá trị ban đầu là 1,0 cho mỗi tính năng và chúng tôi sẽ lấy w1 bằng0.1, w2 bằng 0.25, w3 bằng 0.15w4 bằng 0.3. Không có logic nhất định trong việc ấn định các giá trị trọng số, nó chỉ là trực giác của chúng ta. Do đó, tổng ban đầu như sau:

sum = 1.0 * 0.1 + 1.0 * 0.25 + 1.0 * 0.15 + 1.0 * 0.3

Tổng số tiền là 0.8. Bây giờ, chúng ta sẽ tiếp tục sửa đổi phép gán trọng số để tổng này đạt tới 100. Giá trị kết quả hiện tại của0.8 cách xa giá trị mục tiêu mong muốn của chúng tôi là 100. Theo thuật ngữ Học máy, chúng tôi xác định costlà sự khác biệt giữa giá trị đích trừ đi giá trị đầu ra hiện tại, thường được bình phương để giải quyết lỗi. Chúng tôi giảm chi phí này trong mỗi lần lặp bằng cách tính toán độ dốc và cập nhật vectơ trọng số của chúng tôi.

Hãy để chúng tôi xem toàn bộ logic này được thực hiện như thế nào trong Theano.

Khai báo các biến

Đầu tiên chúng ta khai báo vector đầu vào x như sau:

x = tensor.fvector('x')

Ở đâu x là một mảng các giá trị float đơn chiều.

Chúng tôi xác định một đại lượng vô hướng target biến như được đưa ra bên dưới -

target = tensor.fscalar('target')

Tiếp theo, chúng tôi tạo một tensor trọng số W với các giá trị ban đầu như đã thảo luận ở trên -

W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')

Xác định Biểu thức Theano

Bây giờ chúng ta tính toán đầu ra bằng cách sử dụng biểu thức sau:

y = (x * W).sum()

Lưu ý rằng trong câu lệnh trên xWlà các vectơ và không phải là các biến vô hướng đơn giản. Bây giờ chúng ta tính toán sai số (chi phí) với biểu thức sau:

cost = tensor.sqr(target - y)

Chi phí là sự khác biệt giữa giá trị mục tiêu và sản lượng hiện tại, bình phương.

Để tính toán độ dốc cho chúng ta biết chúng ta còn cách mục tiêu bao xa, chúng ta sử dụng grad phương pháp như sau -

gradients = tensor.grad(cost, [W])

Bây giờ chúng tôi cập nhật weights vectơ bằng cách lấy tốc độ học là 0.1 như sau -

W_updated = W - (0.1 * gradients[0])

Tiếp theo, chúng ta cần cập nhật vectơ trọng số của mình bằng cách sử dụng các giá trị trên. Chúng tôi thực hiện điều này trong tuyên bố sau:

updates = [(W, W_updated)]

Xác định / Gọi hàm Theano

Cuối cùng, chúng tôi xác định một function trong Theano để tính tổng.

f = function([x, target], y, updates=updates)

Để gọi hàm trên một số lần nhất định, chúng ta tạo for vòng lặp như sau -

for i in range(10):
output = f([1.0, 1.0, 1.0, 1.0], 100.0)

Như đã nói trước đó, đầu vào cho hàm là một vectơ chứa các giá trị ban đầu cho bốn đối tượng - chúng tôi gán giá trị của 1.0cho từng tính năng mà không có bất kỳ lý do cụ thể nào. Bạn có thể gán các giá trị khác nhau mà bạn chọn và kiểm tra xem cuối cùng hàm có hội tụ hay không. Chúng tôi sẽ in các giá trị của vector trọng số và đầu ra tương ứng trong mỗi lần lặp. Nó được hiển thị trong đoạn mã dưới đây -

print ("iteration: ", i)
print ("Modified Weights: ", W.get_value())
print ("Output: ", output)

Danh sách đầy đủ chương trình

Danh sách chương trình đầy đủ được sao chép ở đây để bạn tham khảo nhanh -

from theano import *
import numpy

x = tensor.fvector('x')
target = tensor.fscalar('target')

W = theano.shared(numpy.asarray([0.1, 0.25, 0.15, 0.3]), 'W')
print ("Weights: ", W.get_value())

y = (x * W).sum()
cost = tensor.sqr(target - y)
gradients = tensor.grad(cost, [W])
W_updated = W - (0.1 * gradients[0])
updates = [(W, W_updated)]

f = function([x, target], y, updates=updates)
for i in range(10):
   output = f([1.0, 1.0, 1.0, 1.0], 100.0)
   print ("iteration: ", i)
   print ("Modified Weights: ", W.get_value())
   print ("Output: ", output)

Khi bạn chạy chương trình, bạn sẽ thấy kết quả sau:

Weights: [0.1 0.25 0.15 0.3 ]
iteration: 0
Modified Weights: [19.94 20.09 19.99 20.14]
Output: 0.8
iteration: 1
Modified Weights: [23.908 24.058 23.958 24.108]
Output: 80.16000000000001
iteration: 2
Modified Weights: [24.7016 24.8516 24.7516 24.9016]
Output: 96.03200000000001
iteration: 3
Modified Weights: [24.86032 25.01032 24.91032 25.06032]
Output: 99.2064
iteration: 4
Modified Weights: [24.892064 25.042064 24.942064 25.092064]
Output: 99.84128
iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]
Output: 99.968256
iteration: 6
Modified Weights: [24.89968256 25.04968256 24.94968256 25.09968256]
Output: 99.9936512
iteration: 7
Modified Weights: [24.89993651 25.04993651 24.94993651 25.09993651]
Output: 99.99873024
iteration: 8
Modified Weights: [24.8999873 25.0499873 24.9499873 25.0999873]
Output: 99.99974604799999
iteration: 9
Modified Weights: [24.89999746 25.04999746 24.94999746 25.09999746]
Output: 99.99994920960002

Quan sát rằng sau bốn lần lặp lại, kết quả đầu ra là 99.96 và sau năm lần lặp lại, nó là 99.99, gần với mục tiêu mong muốn của chúng tôi là 100.0.

Tùy thuộc vào độ chính xác mong muốn, bạn có thể kết luận một cách an toàn rằng mạng được huấn luyện trong 4 đến 5 lần lặp. Sau khi quá trình huấn luyện hoàn thành, hãy tra cứu vectơ trọng số, sau 5 lần lặp sẽ nhận các giá trị sau:

iteration: 5
Modified Weights: [24.8984128 25.0484128 24.9484128 25.0984128]

Bây giờ bạn có thể sử dụng các giá trị này trong mạng của mình để triển khai mô hình.

Việc xây dựng mô hình Học máy liên quan đến các tính toán chuyên sâu và lặp đi lặp lại liên quan đến các tensors. Những điều này đòi hỏi tài nguyên máy tính chuyên sâu. Như một trình biên dịch thông thường sẽ cung cấp các tối ưu hóa ở cấp cục bộ, nó thường không tạo ra mã thực thi nhanh.

Đầu tiên Theano xây dựng một đồ thị tính toán cho toàn bộ quá trình tính toán. Vì toàn bộ bức tranh tính toán có sẵn dưới dạng một hình ảnh duy nhất trong quá trình biên dịch, một số kỹ thuật tối ưu hóa có thể được áp dụng trong quá trình biên dịch trước và đó chính xác là những gì Theano làm. Nó cấu trúc lại đồ thị tính toán, một phần chuyển nó thành C, chuyển các biến được chia sẻ sang GPU, v.v. để tạo mã thực thi rất nhanh. Sau đó, mã đã biên dịch được thực thi bởi một Theanofunctionmà chỉ hoạt động như một móc để đưa mã đã biên dịch vào thời gian chạy. Theano đã chứng minh được uy tín của mình và được chấp nhận rộng rãi trong cả học thuật và công nghiệp.