まず、テンソルフローとケラを学習するためのWebサイトをお勧めします。基本的には、次のドキュメントを参照することで取得できます。
https://tensorflow.google.cn/api_docs/python/tf/keras/Model
浅いものから深いものへの深層学習の初心者が遭遇するいくつかの落とし穴は次のとおりです。
Pythonについて:
- パッケージインポート
アイテムからのフォームを使用する場合、対応するアイテムは、パッケージ内のサブモジュール(サブパッケージ)、または関数、クラス、変数など、パッケージで定義されている他の名前のいずれかです。 - インポート構文は、最初にアイテムをパッケージ定義の名前として扱い、見つからない場合は、モジュールに従ってインポートを試みます。見つからない場合は、おめでとうございます。:exc:ImportError例外がスローされました。
- 逆に、import.tem.subitem.subsubitemのようなインポートフォームを使用する場合、最後のアイテムを除くすべてがパッケージである必要があり、最後のアイテムはモジュールまたはパッケージにすることができますが、クラス、関数、または変数を最初にすることはできません。名前。
numpyについて:
1.コロンなし、シングルコロン、ダブルコロンの3つのポイントを区別します。
- a [...、2]:...は各行をトラバースすることを意味し、2はインデックスが2の列を意味します。
- a [...、:2]:...は各行をトラバースすることを意味し、:2はインデックスが0,1でインデックスが<2の列を意味します。
- a [...、:: 2]:...は各行をトラバースすることを意味し、2はステップ長を意味し、多重指数が0、2、4である列を選択します。
- a [::-1]:反転、出力されるリストの固定次元が反転します。
import numpy
>>> a = numpy.array([[1,2,3,4,5],[6,7,8,9,10],[1,2,3,4,5],[6,7,8,9,10]])
>>> a
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
>>> a[...,2]
array([3, 8, 3, 8])
>>> a[...,:2]
array([[1, 2],
[6, 7],
[1, 2],
[6, 7]])
>>> a[...,::2]
array([[ 1, 3, 5],
[ 6, 8, 10],
[ 1, 3, 5],
[ 6, 8, 10]])
2. tensorflow 2.xバージョンでの.numpy()の
使用についてディープラーニングトレーニングにTensorFlowを使用する場合、csvや写真データなどのNumpyデータに挨拶することがよくあります。しかし、TensorFlowがトレーニング中に変数を保存するためにTensorを使用することは誰もが知っています。そして、ネットワーク出力の結果もTensorです。通常の状況では、TensorFlowネットワークはNumpyデータを入力するときに処理のために自動的にTensorに変換されるため、NumpyとTensorの違いを感じることはありません。2.xバージョンではセッションメカニズムがキャンセルされているため、開発者は.numpy()メソッドを直接実行してテンソルを変換できます。
data_numpy = data_tensor.numpy()
変換前の出力はtf.Tensor(1.0、shape =()、dtype = float32)であり、変換された出力は1.0です。
CNNについて
1. 7×7コンボリューションカーネルと1×1コンボリューションカーネルを使用して、同じステップサイズでダウンサンプリングします。2つの違いは何ですか。
受容野が異なり、7×7のスライディングウィンドウが大きく、抽出面積も大きい。
2.畳み込みカーネルを使用したプーリングとダウンサンプリングの違いは何ですか?
最も直接的なことは、プーリングと畳み込みの計算が同じではないことです。どちらも、特徴マップで効果的な情報抽出を実行し、次元削減を実行します。プーリングの利点は、計算量が最大または平均のいずれかで少ないことです。 conv Largeの計算量ですが、convの利点は、チャネル間で情報を交換できることです。これにより、特徴抽出がより容易になります。
3. CNN入力画像のサイズ要件について、
簡単な要約を作成し
ます。1。完全に接続されたレイヤーがあるため、事前トレーニングモデルを使用しない場合は、トレーニング画像のサイズがと同じであることを確認する必要があります。予測画像サイズ;
2。事前トレーニングモデルを使用する場合、独自のテストセットの入力画像サイズは元のモデルトレーニングサイズと同じである必要があります;
3.移行学習の場合、最初のいくつかのレイヤーの重みは固定されています、および完全に接続されたレイヤーを含むネットワークレイヤーの一部のみがトレーニングされます。つまり、全体的な移行ではありません。元のモデルトレーニング要件と同じサイズである必要があります。
テンソルフローについて
1. tensorflowのデータ型
テンソルには、データ、ディメンション、データタイプ、まずはディメンションに関する3つの属性があります。次元は、テンソルの左端にある左角括弧の数によって異なります。nがある場合、このテンソルはn次元テンソルです。。次のように:
1 #维度为0的标量
[1,2,3] #维度为1,一维向量
[[1,2],[3,4]] #维度为2, 二维矩阵
[[[1,2],[3,4]],[[1,2],[3,4]]] #维度为3,3维空间矩阵
shape()の括弧内の数字の数は、テンソルの次元数を示します。
2.tf.keras.metricsについてtensorflow2.xで
モデルをコンパイルすると、パラメーターの1つがメトリックであることがわかります。トレーニング中にいくつかのパフォーマンス指標を監視するために使用されます、そしてこのパフォーマンスインデックスが何であるかは私たちが指定することができます。パフォーマンス評価関数は目的関数に似ていますが、その評価結果はトレーニングには使用されません。。
最初に知っておく必要があるのは、それがメトリックの下のクラスである場合、そのインスタンス化されたオブジェクトには次の3つの属性があるということです。
- reset_states()以前の計算結果をクリアします。これは、計算をリセットして再開することと同じです。
- result()は結果を計算して返します
- update_state()は、更新された各データをデータのセットと見なすため、実際の計算中に各セットの結果が計算され、次に複数のセットの結果の平均が計算されます。しかし、直接計算されません。計算はまだ結果は()が呼び出されたときに実行され
、テンソルデータはnumpyのデータに変換する.numpy使用し、取得した、とされる-in m.result()。
ここでは例です:
m = tf.keras.metrics.Accuracy() #新建一个实例化对象
m.update_state([1, 2, 3, 4], [0, 2, 3, 4]) #向对象中添加数据
m.result().numpy()
#输出:0.75
m.reset_states()
m = tf.keras.metrics.CategoricalAccuracy()
_ = m.update_state([[0, 0, 1], [0, 1, 0]], [[0.1, 0.9, 0.8],
[0.05, 0.95, 0]])
m.result().numpy()
#输出:0.5
m = tf.keras.metrics.SparseCategoricalAccuracy()
_ = m.update_state([[2], [1]], [[0.1, 0.9, 0.8], [0.05, 0.95, 0]])
m.result().numpy()
#输出:0.5
3.self.conv1について= Conv2D(32、3、activation = 'relu')およびx = self.conv1(x)
前者はクラスのインスタンス化オブジェクトであり、後者は畳み込み演算です。なぜ最後に(x)があるのですか?これはテンソルフローを記述する特定の方法です目的は、畳み込み層にデータを追加してから出力を返すことです。上記の2つの形式も次のように記述できます。
- x = Conv2D(32、3、アクティベーション= '再読み取り')(x)
注:これは関数の入力とは異なります。通常の状況では、関数の入力は括弧内に配置され、クラスのインスタンス化とデータの追加を組み合わせた2つの括弧があります。 1つの固定された書き方。tensorflowの公式ウェブサイトに詳細な手順があります。
モデルトレーニングについて
CPUしかない場合は、シリアルプロセスです。CPUは、最初に画像を読み込んで前処理を実行し、次にトレーニングを実行して継続的に繰り返します。GPUを使用している場合、CPUは画像の読み取りと前処理プロセスのみを担当します。 GPUはネットワークに集中します。トレーニングでは、CPUがバッチを読み取るたびに、GPUがバッチをトレーニングするため、時間の消費が大幅に削減されます。
tf.data.Dataset.from_tensor_slices()メソッドを使用してデータを並列に読み取るのはなぜですか?
kerasデータジェネレーターを使用する場合、現在のバージョンではマルチスレッドを使用できないため、効率が非常に低くなります。CPUの読み取りと処理には長い時間がかかりますが、GPUの操作には短時間しかかかりません。時間。この場合、GPUは何度もアイドル状態になり、GPUリソースが適切に使用されません。マルチスレッド方式を使用すると、CPUの読み取りと前処理にかかる時間が大幅に短縮され、GPUの占有率が大幅に向上し、ネットワークのトレーニングプロセス全体も向上します。