【问题标题】:Proper models import from pytorch in keras从 keras 中的 pytorch 导入正确的模型
【发布时间】:2019-01-31 02:39:10
【问题描述】:

如何将此模型从 pytorch 导入到 keras?我从帖子底部编写模型,但 Keras 和 pytorch 模型给出不同的结果。

class net_pytorch(torch.nn.Module):
    def __init__(self,Nin=6,Nout=1,Nlinear=112*60):
        super(vel_regressor, self).__init__()

        self.model1 = torch.nn.Sequential(
        torch.nn.Conv1d(Nin,60,kernel_size=3,stride=1,groups=Nin),
        torch.nn.ReLU(),
        torch.nn.Conv1d(60,120,kernel_size=3,stride=1,groups=Nin),
        torch.nn.ReLU(),
        torch.nn.Conv1d(120,240,kernel_size=3,stride=1),
        torch.nn.ReLU(),
        torch.nn.MaxPool1d(10, stride=6),
        )

        self.model2=model2=torch.nn.Sequential(
        torch.nn.Linear(Nlinear, 10*40),
        torch.nn.ReLU(),
        torch.nn.Linear(10*40, 100),
        torch.nn.ReLU(),
        torch.nn.Linear(100, Nout)
        )

    def forward(self, x):
        x = self.model1(x)
        x = x.view(x.size(0), -1)
        x = self.model2(x)
        return x

我如何在 keras 中编写它:

def net_keras():

  model2 = Sequential()

  model2.add(layers.SeparableConv1D(60, 3, strides=1, activation='relu', depth_multiplier = 6 , name = 'model1.0', input_shape=(200, 6)))
  model2.add(layers.SeparableConv1D(120, 3, strides=1, activation='relu', depth_multiplier = 6, name = 'model1.2'))
  model2.add(layers.SeparableConv1D(240, 3, strides=1, activation='relu', name = 'model1.4'))
  model2.add(layers.GlobalAveragePooling1D())
  model2.add(layers.Dense(6720, activation='relu', name = 'model2.0'))
  model2.add(layers.Dense(400, activation='relu', name = 'model2.2'))
  model2.add(layers.Dense(100, activation='relu', name = 'model2.4'))
  model2.add(layers.Dense(3))

  model2.compile(optimizer=Adam(), loss='mae')

  return model2

我尝试使用nn-transfer进行转换但出现错误:

Layer names in PyTorch state_dict ['model1.0', 'model1.2', 'model1.4', 'model2.0', 'model2.2', 'model2.4']
Layer names in Keras HDF5 ['dense_1', 'global_average_pooling1d_1', 'model1.0', 'model1.2', 'model1.4', 'model2.0', 'model2.2', 'model2.4']
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-49-a3986379ed2b> in <module>()
----> 1 transfer.pytorch_to_keras(pytorch_network, model2)

/content/nn-transfer/nn_transfer/transfer.py in pytorch_to_keras(pytorch_model, keras_model, flip_filters, flip_channels, verbose)
    122         for layer in pytorch_layer_names:
    123 
--> 124             params = util.dig_to_params(model_weights[layer])
    125 
    126             weight_key = layer + '.weight'

/content/nn-transfer/nn_transfer/util.py in dig_to_params(keras_h5_layer)
     23     # ['dense_2']['dense_3']['conv2d_7']['dense_4']['conv1']
     24     while not _contains_weights(keras_h5_layer):
---> 25         keras_h5_layer = keras_h5_layer[list(keras_h5_layer.keys())[0]]
     26 
     27     return keras_h5_layer

AttributeError: 'Dataset' object has no attribute 'keys'

我也尝试使用 pytorch2keras,但它不适用于组!= 1。

MMdnn 也不适用于此模型(图像错误)。

MMdnn error

【问题讨论】:

    标签: keras pytorch


    【解决方案1】:

    这里是错误的地方:

    model.add(layers.Conv1D(60, 3, strides=1, activation='relu', input_shape=(None, 200), name='model1.0'))
    

    您应该使用input_shape=(None,6),除非您的输入始终是BatchSizex200x6。

    此外,还有一些工具可以在不同架构之间转换模型,例如https://github.com/Microsoft/MMdnn.

    【讨论】:

    • 但是如何实现参数groups=Nin呢?我已经尝试使用 pytorch2keras,但它不适用于我的网络。而且我无法理解如何使用 MMdnn 将源代码模型从 pytorch 转换为 keras...
    • MMdnn 也不起作用。 AttributeError: Can't get attribute 'vel_regressor' on &lt;module '__main__' from 'C:\\WinPy\\python-3.6.7.amd64\\Scripts\\mmconvert.exe\\__main__.py'&gt;
    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2018-07-13
    • 2020-11-15
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多