tfの圧縮モデルに関しては、実行できないものもあります-それは達成できます

tfは一部の圧縮モデルを実行できないことがわかりました。たとえば、グラデーションの更新内容を変更します。tfの計算グラフは一度に変更することはできませんが、現在のいくつかの論文では、トレーニング速度を上げるためにエシェロンを変更する方法があります。トーチによって書かれたコードを見ましたが、tfではそれができないことがわかりました。前述のように画像は変更できないため、今後tfが変更されることはないと思います。

将来的には、間違いなくpytorchまたはtorchを学び、モデルをpb形式に変換します。これは、tf-servingがモデルの配置に大きな利点があるためです。

例:このコードは、導出の過程で、bn層がl1ノルムで追加されることを意味します。彼の規範はいつもと同じではありません。

def updateBN():
    # 放到了梯度求导中呀
    for m in model.modules():
        if isinstance(m, nn.BatchNorm2d):
            print(m.weight.data.shape)
            m.weight.grad.data.add_(args.s*torch.sign(m.weight.data))  # L1

tfの実装を使用します。

tf.layers.batch_normalization(
    inputs,
    axis=-1,
    momentum=0.99,
    epsilon=0.001,
    center=True,
    scale=True,
    beta_initializer=tf.zeros_initializer(),
    gamma_initializer=tf.ones_initializer(),
    moving_mean_initializer=tf.zeros_initializer(),
    moving_variance_initializer=tf.ones_initializer(),
    beta_regularizer=None,
    gamma_regularizer=None,
    beta_constraint=None,
    gamma_constraint=None,
    training=False,
    trainable=True,
    name=None,
    reuse=None,
    renorm=False,
    renorm_clipping=None,
    renorm_momentum=0.99,
    fused=None,
    virtual_batch_size=None,
    adjustment=None
)

その中で、gamma_regularizerパラメーターはl1に与えられます。この計算はその時点で同じことを保証できますが、トーチの実装は前方推論で異なります。

これが、多くのAI研究者がトーチ/ピトーチを好む理由かもしれません。


上記の言葉を撤回します。tf.layersのインターフェースには関連する関数があります。

tf.layersには、関数apiとクラスapiの2つの状況があります。それらの違いは、クラスapiがレイヤーを処理するための多くのメソッドを提供することです。

それらを区別する方法は?

tf.layes.BatchNormalizationクラス、大文字、

tf.layes.batch_normalization関数、小文字のみ

ネットワークを構築する場合、2つの関数とパラメーターは同じです。バックエンドの更新操作中、クラスは制御可能であり、関連する属性があります。

使用法はまだ多少異なります。例としてconv2dを取り上げると、違いを見つけることができます。

x = tf.layers.Conv2D( 64, kernel_size=[3, 3], strides=[1, 1], padding='same', activation=None,
                             kernel_regularizer=weight_decay)(x)



x = tf.layers.conv2d(x,64, kernel_size=[3, 3], strides=[1, 1], padding='same', activation=None,
                             kernel_regularizer=weight_decay')

以下は、tf.layes.BatchNormalizationのプロパティです。

- activity_regularizer

    可选的正则化函数用于该层的输出.

- **dtype**

- **graph**

- input

    检索图层的输入张量.

    仅适用于图层只有一个输入的情况,即它是否连接到一个输入图层.

    返回:

    输入张量或输入张量列表.

    可能引发的异常:

    - AttributeError:如果图层连接到多个输入图层.

    - RuntimeError:如果在Eager模式下调用.
    - AttributeError:如果未找到入站节点.

- input_shape

    检索图层的输入形状.

    仅适用于图层只有一个输入,即它是否连接到一个传入层,或者所有输入具有相同形状的情况.

    返回:

    输入形状,作为整数形状元组(或形状元组列表,每个输入张量一个元组).

    可能引发的异常:

    - AttributeError:如果图层没有定义的input_shape.
    - RuntimeError:如果在Eager模式下调用.

- losses

    与此Layer相关的损失.

    请注意,在急切执行时,获取此属性会计算正规则.使用图形执行时,已经创建了变量正则化运算,并且只是在这里返回.

    返回:

    张量列表.

- **name**

- **non_trainable_variables**

- **non_trainable_weights**

- output

    检索图层的输出张量.

    仅适用于图层只有一个输出,即它是否连接到一个输入层.

    返回:

    输出张量或输出张量列表.

    可能引发的异常:

    - AttributeError:如果图层连接到多个输入图层.
    - RuntimeError:如果在Eager模式下调用.

- output_shape

    检索图层的输出形状.

    仅适用于图层具有一个输出,或者所有输出具有相同形状的情况.

    返回:

    输出形状,作为整数形状元组(或形状元组列表,每个输出张量一个元组).

    可能引发的异常:

    - AttributeError:如果图层没有定义的输出形状.
    - RuntimeError:如果在Eager模式下调用.

- **scope_name**

- **trainable_variables**

- **trainable_weights**

- **updates**

- **variables**

    返回所有图层变量/权重的列表.

    返回:

    变量列表.

- **weights**

    返回所有图层变量/权重的列表.

    返回:

    变量列表.

機能と構造の容易さから考慮してください:

スパースモデリングはtf.layersクラスapiを使用します。これは主に、各レイヤーが変数名を定義でき、モデルパラメーターを解析するのに便利であり、クラスapiには使用できる多くの属性があるためです。

剪定モデルは、パラメーターを初期化する非常に便利な方法を持つtf.nnを使用しますが、多くの変数を生成し、それらの名前を区別するのは困難です。

tf.layers関数apiは、共通のモデルを構築するために使用されます。これは主に、各レイヤーが変数名を定義できるためです。これは、モデルパラメーターの解析に便利です。

構造図の描画にはkerasを使用します。tf2.0以降は多く使用されますが、お勧めしません。微妙な操作は上記のインターフェースに戻りますが、それは単に禁止されており、h5ファイルを処理する方が便利です。

スリムは放棄されました。

-----------------

スリムについて再度更新します。

彼には、他のインターフェースではできないという利点があります。

bool値を動的に渡して、モデルのbnとドロップアウトがトレーニング状態にあるかどうかを指定できます。これを行うと、他のインターフェイスはエラーを報告します。

tensorflow.python.framework.errors_impl.OperatorNotAllowedInGraphError: using a `tf.Tensor` as a Python `bool` is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.

興味のある方はフェイスネットコードをご覧ください。

その機能は、特定のエポックのトレーニング後に評価することです。テスト/評価中に、モデル内のすべての値が固定されます。

-------------------------- 2020年10月4日------------------- ---------------

解決策を見つけました、

達成するにはtf.nnを使用します。具体的な実装方法は、私自身の圧縮モデルに関する本「圧縮モデル・法律は一般に責任を負わない」に書かれています。データはまだ小規模な流通であり、現在2回改訂されています

 

おすすめ

転載: blog.csdn.net/weixin_39875161/article/details/108164600