畳み込みニューラルネットワークは、(コードの実装で)フレームを実装(II)

学習ソース: 理論と実際の戦闘を学ぶ深
前回の記事では、我々はそれが畳み込みを何を意味するのか知って、理解するためにいくつかの基本的な概念を行うには、ニューラルネットワークを畳み込み、プールされているもの、畳み込みニューラルネットワークは何ですか。この記事の主な内容は、実現のコンボリューションとtensorflowと共にプールです。
導入されたバージョンを使用してください:
tensorflow:1.15
Pythonの:3

回旋

API tensorflowコンボリューションは、あるtf.nn.conv2d()。
下に示すように、パラメータ:
tf_converlution
次のようにパラメータを説明する
最初のパラメータ: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')

source_cat

查看图片维度
print (cat.shape[0])
print (cat.shape[1])

h_w

# 将图片矩阵转化为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))

con_same

# padding="VALID"
plt.imshow(np.squeeze(edge2_np),cmap='gray')
plt.title('shape={}'.format(edge2_np.shape))

conv_valid
2つのメソッドを比較することにより、我々は、入力と出力の次元寸法同じ画像が同じであるために私たちは、パディング何?分かりました。

プーリング

tensorflowこの議論において、我々は細胞層API :. tf.nn.max_pool()を最大化、カプセル化されたAPI層をプールした
:以下のようにパラメータを
max_pool
具体的説明:
値:即ち入力は、(四次元テンソルであります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))

pool_max

# 画图 padding='VALID'
plt.imshow(np.squeeze(small_im2_np),cmap='gray')
plt.title('shape={}'.format(small_im2_np.shape))

valid_pool
戦略はゼロパディング層をプール見出され、出力の大きさには影響されません。

总结,通过卷积和池化实现,我们发现,池化在维度下降一半的情况下,并没有丢失多少信息。
リリース8元の記事 ウォンの賞賛6 ビュー2526

おすすめ

転載: blog.csdn.net/weixin_42374329/article/details/105222107