研究ノート(7、Kears高レベルのインタフェース)「アルゴリズム本物の教材TensorFlow 2.0深さ」

Kerasは、オープンソースニューラルネットワークコンピューティング・ベースを中心に開発されたPython言語です。Kerasライブラリは後端がTheano、CNTK、TensorFlow、統一されたインタフェースKerasアブストラクトAPIを介して、すなわち、フロントエンドインタフェースとして実装既存の奥行き学習フレームワークに基づくことができ、前記前部および後部に分けられます。

だから、Kerasとtf.kerasリンクとの違いは何ですか?TensorFlowではなく、Keras契約のセットを達成するために、実際にはKerasは、ビルドに高レベルAPIのセットとして理解し、ニューラルネットワーク・プロトコルを訓練することができ、Keras自体はこの合意を達成している、あなたは簡単に計算加速を完了するために、TensorFlow、CNTKのバックエンドを呼び出すことができます唯一tf.kerasが、TensorFlowのバックエンドコンピューティング、に基づいて、より良いTensorFlowをサポートしています。TensorFlowを使用する開発者にとって、tf.kerasは、共通サブモジュール、及び例えばtf.math、tf.dataなどの他のサブモジュール、として理解することができるので、任意の違いを行っていません。

共通機能モジュール

Kerasは、古典的なモデルのクラスと同様に、そのようなデータロード機能の共通セットとしてハイレベルニューラルネットワーククラス及び機能は、ネットワーク層タイプ、モデル容器、損失関数のクラス、クラスの最適化のシリーズを提供します。

一般的なネットワーク層クラス

  • tf.nnモジュール:一般的ニューラルネットワーク層インタフェース機能を実現するボトムテンソルの方法、インタフェース機能モジュールについて一般tf.nn
  • tf.keras.layers名前空間:ネットワーク層は、水層が活性化され、そのような完全に接続された層として、リカレントニューラルネットワーク層等の細胞層、畳み込み層を、共通のクラスインターフェースの数を提供

ソフトマックス層に、例えば、両方はソフトマックス関数算術論理伝播tf.nn.softmax前部を完了するために使用することができ、クラスは、操作引数の軸寸法ソフトマックスを指定し、前記ネットワーク層ソフトマックスlayers.Softmax(軸)によって設定することができます。

import tensorflow as tf
# 导入keras 模型,不能使用import keras,它导入的是标准的Keras 库
from tensorflow import keras
from tensorflow.keras import layers # 导入常见网络层类

そして、__call__前に完了するソフトマックス層、および計算方法への呼び出しを作成します。

In [1]:
x = tf.constant([2.,1.,0.1])
layer = layers.Softmax(axis=-1) # 创建Softmax 层
layer(x) # 调用softmax 前向计算

ソフトマックス・ネットワーク・レイヤ後確率分布を取得します。

コンテナネットワーク

ネットワークは、より深い層になったときの一般的なネットワークのために、手動で前各層のクラスインスタンスの伝播が完了するまでの呼び出し操作は、コードのこの部分は非常に煩雑です。シーケンシャル血管ネットワークはKerasは、大規模なネットワークモデルにカプセル化されたネットワーク層の複数によって提供されて、最後の層に第一層からの操作のデータシーケンスを完了するために、ネットワークのモデル例を呼び出す必要があります。

例えば、完全に接続された2層プラス別の層の活性化機能、ネットワークは、シーケンシャルコンテナによって包装することができます。

# 导入Sequential 容器
from tensorflow.keras import layers, Sequential
network = Sequential([ # 封装为一个网络
layers.Dense(3, activation=None), # 全连接层
layers.ReLU(),#激活函数层
layers.Dense(2, activation=None), # 全连接层
layers.ReLU() #激活函数层
])
x = tf.random.normal([4,3])
network(x) # 输入从第一层开始,逐层传播至最末层

シーケンシャルコンテナは、機能的な動的に作成されたネットワークの新しいネットワーク層add()メソッドを追加することにより、継続することができます。

In [2]:
layers_num = 2 # 堆叠2 次
network = Sequential([]) # 先创建空的网络
for _ in range(layers_num):
	network.add(layers.Dense(3)) # 添加全连接层
	network.add(layers.ReLU())# 添加激活函数层
network.build(input_shape=(None, 4)) # 创建网络参数
network.summary()

要約することによって()関数は、容易にネットワークの構造およびパラメータの量を出力することができる:
ここに画像を挿入説明
それぞれの名前などのレイヤを参照して、名前は、Pythonとオブジェクト名が同じでない内部TensorFlowによって維持され、層のようなパラメータののParam#番号、合計金額の統計パラメータの合計のparams、金額トレーニング可能のparamsパラメータのパラメータの量の最適化を必要としない最適化することで、非トレーニング可能のparams。

我々は、マルチレイヤネットワーク層カプセル化容量パラメータリストをシーケンシャルに自動的にコンテナシーケンシャルパラメータリストのすべての層に組み込まれることになる場合には、パラメータリストは、人工マージネットワークを必要としません。trainable_variablesオブジェクトと変数シーケンシャル最適化テンソルは、すべてのレイヤのリストが含まれており、すべてのテンソルリストであります:

In [3]: # 打印网络的待优化参数名与shape
for p in network.trainable_variables:
	print(p.name, p.shape)
Out[3]:
dense_2/kernel:0 (4, 3)
dense_2/bias:0 (3,)
dense_3/kernel:0 (3, 3)
dense_3/bias:0 (3,)

テストとトレーニング、アセンブリモデル

ネットワークを訓練では、一般的な流れは、前の出力値を計算するためにネットワークによって取得され、ネットワークエラーが機能の喪失によって計算され、断続的にテストネットワーク性能ながら導出ツールによって自動的に、勾配を計算し、更新します。

モデル組立

keras.Modelとkeras.layers.Layerクラス:Kerasでは、二つの特別なクラスがあります。レイヤクラスの親クラスはネットワーク層であり、ネットワークは、そのような値のリストを管理するように、重みを加えるなどの一般的な機能層の数を定義します。モデルクラスは、機能層のクラスに加えて、保存、負荷モデル、トレーニングとテストモデルの便利な機能を追加し、親クラスのネットワークです。シーケンシャルは、モデルのサブクラスであるため、モデルクラスのすべての機能を備えています。

次は、モデルの組み立てとトレーニング機能モデルとそのサブクラスをしています。我々は最初のデジタル写真MNISTの手書き認識のために完全に接続されたネットワーク層5を作成し、一例として、容器包装シーケンシャルネットワークを持っています:

# 创建5 层的全连接层网络
network = Sequential([layers.Dense(256, activation='relu'),
							layers.Dense(128, activation='relu'),
							layers.Dense(64, activation='relu'),
							layers.Dense(32, activation='relu'),
							layers.Dense(10)])
network.build(input_shape=(None, 28*28))
network.summary()

マルチパスループ反復データセットによりネットワーク、通常のプロセスを作成した後、バッチによって生成された各学習データは、計算に先立って、エラー値は、機能の喪失によって計算され、自動的に勾配バックプロパゲーション、更新されたネットワークパラメータを算出します。ロジックのこの部分は非常に一般的であるため、簡便に上記論理kerasに実装コンパイル()およびフィット()関数が提供されます。最適化は、コンパイルネットワーク機能、損失関数、評価指標を用いて第1のオブジェクトを指定しました:

# 导入优化器,损失函数模块
from tensorflow.keras import optimizers,losses
# 采用Adam 优化器,学习率为0.01;采用交叉熵损失函数,包含Softmax
network.compile(optimizer=optimizers.Adam(lr=0.01),
			loss=losses.CategoricalCrossentropy(from_logits=True),
			metrics=['accuracy'] # 设置测量指标为准确率
)

私たちは、コンパイル()関数のパラメータ最適化に指定された、と私たちは自分自身のトレーニングパラメータを使用する必要があり、何も特別ながあるときに機能の喪失であるが、達成するための一般的なロジックのこの部分をkerasし、開発効率を向上させます。

モデルのトレーニング

組み立てモデルの完了後()データの関数をフィットで使用訓練および検証データセットに送信することができます。

# 指定训练集为train_db,验证集为val_db,训练5 个epochs,每2 个epoch 验证一次
# 返回训练信息保存在history 中
history = network.fit(train_db, epochs=5, validation_data=val_db,
validation_freq=2)

トレーニングエポックの反復回数を指定エポック; train_dbがtf.data.Datasetオブジェクトである、あなたはまた、numpyの配列データのタイプを渡すことができvalidation_data指定検証(試験)および検証データを周波数validation_freqため。

トレーニングとネットワークの検証の機能を実装するためのコードを実行して、関数がフィットデータ記録履歴トレーニングプロセスを返しますが、ここでhistory.history損失トレーニングプロセスを含む辞書オブジェクト、測定指標項目:

In [4]: history.history # 打印训练记录
Out[4]: # 训练准确率
{'accuracy': [0.00011666667, 0.0, 0.0, 0.010666667, 0.02495],
'loss': [2465719710540.5845, # 训练误差
78167808898516.03,
404488834518159.6,
1049151145155144.4,
1969370184858451.0],
'val_accuracy': [0.0, 0.0], # 验证准确率
# 验证误差
'val_loss': [197178788071657.3, 1506234836955706.2]}

あなたは、コードのコンパイルを参照してください&非常にシンプルかつ効率的により達成フィット、大幅に開発時間を短縮することができます。インターフェイスは非常に高いレベルであるため、ユーザーが自分自身の判断を使用する必要がある場合でも、柔軟性も、減少しています。

モデルのテスト

Model.predict(X)で予測モデルの方法を完了する。

# 加载一个batch 的测试数据
x,y = next(iter(db_test))
print('predict x:', x.shape)
out = network.predict(x) # 模型预测
print(out)

ネットワークは、出力アウトです。

単純な性能試験モデル場合、試験は、性能指数外DB Model.evaluate(DB)、および印刷することにより、データセット内の全てのサンプルを介してサイクルすることができます。

network.evaluate(db_test) # 模型测试

保存して負荷モデル

トレーニングモデルの完了後、このモデルは、フォローアップモデルのテストと展開を容易にするように、ファイルシステムに保存する必要があります。実際には、モデルの状態を保存するために断続的にトレーニング中に、それも非常に良い習慣です。

Kerasでは、一般的に使用される3つの保存するモデルとロードの方法があります。

テンソル方法

主にネットワークの状態やネットワークのネットワーク層内部構造テンソル・パラメータで、従ってネットワークパラメータテンソルに直接格納されたソースファイルのネットワーク構造の空き状況には、ドキュメント最も軽量な方法です。デジタル写真の一例として、我々MNIST手書き認識モデル、あなたは現在のネットワークパラメータは、ファイルパス(パス)メソッドに保存されModel.save_weightsを呼び出すことによって伝えることができます:

network.save_weights('weights.ckpt')

必要なときにコードがメソッドは、指定されたモデルファイルテンソル値の書き込みに保存することができますload_weights(パス)ネットワーク・オブジェクトを呼び出して、最初のネットワークオブジェクトを作成し、weights.ckptファイルにちょうど良いのネット​​ワークモデルを保存しますに、現在のネットワークパラメータへ:

# 保存模型参数到文件上
network.save_weights('weights.ckpt')
print('saved weights.')
del network # 删除网络对象
# 重新创建相同的网络结构
network = Sequential([layers.Dense(256, activation='relu'),
							layers.Dense(128, activation='relu'),
							layers.Dense(64, activation='relu'),
							layers.Dense(32, activation='relu'),
							layers.Dense(10)])
network.compile(optimizer=optimizers.Adam(lr=0.01),
			loss=tf.losses.CategoricalCrossentropy(from_logits=True),
			metrics=['accuracy']
)
# 从参数文件中读取数据并写入当前网络
network.load_weights('weights.ckpt')
print('loaded weights!')

この保存し、ちょうど数値パラメータテンソルでファイルを保存するための最も軽量な方法のネットワーク、およびなし他の追加の構造パラメータをロードします。しかし、それは、ネットワークが、ソースファイルがある場合、それが一般的に使用され、ネットワークの状態を復元できるようにするには、同じネットワーク構成を使用する必要があります。

ネットワークモード

我々は唯一のモデルパラメータは、ファイルモードのネットワークモデルを復元する必要があり、ネットワークのソースファイルを導入する必要はありません。機能は、ネットワーク構造を復元するkeras.models.load_model(経路)によってネットワークソースファイルを必要とせず、Model.save(パス)とファイルへのパス上のモデルのモデルパラメータの構造によって保存することができるとパラメータ。

ファイルおよび削除ネットワークオブジェクトへの私たちは、最初のデジタル写真の保存MNISTの手書き認識モデル:

# 保存模型结构与模型参数到文件
network.save('model.h5')
print('saved total model.')
del network # 删除网络对象

このとき、ファイルがmodel.h5構造やネットワークの状態によって復元することができます。

# 从文件恢复网络结构与网络参数
network = tf.keras.models.load_model('model.h5')

私たちは、モデルパラメータに加えて、ファイルの保存、model.h5を見ることができるだけでなく、ネットワーク構成情報の保存、ネットワークのネットワークオブジェクト内のファイルから直接復元することができ、事前にモデルを作成する必要はありません。

SavedModel方法

あなたが他のプラットフォームにモデルを展開する必要がある場合は、TensorFlowを使用してSavedModelの方法は、プラットフォームの複数の独立しました。tf.keras.experimental.export_saved_model(ネットワーク、パス)でディレクトリパスを保存するためのモデル缶SavedModel方法:

# 保存模型结构与模型参数到文件
tf.keras.experimental.export_saved_model(network, 'model-savedmodel')
print('export saved model.')
del network # 删除网络对象

ファイル・システム・モデル・savedmodelネットワーク・ファイル・ディレクトリに表示され、次のように:
ここに画像を挿入説明
ユーザーは介してのみ、ファイルの保存形式を気にしません

# 从文件恢复网络结构与网络参数
network = tf.keras.experimental.load_from_saved_model('model-savedmodel')

ネットワーク構造とパラメータを復元するには、各プラットフォームはよく訓練されたシームレスなネットワークモデルを容易にすることができます。

カスタムクラス

Kerasは、多くの一般的なネットワーク層を提供していますが、ネットワーク層の深さの調査は、はるかに多くの古典的なネットワーク層よりも使用することができ、カスタム論理ネットワーク層を作成する必要は、カスタムクラスで実装することができます。カスタムネットワーク層のクラスを作成し、基底クラスlayers.Layerから継承する必要があります。ネットワークを作成するために、カスタムクラス、keras.Modelの必要性は継承に基底クラスから、そのようなカスタムのクラスを簡単にレイヤー/モデルの基本クラスを使用することができて製造しますこれは、他の標準ベースのネットワーク層と相互作用することができるまた、パラメータ管理機能とを提供します。

カスタムネットワーク層

自己定義されたネットワーク層、及びフロント伝播方法__init__初期化ロジックのためのメソッド呼び出しを実装するために必要。

class MyDense(layers.Layer):
# 自定义网络层
def __init__(self, inp_dim, outp_dim):
	super(MyDense, self).__init__()
	# 创建权值张量并添加到类管理列表中,设置为需要优化
	self.kernel = self.add_variable('w', [inp_dim, outp_dim],
trainable=True)

self.add_variableリターン名前の変数名で参照、このテンソルPythonは
内部TensorFlowを維持するために、以下を使用します。我々はできます

In [5]: net = MyDense(4,3) # 创建输入为4,输出为3 节点的自定义层
net.variables,net.trainable_variables

カスタムネットワーク

ネットワーク層を作成するために、オブジェクトに対応するカスタムネットワーククラスの継承最初に作成し、モデルの基本クラスを作成します:

class MyModel(keras.Model):
	# 自定义网络类,继承自Model 基类
	def __init__(self):
			super(MyModel, self).__init__()
			# 完成网络内需要的网络层的创建工作
			self.fc1 = MyDense(28*28, 256)
			self.fc2 = MyDense(256, 128)
			self.fc3 = MyDense(128, 64)
			self.fc4 = MyDense(64, 32)
			self.fc5 = MyDense(32, 10)

そして、前方の論理演算をカスタムネットワークを実装します。

	def call(self, inputs, training=None):
			# 自定义前向运算逻辑
			x = self.fc1(inputs)
			x = self.fc2(x)
			x = self.fc3(x)
			x = self.fc4(x)
			x = self.fc5(x)
			return x

モデルパラダイス

などResNet、VGG、などの一般的なネットワークモデルについては、手動でする必要はありませんネットワークを作成するには、コードkeras.applicationsサブモジュールの次の行から直接作成され、これらの古典的なモデルを使用するだけでなく、事前に訓練されたネットワークの重みパラメータを設定することにより、ロードすることができますすることができますパラメータ、非常に便利。

負荷モデル

転送学習にResNet50、例えば、最後の層は、我々のカスタム・データ・セットに移行する特徴抽出法上記予備訓練ImageNetを使用して、新しいサブネットワーク特徴抽出タスク、すなわち、としてResNet50ネットワークを削除し、カスタムに基づいており、一般的に後タスクのカテゴリ迅速かつ効率的に事前に訓練されたネットワークに基づいて新しいタスクを学ぶことができ、データの数に対応する追加の完全接続層分類カテゴリ。

# 加载ImageNet 预训练网络模型,并去掉最后一层
resnet = keras.applications.ResNet50(weights='imagenet',include_top=False)
resnet.summary()
# 测试网络的输出
x = tf.random.normal([4,224,224,3])
out = resnet(x)
out.shape

コードが自動的にモデル構造上のサーバからダウンロードされたデータが除去最後の層に起因ImageNet事前訓練されたネットワークパラメータを、設定されている、ネットワークの出力サイズは、[B、7,7,2048]です。

In [6]:
# 新建池化层
global_average_layer = layers.GlobalAveragePooling2D()
In [7]:
# 新建全连接层
fc = layers.Dense(100)
# 重新包裹成我们的网络模型
mynet = Sequential([resnet, global_average_layer, fc])
mynet.summary()

resnet.trainable = Falseのパラメータを設定することで、あなたはネットワークモデルのトレーニングを迅速かつ効率的に完了できるよう、唯一の新しいトレーニングネットワーク層を凍結ネットワーク部分ResNetを選択することができます。

測定ツール

トレーニングプロセスにおいて、統計情報は、多くの場合、必要な精度、再現率、平均マニュアルモード外側を計算することによって統計データを取得することに加えて、Kerasは特別統計処理のために訓練された、いくつかの一般的な測定ツールkeras.metricsを提供しますインデックスデータが必要です。

、新しいデータが書かれている測定読んで、測定の統計情報をクリア:測定ツールを使用すると、Keras一般に、4つの基本的な操作手順を持っています。

新しい測定器

keras.metricsモジュールでは、そのような統計的平均平均クラス、のような統計クラスコサイン類似CosineSimilarityの精度のクラスの統計的精度として、より一般的な測定タイプを提供します。ここでは、例えば、時に順方向動作、我々は平均誤差のすべてのバッチを統計誤差値を取得しますが、我々は平均測定を使用することを選んだので、私たちは、統計的な平均誤差エポックことを願っています:

# 新建平均测量器,适合Loss 数据
loss_meter = metrics.Mean()

書き込みデータ

新しいデータは測定機能update_stateで書き込むことができます。

# 记录采样的数据
loss_meter.update_state(float(loss))
上述采样代码放置在每个batch 运算完成后,测量器会自动根据采样的数据来统计平均值。

読む統計

複数回サンプリングした後、測定器は、統計情報を取得する()関数を引き起こすことができます。

# 打印统计的平均loss
print(step, 'loss:', loss_meter.result())

削除

測定の統計は、すべての歴史になるので、正しい時の状態の履歴をクリアする必要があります。それは)(reset_statesによって実現することができます。統計の次のラウンドを開始するために、各読み出した後、例えば、平均誤差、クリア統計:

if step % 100 == 0:
	# 打印统计的平均loss
	print(step, 'loss:', loss_meter.result())
	loss_meter.reset_states() # 清零测量器

可視化

TensorFlowがTensorBoardと呼ばれる特殊な可視化ツールを提供し、彼はデータを監視しますTensorFlow経由のファイルシステムに書き込まれ、バックエンドユーザーがリモートネットワークからの監視データを表示できるようにすることができたWeb対応ファイルディレクトリを、使用して監視しています。

TensorBoardの必要性は、ブラウザとインタラクティブ作品の一部を使用するように訓練します。

ハイエンドモデル

ハイエンドモデルでは、我々は必要なときにデータを監視データと書き込みを監視概要クラスの書き込みを作成する必要があります。まずtf.summary.create_file_writerを通じてオブジェクトを監視作成し、そのディレクトリに書き込まれたデータの監視を開発します:

# 创建监控类,监控数据将写入log_dir 目录
summary_writer = tf.summary.create_file_writer(log_dir)

私たちは、エラーデータと可視化映像データを監視し、例えば、監視データを作成する方法について説明します。最初の計算が完了した後、スカラーデータのためのこのエラーは、我々はデータtf.summary.scalar関数と指定タイムスタンプ工程を監視記録しました。

with summary_writer.as_default():
	# 当前时间戳step 上的数据为loss,写入到ID 位train-loss 对象中
	tf.summary.scalar('train-loss', float(loss), step=step)

TensorBoardは、異なるタイプのデータを監視するために、文字列IDで区別するため、エラーのデータ、という注意、我々は「電車損失」という名前を付け、他のタイプのデータは、データの汚染を防止するために、オブジェクトに書かれていません。

画像データの種類については、画像データがtf.summary.image監視機能によって書き込まれます。

with summary_writer.as_default():
# 写入测试准确率
	tf.summary.scalar('test-acc', float(total_correct/total),step=step)
	# 可视化测试用的图片,设置最多可视化9 张图片
	tf.summary.image("val-onebyone-images:", val_images,max_outputs=9, step=step)

モデルプログラムを実行した後、対応するデータが、指定されたファイルのディレクトリに書き込まれます。

ブラウザ

あなたがプログラムを実行すると、ウェブバックエンドは、パスファイルのディレクトリパス--logdir tensorboardを実行することにより、指定した監視します。

ブラウザを開き、URLを入力します。http:// localhostを:6006は、(IPアドレスは、特定のポートを経由してリモートでアクセスすることができます変更される可能性があり、あなたはコマンドプロンプト見ることができる)ネットワークトレーニングスケジュールを監視すること。

監視ページの上端には、このようなスカラー監視ページスカラーなど異なる種類のデータ、のページ、画像の視覚ページ画像を監視するために選択することができ、あなたは、ヒストグラムを表示し、ヒストグラムページにおけるテンソルそうすることができます。

スカラーデータと映像データを監視することに加えて、TensorBoardもtf.summary.histogramビューテンソルデータのヒストグラム分布、ならびに情報tf.summary.text印刷テキストでサポートされています。

with summary_writer.as_default():
	# 当前时间戳step 上的数据为loss,写入到ID 位train-loss 对象中
	tf.summary.scalar('train-loss', float(loss), step=step)
	# 可视化真实标签的直方图分布
	tf.summary.histogram('y-hist',y, step=step)
	# 查看文本信息
	tf.summary.text('loss-text',str(float(loss)))
公開された227元の記事 ウォン称賛94 ビュー540 000 +

おすすめ

転載: blog.csdn.net/wiborgite/article/details/104266533