pythonボリューム操作の実装

19805 ワード

文書ディレクトリ

  • はtfを呼び出す.nn.conv 2 d()実装ボリューム
  • 自己実現畳み込み関数
  • tensorflowにはボリューム関数が含まれていることを知っています.tf.nn.conv 2 d()は関連機能を実現することができ、本文は主に自分でボリューム操作を実現し、その後tf.nn.conv 2 d()関数の結果を比較し,正確性を検証する.

    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加速を使用するかどうか、デフォルトはtrue
    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.]]