Các đơn vị:
Số lượng "tế bào thần kinh", hoặc "tế bào", hoặc bất cứ thứ gì lớp có bên trong nó.
Đây là một thuộc tính của mỗi lớp và vâng, nó liên quan đến hình dạng đầu ra (như chúng ta sẽ thấy sau). Trong ảnh của bạn, ngoại trừ lớp đầu vào, về mặt khái niệm khác với các lớp khác, bạn có:
- Lớp ẩn 1: 4 đơn vị (4 nơ ron)
- Lớp ẩn 2: 4 đơn vị
- Lớp cuối cùng: 1 đơn vị
Hình dạng
Hình dạng là hậu quả của cấu hình của mô hình. Hình dạng là các bộ dữ liệu biểu thị có bao nhiêu phần tử mà một mảng hoặc tenxơ có trong mỗi chiều.
Vd: một hình(30,4,10)
có nghĩa là một mảng hoặc tenxơ có 3 chiều, chứa 30 phần tử ở chiều thứ nhất, 4 trong giây và 10 trong thứ ba, tổng cộng 30 * 4 * 10 = 1200 phần tử hoặc số.
Hình dạng đầu vào
Những gì chảy giữa các lớp là tenor. Các tenxơ có thể được xem như ma trận, với hình dạng.
Trong Keras, bản thân lớp đầu vào không phải là một lớp, mà là một tenxơ. Đây là tenxơ bắt đầu mà bạn gửi đến lớp ẩn đầu tiên. Tenor này phải có hình dạng giống như dữ liệu đào tạo của bạn.
Ví dụ: nếu bạn có 30 hình ảnh 50x50 pixel trong RGB (3 kênh), hình dạng của dữ liệu đầu vào của bạn là (30,50,50,3)
. Sau đó, tenxơ lớp đầu vào của bạn, phải có hình dạng này (xem chi tiết trong phần "hình dạng trong máy ảnh").
Mỗi loại lớp yêu cầu đầu vào với một số kích thước nhất định:
Dense
các lớp yêu cầu đầu vào như (batch_size, input_size)
- hoặc là
(batch_size, optional,...,optional, input_size)
- Các lớp chập 2D cần đầu vào như:
- nếu sử dụng
channels_last
:(batch_size, imageside1, imageside2, channels)
- nếu sử dụng
channels_first
:(batch_size, channels, imageside1, imageside2)
- Kết cấu 1D và sử dụng các lớp lặp lại
(batch_size, sequence_length, features)
Bây giờ, hình dạng đầu vào là hình dạng duy nhất bạn phải xác định, bởi vì mô hình của bạn không thể biết nó. Chỉ có bạn biết rằng, dựa trên dữ liệu đào tạo của bạn.
Tất cả các hình dạng khác được tính toán tự động dựa trên các đơn vị và đặc thù của từng lớp.
Mối quan hệ giữa hình dạng và đơn vị - Hình dạng đầu ra
Với hình dạng đầu vào, tất cả các hình dạng khác là kết quả của các tính toán lớp.
"Đơn vị" của mỗi lớp sẽ xác định hình dạng đầu ra (hình dạng của tenxơ được tạo bởi lớp đó và đó sẽ là đầu vào của lớp tiếp theo).
Mỗi loại lớp hoạt động theo một cách riêng. Các lớp dày đặc có hình dạng đầu ra dựa trên "đơn vị", các lớp chập có hình dạng đầu ra dựa trên "bộ lọc". Nhưng nó luôn luôn dựa trên một số thuộc tính lớp. (Xem tài liệu cho những gì mỗi lớp đầu ra)
Hãy hiển thị những gì xảy ra với các lớp "Dày đặc", đây là loại được hiển thị trong biểu đồ của bạn.
Một lớp dày đặc có hình dạng đầu ra là (batch_size,units)
. Vì vậy, có, các đơn vị, thuộc tính của lớp, cũng xác định hình dạng đầu ra.
- Lớp ẩn 1: 4 đơn vị, hình dạng đầu ra :
(batch_size,4)
.
- Lớp ẩn 2: 4 đơn vị, hình dạng đầu ra :
(batch_size,4)
.
- Lớp cuối cùng: 1 đơn vị, hình dạng đầu ra :
(batch_size,1)
.
Trọng lượng
Trọng lượng sẽ được tính toán hoàn toàn tự động dựa trên hình dạng đầu vào và đầu ra. Một lần nữa, mỗi loại lớp hoạt động theo một cách nhất định. Nhưng các trọng số sẽ là một ma trận có khả năng biến đổi hình dạng đầu vào thành hình dạng đầu ra bằng một số thao tác toán học.
Trong một lớp dày đặc, trọng số nhân tất cả các đầu vào. Đó là một ma trận với một cột trên mỗi đầu vào và một hàng trên mỗi đơn vị, nhưng điều này thường không quan trọng đối với các công việc cơ bản.
Trong ảnh, nếu mỗi mũi tên có số nhân trên đó, tất cả các số cùng nhau sẽ tạo thành ma trận trọng số.
Hình dạng trong Keras
Trước đó, tôi đã đưa ra một ví dụ về 30 hình ảnh, 50x50 pixel và 3 kênh, có hình dạng đầu vào là (30,50,50,3)
.
Vì hình dạng đầu vào là hình dạng duy nhất bạn cần xác định, Keras sẽ yêu cầu nó trong lớp đầu tiên.
Nhưng trong định nghĩa này, Keras bỏ qua kích thước đầu tiên, đó là kích thước lô. Mô hình của bạn sẽ có thể xử lý bất kỳ kích thước lô nào, do đó bạn chỉ xác định các kích thước khác:
input_shape = (50,50,3)
#regardless of how many images I have, each image has this shape
Tùy chọn, hoặc khi được yêu cầu bởi một số loại mô hình nhất định, bạn có thể chuyển hình dạng chứa kích thước lô thông qua batch_input_shape=(30,50,50,3)
hoặc batch_shape=(30,50,50,3)
. Điều này giới hạn khả năng đào tạo của bạn đối với kích thước lô duy nhất này, vì vậy nó chỉ nên được sử dụng khi thực sự cần thiết.
Dù bạn chọn cách nào, các tenxơ trong mô hình sẽ có kích thước lô.
Vì vậy, ngay cả khi bạn đã sử dụng input_shape=(50,50,3)
, khi máy ảnh gửi tin nhắn cho bạn hoặc khi bạn in tóm tắt mô hình, nó sẽ hiển thị (None,50,50,3)
.
Kích thước đầu tiên là kích thước lô, None
bởi vì nó có thể thay đổi tùy thuộc vào số lượng ví dụ bạn cung cấp cho đào tạo. (Nếu bạn xác định rõ ràng kích thước lô, thì số bạn đã xác định sẽ xuất hiện thay vì None
)
Ngoài ra, trong các tác phẩm nâng cao, khi bạn thực sự hoạt động trực tiếp trên các thang đo (ví dụ bên trong các lớp Lambda hoặc trong chức năng mất), kích thước kích thước lô sẽ ở đó.
- Vì vậy, khi xác định hình dạng đầu vào, bạn bỏ qua kích thước lô:
input_shape=(50,50,3)
- Khi thực hiện các thao tác trực tiếp trên tenxơ, hình dạng sẽ lại
(30,50,50,3)
- Khi máy ảnh gửi cho bạn một tin nhắn, hình dạng sẽ là
(None,50,50,3)
hoặc (30,50,50,3)
, tùy thuộc vào loại tin nhắn mà nó gửi cho bạn.
Lờ mờ
Và cuối cùng, là dim
gì?
Nếu hình dạng đầu vào của bạn chỉ có một thứ nguyên, bạn không cần phải cung cấp dưới dạng một tuple, bạn đưa ra input_dim
dưới dạng số vô hướng.
Vì vậy, trong mô hình của bạn, nơi lớp đầu vào của bạn có 3 phần tử, bạn có thể sử dụng bất kỳ hai yếu tố nào sau đây:
input_shape=(3,)
- Dấu phẩy là cần thiết khi bạn chỉ có một chiều
input_dim = 3
Nhưng khi giao dịch trực tiếp với các tenxơ, thường dim
sẽ đề cập đến một tenor có bao nhiêu kích thước. Chẳng hạn, một tenxơ có hình dạng (25,10909) có 2 chiều.
Xác định hình ảnh của bạn trong Keras
Keras có hai cách để làm điều đó, Sequential
mô hình hoặc API chức năng Model
. Tôi không thích sử dụng mô hình tuần tự, sau này bạn sẽ phải quên nó đi bởi vì bạn sẽ muốn các mô hình có các nhánh.
PS: ở đây tôi bỏ qua các khía cạnh khác, chẳng hạn như chức năng kích hoạt.
Với mô hình tuần tự :
from keras.models import Sequential
from keras.layers import *
model = Sequential()
#start from the first hidden layer, since the input is not actually a layer
#but inform the shape of the input, with 3 elements.
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input
#further layers:
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer
Với Mô hình API chức năng :
from keras.models import Model
from keras.layers import *
#Start defining the input tensor:
inpTensor = Input((3,))
#create the layers and pass them the input tensor to get the output tensor:
hidden1Out = Dense(units=4)(inpTensor)
hidden2Out = Dense(units=4)(hidden1Out)
finalOut = Dense(units=1)(hidden2Out)
#define the model's start and end points
model = Model(inpTensor,finalOut)
Hình dạng của tenxơ
Hãy nhớ rằng bạn bỏ qua kích thước lô khi xác định lớp:
- inpTensor:
(None,3)
- hidden1Out:
(None,4)
- ẩn:
(None,4)
- cuối cùng:
(None,1)
input_shape=
tham số vẫn còn: giá trị đầu tiên của đối số đề cập đến? Tôi thấy những thứ như thếinput_shape=(728, )
, vì vậy trong đầu tôi, đối số đầu tiên đề cập đến các cột (cố định) và thứ hai cho các hàng (miễn phí để thay đổi). Nhưng làm thế nào điều này ngồi với thứ tự mảng lớn của Python?