Giải thích đầu vào của Keras: input_shape, đơn vị, batch_size, dim, v.v.


262

Đối với bất kỳ lớp Keras nào ( Layerlớp), ai đó có thể giải thích cách hiểu sự khác biệt giữainput_shape , units, dim, vv?

Ví dụ, tài liệu nói units chỉ định hình dạng đầu ra của một lớp.

Trong hình ảnh của mạng lưới thần kinh dưới đây hidden layer1có 4 đơn vị. Điều này có trực tiếp dịch sang unitsthuộc tính củaLayer đối tượng? Hay unitstrong Keras bằng hình dạng của mọi trọng lượng trong lớp ẩn nhân với số đơn vị?

Nói tóm lại, làm thế nào để người ta hiểu / hình dung các thuộc tính của mô hình - cụ thể là các lớp - với hình ảnh bên dưới? nhập mô tả hình ảnh ở đây

Câu trả lời:


412

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ô, Nonebở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à dimgì?

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_dimdướ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 dimsẽ đề 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 đó, Sequentialmô 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)

7
Một câu hỏi về 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?
Maxim.K

17
Dấu phẩy đó không tạo ra chiều thứ hai. Đó chỉ là ký hiệu python để tạo một tuplechỉ chứa một phần tử. input_shape(728,)cũng giống như batch_input=(batch_size,728). Điều này có nghĩa là mỗi mẫu có 728 giá trị.
Daniel Möller

@ DanielMöller: bạn có thể vui lòng giải thích một chút về sự khác biệt giữa "yếu tố đầu vào" và "kích thước" là gì không? Tôi sẽ nghĩ rằng biểu đồ ở trên có lớp đầu vào ba chiều, do đó làm mờ = 3 , vì vậy tôi tự hỏi tôi đang thiếu gì ở đây, vì tôi thấy bạn viết rằng đầu vào là 1 chiều ...
Helen

1
Một vectơ có một chiều, nhưng nhiều yếu tố. Nó có hình dạng (n,) ---- Một ma trận có hai chiều, chiều 0 có m phần tử, chiều 1 có n phần tử, tổng các phần tử mxn, hình dạng (m, n). Nếu bạn tưởng tượng một "khối" được chia thành các khối nhỏ, mỗi khối nhỏ có dữ liệu, thì đây sẽ là 3D, với các phần tử mxnxo, hình dạng (m, n, o).
Daniel Möller

2
@Prince, vấn đề đặt hàng. Bạn có thể cấu hình Keras để sử dụng data_format = 'channels_first'hoặc data_format='channels_last'. Tôi khuyên bạn nên sử dụng luôn các kênh cuối cùng (mặc định của Keras). Nó tương thích hơn với tất cả các lớp khác.
Daniel Möller

11

Kích thước đầu vào được làm rõ:

Không phải là một câu trả lời trực tiếp, nhưng tôi chỉ nhận ra từ Kích thước đầu vào có thể đủ gây nhầm lẫn, vì vậy hãy cảnh giác:

Nó (kích thước từ một mình) có thể đề cập đến:

a) Kích thước của Dữ liệu đầu vào (hoặc luồng), chẳng hạn như # N của trục cảm biến để phát tín hiệu chuỗi thời gian hoặc kênh màu RGB (3): từ được đề xuất => "Kích thước InputStream"

b) Tổng số / chiều dài của Tính năng đầu vào (hoặc Lớp đầu vào) (28 x 28 = 784 cho hình ảnh màu MINST) hoặc 3000 trong Giá trị phổ biến đổi FFT, hoặc

"Lớp đầu vào / Kích thước tính năng đầu vào"

c) Thứ nguyên (# chiều) của đầu vào (thường là 3D như mong đợi trong Keras LSTM) hoặc (#RowofSamples, #of Senors, #of Values ​​..) 3 là câu trả lời.

"N Kích thước của đầu vào"

d) Hình dạng đầu vào CỤ THỂ (ví dụ: (30,50,50,3) trong dữ liệu hình ảnh đầu vào chưa được bao bọc này, hoặc (30, 250, 3) nếu các máy ảnh chưa được mở:

Máy ảnh có input_dim đề cập đến Kích thước của Lớp đầu vào / Số tính năng đầu vào

model = Sequential()
model.add(Dense(32, input_dim=784))  #or 3 in the current posted example above
model.add(Activation('relu'))

Trong Keras LSTM, nó đề cập đến tổng số bước thời gian

Thuật ngữ này rất khó hiểu, là chính xác và chúng ta sống trong một thế giới rất khó hiểu !!

Tôi thấy một trong những thách thức trong Machine Learning là đối phó với các ngôn ngữ hoặc phương ngữ và thuật ngữ khác nhau (như nếu bạn có 5-8 phiên bản tiếng Anh rất khác nhau, thì bạn cần phải thành thạo rất cao để giao tiếp với những người nói khác nhau). Có lẽ điều này cũng giống nhau trong các ngôn ngữ lập trình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.