pythonボリューム操作の実装
19805 ワード
文書ディレクトリ
tfを呼び出す.nn.conv 2 d()実装ボリューム
まず、ボリューム関数を呼び出してボリューム操作を実現する:ここでconv 2 dの定義とパラメータの意味を説明する:【定義:】tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
【パラメータ:】input:入力するボリュームを作るピクチャは、1つのテンソルであることを要求し、shapeは[batch,in_height,in_weight,in_channel]であり、batchはピクチャの数であり、in_Heightは画像の高さ、in_Weightは画像幅、in_channelはピクチャのチャネル数であり,階調図はこの値が1,カラー図は3である.(他の値も使用できますが、具体的な意味はよく分かりません)filter:ボリュームコア、要件もテンソルであり、shapeは[filter_height,filter_weight,in_channel,out_channels]であり、filter_Heightはボリュームコア高さ、filter_Weightはボリュームコア幅、in_チャンネルは画像チャネル数とinputのin_チャネルは一貫性を保つchannelはボリュームコアの数です.strides:画像の各次元のステップ長でボリューム化され、これは1次元のベクトルであり、[1,strides,strides,1]、1番目と最後の固定は1 padding:stringタイプでなければならず、値は「SAME」と「VALID」であり、ボリューム化の形式を表し、エッジ境界を考慮するかどうかを表す.「SAME」は境界を考慮し、足りない場合は0で周囲を埋め、「VALID」はuse_を考慮しないcudnn_on_gpu:boolタイプ、cudnn加速を使用するかどうか、デフォルトはtrueimport tensorflow as tf
import numpy as np
input = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
input = input.reshape([1,5,5,1]) # conv2d , reshape
kernel = np.array([[1,0,1],[0,1,0],[1,0,1]])
kernel = kernel.reshape([3,3,1,1]) #kernel reshape
print(input.shape,kernel.shape) #(1, 5, 5, 1) (3, 3, 1, 1)
x = tf.placeholder(tf.float32,[1,5,5,1])
k = tf.placeholder(tf.float32,[3,3,1,1])
output = tf.nn.conv2d(x,k,strides=[1,1,1,1],padding='VALID')
with tf.Session() as sess:
y = sess.run(output,feed_dict={x:input,k:kernel})
print(y.shape) #(1,3,3,1)
print(y) # y , , (3*3 ):[[4,3,4],[2,4,3],[2,3,4]]
自己実現ボリューム関数
次に、care batchとchannelの2次元ではなく、真ん中の2次元を直接例にとるボリューム操作を実現します.次は実装のコードです(私は怠け者で、ステップ長、paddingなどは考えていません):import numpy as np
input = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
kernel = np.array([[1,0,1],[0,1,0],[1,0,1]])
print(input.shape,kernel.shape)
def my_conv(input,kernel):
output_size = (len(input)-len(kernel)+1)
res = np.zeros([output_size,output_size],np.float32)
for i in range(len(res)):
for j in range(len(res)):
res[i][j] = compute_conv(input,kernel,i,j)
return res
def compute_conv(input,kernel,i,j):
res = 0
for kk in range(3):
for k in range(3):
print(input[i+kk][j+k])
res +=input[i+kk][j+k]*kernel[kk][k] # ,
return res
print(my_conv(input,kernel))
出力:[[4. 3. 4.]
[2. 4. 3.]
[2. 3. 4.]]
import tensorflow as tf
import numpy as np
input = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
input = input.reshape([1,5,5,1]) # conv2d , reshape
kernel = np.array([[1,0,1],[0,1,0],[1,0,1]])
kernel = kernel.reshape([3,3,1,1]) #kernel reshape
print(input.shape,kernel.shape) #(1, 5, 5, 1) (3, 3, 1, 1)
x = tf.placeholder(tf.float32,[1,5,5,1])
k = tf.placeholder(tf.float32,[3,3,1,1])
output = tf.nn.conv2d(x,k,strides=[1,1,1,1],padding='VALID')
with tf.Session() as sess:
y = sess.run(output,feed_dict={x:input,k:kernel})
print(y.shape) #(1,3,3,1)
print(y) # y , , (3*3 ):[[4,3,4],[2,4,3],[2,3,4]]
次に、care batchとchannelの2次元ではなく、真ん中の2次元を直接例にとるボリューム操作を実現します.次は実装のコードです(私は怠け者で、ステップ長、paddingなどは考えていません):
import numpy as np
input = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
kernel = np.array([[1,0,1],[0,1,0],[1,0,1]])
print(input.shape,kernel.shape)
def my_conv(input,kernel):
output_size = (len(input)-len(kernel)+1)
res = np.zeros([output_size,output_size],np.float32)
for i in range(len(res)):
for j in range(len(res)):
res[i][j] = compute_conv(input,kernel,i,j)
return res
def compute_conv(input,kernel,i,j):
res = 0
for kk in range(3):
for k in range(3):
print(input[i+kk][j+k])
res +=input[i+kk][j+k]*kernel[kk][k] # ,
return res
print(my_conv(input,kernel))
出力:
[[4. 3. 4.]
[2. 4. 3.]
[2. 3. 4.]]