11import torch .nn as nn
2- from utils import *
3- from embeddingLayer import EmbeddingLayer
4- from constEmbeddingsGlove import ConstEmbeddingsGlove
2+ from pytorch .utils import *
3+ from pytorch .embeddingLayer import EmbeddingLayer
4+ from pytorch .rnnLayer import RnnLayer
5+ from pytorch .forwardLayer import ForwardLayer
6+ from pytorch .constEmbeddingsGlove import ConstEmbeddingsGlove
57
68class Layers (object ):
79 def __init__ (self , initialLayer , intermediateLayers , finalLayer ):
@@ -14,8 +16,7 @@ def __init__(self, initialLayer, intermediateLayers, finalLayer):
1416 else :
1517 self .outDim = None
1618
17- if initialLayer and intermediateLayers and finalLayer :
18- self .nonEmpty = True
19+ self .nonEmpty = initialLayer is not None and intermediateLayers is not None and finalLayer is not None
1920 self .isEmpty = not self .nonEmpty
2021
2122 self .initialLayer = initialLayer
@@ -25,43 +26,53 @@ def __init__(self, initialLayer, intermediateLayers, finalLayer):
2526 def __str__ (self ):
2627 s = ""
2728 started = False
28- if (initialLayer . nonEmpty ):
29- s += "initial = " + initialLayer
29+ if (self . initialLayer is not None ):
30+ s += "initial = " + str ( self . initialLayer )
3031 started = True
31- for i in intermediateLayers . indices :
32- if (started ) s += " "
33- s += s "intermediate ({i+1}) = " + intermediateLayers [i ]
32+ for i in range ( len ( self . intermediateLayers )) :
33+ if (started ): s += " "
34+ s += f "intermediate ({ i + 1 } ) = " + str ( self . intermediateLayers [i ])
3435 started = True
35- if (finalLayer . nonEmpty ):
36- if (started ) s += " "
37- s += "final = " + finalLayer
36+ if (self . finalLayer is not None ):
37+ if (started ): s += " "
38+ s += "final = " + str ( self . finalLayer )
3839 return s
3940
41+ def get_parameters (self ):
42+ parameters = list ()
43+ if self .initialLayer is not None :
44+ parameters += [p for p in self .initialLayer .parameters () if p .requires_grad ]
45+ for il in self .intermediateLayers :
46+ parameters += [p for p in il .parameters () if p .requires_grad ]
47+ if self .finalLayer is not None :
48+ parameters += [p for p in self .finalLayer .parameters () if p .requires_grad ]
49+ return parameters
50+
4051 def forward (self , sentence , constEmbeddings , doDropout ):
4152 if self .initialLayer .isEmpty :
4253 raise RuntimeError (f"ERROR: you can't call forward() on a Layers object that does not have an initial layer: { self } !" )
4354 states = self .initialLayer (sentence , constEmbeddings , doDropout )
4455 for intermediateLayer in self .intermediateLayers :
4556 states = intermediateLayer (states , doDropout )
46- if self .finalLayer . nonEmpty :
57+ if self .finalLayer is not None :
4758 states = self .finalLayer (states , sentence .headPositions , doDropout )
4859
4960 return states
5061
5162 def forwardFrom (self , inStates , headPositions , doDropout ):
52- if self .initialLayer . nonEmpty :
63+ if self .initialLayer is not None :
5364 raise RuntimeError (f"ERROR: you can't call forwardFrom() on a Layers object that has an initial layer: { self } " )
5465 states = inStates
5566 for intermediateLayer in self .intermediateLayers :
5667 states = intermediateLayer (states , doDropout )
57- if self .finalLayer . nonEmpty :
68+ if self .finalLayer is not None :
5869 states = self .finalLayer (states , sentence .headPositions , doDropout )
5970
6071 return states
6172
6273 def saveX2i (self ):
6374 x2i = dict ()
64- if self .initialLayer . nonEmpty :
75+ if self .initialLayer is not None :
6576 x2i ['hasInitial' ] = 1
6677 x2i ['initialLayer' ] = self .initialLayer .saveX2i ()
6778 else :
@@ -70,7 +81,7 @@ def saveX2i(self):
7081 x2i ['intermediateLayers' ] = list ()
7182 for il in self .intermediateLayers :
7283 x2i ['intermediateLayers' ].append (il .saveX2i ())
73- if self .finalLayer . nonEmpty :
84+ if self .finalLayer is not None :
7485 x2i ['hasFinal' ] = 1
7586 x2i ['finalLayer' ] = self .finalLayer .saveX2i ()
7687 else :
@@ -227,7 +238,7 @@ def parse(layers, sentence, constEmbeddings):
227238 @staticmethod
228239 def loss (layers , taskId , sentence , goldLabels ):
229240 # Zheng: I am not sure this is the suitable way to load embeddings or not, need help...
230- constEmbeddings = ConstEmbeddingsGlove () .mkConstLookupParams (sentence .words )
241+ constEmbeddings = ConstEmbeddingsGlove .mkConstLookupParams (sentence .words )
231242 states = Layers .forwardForTask (layers , taskId , sentence , constEmbeddings , doDropout = True ) # use dropout during training!
232243 return layers [taskId + 1 ].finalLayer .loss (states , goldLabels )
233244
0 commit comments