2017-10-21 7 views
1

PyTorchで以下のコードが与えられた場合、Kerasに相当するものは何ですか?PytorchからKerasコードへの等価性

class Network(nn.Module): 

    def __init__(self, state_size, action_size): 
     super(Network, self).__init__() 

     # Inputs = 5, Outputs = 3, Hidden = 30 
     self.fc1 = nn.Linear(5, 30) 
     self.fc2 = nn.Linear(30, 3) 

    def forward(self, state): 
     x = F.relu(self.fc1(state)) 
     outputs = self.fc2(x) 
     return outputs 

これですか?

model = Sequential() 
model.add(Dense(units=30, input_dim=5, activation='relu')) 
model.add(Dense(units=30, activation='relu')) 
model.add(Dense(units=3, activation='linear')) 

これですか?

model = Sequential() 
model.add(Dense(units=30, input_dim=5, activation='linear')) 
model.add(Dense(units=30, activation='relu')) 
model.add(Dense(units=3, activation='linear')) 

ですか?

model = Sequential() 
model.add(Dense(units=30, input_dim=5, activation='relu')) 
model.add(Dense(units=30, activation='linear')) 
model.add(Dense(units=3, activation='linear')) 

おかげ

答えて

4

それらのどれも私の知識に従って正しく見えるません。正しいKeras同等のコードは次のようになります

model = Sequential() 
model.add(Dense(30, input_shape=(5,), activation='relu')) 
model.add(Dense(3)) 

model.add(高密度(30、input_shape =(5)、活性化= 'relu'))を入力として取る

モデル形状の配列(*、5)と形状の出力配列(*、30)。 input_shapeの代わりにinput_dimを使用することもできます。 input_dim=5input_shape=(5,)に相当します。

model.add(高密度(3))

第一層の後、あなたはもう入力の大きさを指定する必要はありません。さらに、アクティベーションに何も指定しなければ、アクティベーションは適用されません(リニアアクティベーションに相当)。


別の方法としては、次のようになります。

model = Sequential() 
model.add(Dense(30, input_dim=5)) 
model.add(Activation('relu')) 
model.add(Dense(3)) 

うまくいけば、これは理にかなっています!

+0

あなたの答えに応じて、ネットワークには何層の層がありますか? –

+0

2つの高密度層、一方は活性化「relu」を有し、他方は「線状」である。 –

+0

この場合は表示されない「隠された入力レイヤー」もあります。これを数えると、3つのレイヤーになります。 –

1

あなたはKerasモデルにPytorchモデルを変換しようとしている場合は、あなたもPytorch2Kerasコンバータを試すことができ

model = Sequential() 
model.add(InputLayer(input_shape=input_shape(5,)) 
model.add(Dense(30, activation='relu') 
model.add(Dense(3)) 

ように見えます。

これは、Conv2d、Linear、Activations、Element-wiseなどの基本レイヤーをサポートしています。だから、エラー1e-6でResNet50を変換しました。