0

私は既存のネットワークに新しいレイヤーを追加し(最初のレイヤーとして)、元の入力でそれを鍛えようとしています。畳み込みレイヤーを追加すると、すべてが完全に機能しますが、私はそれを線形に変更すると訓練していないように見えます。なぜどんなアイデア?私は(ちょうどELUない)異なる活性化関数を試みPytorch上の既存のモデルに線形レイヤーを追加する

class ActorCritic(torch.nn.Module): #original model 
    def __init__(self, num_inputs, action_space): 
     super(ActorCritic, self).__init__() 
     self.conv1 = nn.Conv2d(num_inputs, 32, 3, stride=2, padding=1) 
     self.conv2 = nn.Conv2d(32, 32, 3, stride=2, padding=1) 
     self.conv3 = nn.Conv2d(32, 32, 3, stride=2, padding=1) 
     self.conv4 = nn.Conv2d(32, 32, 3, stride=2, padding=1) 

     self.lstm = nn.LSTMCell(32 * 3 * 3, 256) 

     num_outputs = action_space.n 
     self.critic_linear = nn.Linear(256, 1) 
     self.actor_linear = nn.Linear(256, num_outputs) 

    def forward(self, inputs): 
     inputs, (hx, cx) = inputs 
     x = F.elu(self.conv1(inputs)) 
     x = F.elu(self.conv2(x)) 
     x = F.elu(self.conv3(x)) 
     x = F.elu(self.conv4(x)) 
     x = x.view(-1, 32 * 3 * 3) 
     hx, cx = self.lstm(x, (hx, cx)) 
     x = hx 
     return self.critic_linear(x), self.actor_linear(x), (hx, cx) 

class TLModel(torch.nn.Module): #new model 
    def __init__(self, pretrained_model, num_inputs): 
     super(TLModel, self).__init__() 
     self.new_layer = nn.Linear(1*1*42*42, 1*1*42*42) 
     self.pretrained_model = pretrained_model 

    def forward(self, inputs): 
     inputs, (hx, cx) = inputs 
     x = F.elu(self.new_layer(inputs.view(-1, 1*1*42*42))) 
     return self.pretrained_model((x.view(1,1,42,42), (hx, cx))) 

: ここで、ネットワーク全体です。それはCONVと連携して動作します。

class TLModel(torch.nn.Module): 
    def __init__(self, pretrained_model, num_inputs): 
     super(TLModel, self).__init__() 
     self.new_layer = nn.Conv2d(num_inputs, num_inputs, 1) 
     self.pretrained_model = pretrained_model 

    def forward(self, inputs): 
     inputs, (hx, cx) = inputs 
     x = F.elu(self.new_layer(inputs)) 
     return self.pretrained_model((x, (hx, cx))) 

入力の数が1で、入力の大きさは1x1x42x42

答えて

1

であるあなたは、エラーメッセージを供給していた場合には有用であろう。あなたが書いたことから、私はあなたがあなたの意見を搾取するのを忘れてしまったとしか思えません。あなたの入力は、サイズが1x1x42x42である、すなわちそれが4次元であると書いてください。 nn.Conv2Dは、4次元入力を想定しています。代わりにnn.Linearは2次元入力を期待しています。

したがって、モデルに入力する前にinput = input.squeeze()に電話をかけてみてください。これはシングルトンの次元を削除するので、2つのシングルトンの次元があるので、入力を2次元にします。

nn.Linearは、寸法batch_size x feat_dimの入力を想定しています。線形層は実際にあなたのデータに意味をなさないでしょうか? 人々が通常ネットワークにレイヤーを追加するとき、最初から始めるのではなく、最後にレイヤーを追加するときに、そうするための良い理由があると信じています。

Good Luck!

+0

実際にはエラーメッセージが表示されません。リニアでトレーニングするようには見えません(ただし、convで行う)。 –

0

転送機能のビューを変更しているため、サイズは問題にはなりません。私は、ネットワークの開始でFCNを追加することは実際に大きな違いはないと思う、あなたは層を削除してネットワークを再訓練することでチェックすることができます、それは同様の結果を生成します。

猫の特徴(髭、耳など)を検出しようとしているかのように想像してみてください。実際には画像のすべてのピクセルから情報を必要としませんが、ネットワークを複雑にするだけです。

+0

私はfcnを追加する理由がありますが、最初に基本的な例を調べて、うまく機能しているかどうかを確認したいと考えました。私は恒等行列として重みを初期化することができたので、今度は最初に実行されます。私は活性化がプロセスにも影響を与えていると思うのは、特定の機能(tanhやnoneなど)で初めて機能するからです。 –

関連する問題