iT邦幫忙

0

在keras model中加入自定義function

我想在keras model中加入自定義function,功能是將tensor中每一個element和一個數比大小,若大於此數則輸出1,若小於此數則輸出0,因此我define了一個function:

def Compare(input_tensor):
    input_shape = input_tensor.get_shape().as_list()
    y = tf.placeholder(dtype=tf.float32, shape=[None,55,55,96], name='y')

    for j in range(input_shape[1]):
        for k in range(input_shape[2]):
            for z in range(input_shape[3]):
                y = tf.map_fn(lambda x: tf.cond(tf.greater(x[j][k][z], -4.4), lambda: 1.0, lambda: 0.0),input_tensor,dtype=tf.float32)
    print(y)
    return y

其中,[55,55,96]是我的input tensor shape也是output tensor shape,-4.4是我用來比大小的門檻值,如上面所說,大於-4.4則輸出1,小於-4.4則輸出0。
接這我再將此function用keras.layers.lambda轉換成layer並放到model裡面

conv1     = Conv2D(96,(11,11),strides=4,activation=None)(input_img)
conv1     = Lambda(Compare)(conv1)

我是用jupyter notebook,沒有出現error但一直跑不完,我不知道是不是我的code寫得不好或有其他問題,希望各位邦友能給我一些建議,謝謝大家!

1 個回答

2
I code so I am
iT邦研究生 4 級 ‧ 2020-05-04 19:46:38
最佳解答

應該要寫一個layer,請參考
https://keras.io/layers/writing-your-own-keras-layers/

前輩您好,謝謝您回覆我的問題!我之前有看過此教學,他開頭說到

For simple, stateless custom operations, you are probably better off using layers.core.Lambda layers. But for any custom operation that has trainable weights, you should implement your own layer.

因為我只是要將tensor的數值做轉換,並沒有trainable weights,因此我先def function再用lambda將function轉成layer,我有將轉換的結果print出來,因為我的維度是[55,55,96],應該會有55 * 55 * 96 = 290400的結果被print出來,但每次都只運算到一半就沒有繼續跑下去!
https://ithelp.ithome.com.tw/upload/images/20200504/20126466CjbKjADnAf.png
若要用前輩建議我的方法

call(x): this is where the layer's logic lives.

這個部分有一定要用keras.backend的function嗎?還是可以用tensorflow嗎?
不好意思我是新手問題比較多><希望知道如何解決的邦友可以回覆我,謝謝大家!

  1. tensorflow 現在也support keras,可參考:
    https://www.tensorflow.org/guide/keras/custom_layers_and_models
  2. neuron network 每一層都會有weight, build function 照抄,focus 在 call function 即可。

我要發表回答

立即登入回答