学習ソース: 理論と実際の戦闘を学ぶ深
前回の記事では、我々はそれが畳み込みを何を意味するのか知って、理解するためにいくつかの基本的な概念を行うには、ニューラルネットワークを畳み込み、プールされているもの、畳み込みニューラルネットワークは何ですか。この記事の主な内容は、実現のコンボリューションとtensorflowと共にプールです。
導入されたバージョンを使用してください:
tensorflow:1.15
Pythonの:3
回旋
API tensorflowコンボリューションは、あるtf.nn.conv2d()。
下に示すように、パラメータ:
次のようにパラメータを説明する
最初のパラメータ:INPUT、すなわち入力データ、典型的に(バッチ、H、W、チャネル ) 4次元ベクトルのを:
- バッチ:の絵の数を入力します。
- H:画像の高さを表します
- W:画像の幅を表します。
- チャネル:絵は、チャネル3 RPGの画像として、チャネルの数を表します。
第二のパラメータ:フィルタ、すなわちコンボリューションカーネルだけでなく、4次元のベクトルのうちの1つ(k_h、k_w、IN、OUT)によって:
- k_h:コンボリューションカーネルの高さ
- w_h:コンボリューションカーネルの幅
- で:チャネルの数、チャネルの同じ数の一般的な画像
- アウト:畳み込みすなわち、数
三番目のパラメータ:ストライド、すなわち移動ステップだけでなく、オン(1、S_H、s_w、1)による4次元ベクトル:
- S_H:ステップの高さに移動します
- s_w:幅ステップで移動します
- 約S_H、位置s_w事実に関連するパラメータ、及びDATA_FORMAT、2つの形態でDATA_FORMAT: " "NHWC" および "NCHW"、後者の場合は前者、strdesは、(1、S_H、s_w、1)のように表現すれば、表さストライド(1,1、S_H、s_w)
第四パラメータ:パディング、出力がゼロ方針で埋められますかどうか、です
- パディング=「SAME」、tensorflow意志出力ゼロパディングは、同じ入力および出力の寸法のことを確保するため、もし。
- パディング場合=「VALID」、tensorflowは自動的にゼロをしません。
デフォルトの他のパラメータは、学生が自分の興味を探索することができます。
畳み込み符号の実装
# 导入相关模块
import tensorflow as tf
import urllib.request
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
#导入图片
cat_url = 'https://image.ibb.co/iFGs0x/kitty.png'
cat = Image.open(urllib.request.urlopen(cat_url)).convert('L')
cat = np.array(im,dtype='float32')
# 可视化图片
plt.imshow(cat.astype('uint8'),cmap='gray')
查看图片维度
print (cat.shape[0])
print (cat.shape[1])
# 将图片矩阵转化为tensor
cat = tf.constant(cat.reshape((1,cat.shape[0],cat.shape[1],1)),name='input')
# 定义一个卷积核
sobel_kernel = np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]],dtype=np.float32)
sobel_kernel = tf.constant(sobel_kernel,shape=(3,3,1,1))
#调用tensorflow 卷积API
# padding='SAME' 的卷积
edge1 = tf.nn.conv2d(cat,sobel_kernel,[1,1,1,1],'SAME',name='same_conv')
# padding='VALID'的卷积
edge2 = tf.nn.conv2d(cat,sobel_kernel,[1,1,1,1],'VALID',name='valid_conv')
#激活tensorflow
sess = tf.InteractiveSession()
edge1_np = sess.run(edge1)
edge2_np = sess.run(edge2)
# padding = 'SAME'下的图片
plt.imshow(np.squeeze(edge1_np),cmap='gray')
plt.title('shape={}'.format(edge1_np.shape))
# padding="VALID"
plt.imshow(np.squeeze(edge2_np),cmap='gray')
plt.title('shape={}'.format(edge2_np.shape))
2つのメソッドを比較することにより、我々は、入力と出力の次元寸法同じ画像が同じであるために私たちは、パディング何?分かりました。
プーリング
tensorflowこの議論において、我々は細胞層API :. tf.nn.max_pool()を最大化、カプセル化されたAPI層をプールした
:以下のようにパラメータを
具体的説明:
値:即ち入力は、(四次元テンソルでありますBATCH、H、W、チャネル)。
ksize:コアのプールサイズを、四次元テンソル(1、k_h、k_w、ある 1)、 および畳み込みと同義。
ストライド:.畳み込み同じ意味ストライド
パディング:パディングとコンボリューション意味。
プーリングコードの実装
# padding='SAME'
small_im1 = tf.nn.max_pool(cat,[1,2,2,1],[1,2,2,1],'SAME',name='same_max_pool')
# padding = "VALID"
small_im2 = tf.nn.max_pool(cat,[1,2,2,1],[1,2,2,1],'VALID',name = 'valid_max_pool')
# 激活tensor
small_im1_np,small_im2_np = sess.run([small_im1,small_im2])
#画图 padding='SAME'
plt.imshow(np.squeeze(small_im1_np),cmap='gray')
plt.title('shape={}'.format(small_im1_np.shape))
# 画图 padding='VALID'
plt.imshow(np.squeeze(small_im2_np),cmap='gray')
plt.title('shape={}'.format(small_im2_np.shape))
戦略はゼロパディング層をプール見出され、出力の大きさには影響されません。
总结,通过卷积和池化实现,我们发现,池化在维度下降一半的情况下,并没有丢失多少信息。