Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lab3 :2.2 Output Layer(s) (models.py:EX5) #16

Open
foivospar opened this issue Jan 8, 2020 · 2 comments
Open

Lab3 :2.2 Output Layer(s) (models.py:EX5) #16

foivospar opened this issue Jan 8, 2020 · 2 comments

Comments

@foivospar
Copy link

Για ένα layer με μία μη γραμμική συνάρτηση ενεργοποίησης (π.χ. Relu), πώς μπορώ να επιλέξω εγώ τη διάσταση για την έξοδο του layer όπως λέει η εκφώνηση ; Απ'ότι έχω καταλάβει, η μη γραμμική συνάρτηση εφαρμόζεται element-wise στην είσοδο, οπότε η διάσταση εξόδου καθορίζεται από τη διάσταση εισόδου.

@georgepar
Copy link

Οκ ας πάρουμε την απλή περίπτωση ενός fully connected (torch.nn.Linear) layer με ReLU activation.
Η πράξη που θες να κάνεις εδώ είναι

y = relu(x * W^T + b)

Εδώ όταν δημιουργείς το layer ορίζεις input και output size που είναι οι διαστάσεις του πίνακα W.

Οπότε το activation εφαρμόζεται elementwise πάνω στο x*W^T + b και το μέγεθος αυτού καθορίζεται από το W

Σου στέλνω και ένα toy example με κώδικα

In [21]: import torch                                                                                                                                                                                              

In [22]: layer = torch.nn.Linear(10, 5)  # fully connected layer with input_size=10, output_size=5                                                                                                                 

In [23]: x = torch.rand(32, 10)  # random batch of 32 samples of input_size=10 for simulation                                                                                                                      

In [24]: print(x.shape)                                                                                                                                                                                            
torch.Size([32, 10])

In [25]: y1 = torch.nn.functional.relu(layer(x))  #  y1 = relu(x * W^T + b)                                                                                                                                        

In [26]: print(y1.shape)  # output -> batch_size x output_size = 32x5                                                                                                                                              
torch.Size([32, 5])

In [27]:  # The operations in detail                                                                                                                                                                               

In [28]: W = layer.weight                                                                                                                                                                                          

In [29]: print(W.shape)                                                                                                                                                                                            
torch.Size([5, 10])

In [30]: b = layer.bias                                                                                                                                                                                            

In [31]: print(b.shape)                                                                                                                                                                                            
torch.Size([5])

In [32]: y2 = torch.nn.functional.relu(torch.matmul(x, W.t()) + b)  # Let's do it by hand                                                                                                                          

In [33]: print(y2.shape)                                                                                                                                                                                           
torch.Size([32, 5])

In [34]: assert torch.all(torch.isclose(y1, y2)).item(), "These should be equal"    

@foivospar
Copy link
Author

Αα οπότε βάζουμε Relu μετά από Linear, γιατί όπως το γράφει η εκφώνηση φαίνεται σα να εννοεί απλώς ένα μη γραμμικό (π.χ. Relu) module

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants