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回改訂されています