1

私は2つのセットアップを持っています - 1つは約かかります。もう一方を実行するのに 10 分は、1 時間後も引き続き実行されます。

10メートル:

import pretrainedmodels 

def resnext50_32x4d(pretrained=False):
    pretrained = 'imagenet' if pretrained else None
    model = pretrainedmodels.se_resnext50_32x4d(pretrained=pretrained)
    return nn.Sequential(*list(model.children()))

learn = cnn_learner(data, resnext50_32x4d, pretrained=True, cut=-2, split_on=lambda m: (m[0][3], m[1]),metrics=[accuracy, error_rate])

終了していません:

import torchvision.models as models

def get_model(pretrained=True, model_name = 'resnext50_32x4d', **kwargs ):
    arch = models.resnext50_32x4d(pretrained, **kwargs )
    return arch

learn = Learner(data, get_model(), metrics=[accuracy, error_rate])

これはすべて他人のコードをコピペしてハッキングしたものなので、よくわからない部分があります。しかし、最も困惑するのは、一方が他方よりもはるかに高速である理由です。2 番目のオプションを使用したいと思います。これは、理解しやすく、事前トレーニング済みのモデルを交換して別のモデルをテストできるためです。

4

1 に答える 1

1

両方のアーキテクチャは異なります。pretrained-models.pytorchを使用していると思います。

最初の例ではSE -ResNeXt を使用し、2 番目の例では ResNeXt を使用していることに注意してください ( の標準的なものtorchvision)。

最初のバージョンでは、より高速なブロック アーキテクチャ (Squeeze and Excitation) が使用されており、それについて説明している研究論文はこちら.

使用されるビルディング ブロックが異なることを除いて、アーキテクチャと実装の両方の正確な違いについてはわかりませんがprint、モデルと違いの両方を確認できます。

最後に、 Squeeze And Excitationとは何かをまとめた素晴らしい記事があります。基本的には、すべてのチャネルで行います (im pytorchとその後)、各チャネルの重みを取得するために、2 つの線形レイヤー (間にアクティベーションを含む) を押し込みます。最後に、チャンネルにそれらを掛けます。GlobalAveragePoolingtorch.nn.AdaptiveAvgPoo2d(1)flattenReLUsigmoid

さらに、モジュールを に変換することで奇妙なことをしていますtorch.nn.Sequential。モジュールをコピーして削除する事前トレーニング済みネットワークの呼び出しには、いくつかのロジックがある場合がありforward、それも役割を果たす場合があります。

于 2019-07-10T20:04:26.733 に答える