web-dev-qa-db-ja.com

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'))

ありがとう

6
Milind Dalvi

私の知る限り、どれも正しく見えません。正しいKerasの同等のコードは次のようになります。

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

model.add(Dense(30、input_shape =(5、)、activation = 'relu'))

モデルは、形状の入力配列(*、5)および形状の出力配列(*、30)を取ります。 _input_shape_の代わりに、_input_dim_を使用することもできます。 _input_dim=5_はinput_shape=(5,)と同等です。

model.add(Dense(3))

最初のレイヤーの後、入力のサイズを指定する必要はありません。さらに、アクティベーションに何も指定しない場合、アクティベーションは適用されません(線形アクティベーションと同等)。


別の選択肢は次のとおりです。

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

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

8
Wasi Ahmad

のように見えます

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

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

Conv2d、Linear、Activations、Element-wise操作などのベースレイヤーをサポートします。そのため、ResNet50をエラー1e-6で変換しました。

1
nerox8664