将numpy操作转换为tensorflow lay的输出

2024-09-30 18:24:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用tensorflow和keras转换numpy层

# output from model
op_from_model = <tf.Tensor '1_conv_1x1_parts/BiasAdd:0' shape=(?, 64, 64, 16) dtype=float32>

# Numpy style - 
from scipy.ndimage import gaussian_filter, maximum_filter
import numpy as np
lst = np.zeros([16,3])
for i in range(maps.shape[-1]):
    _map = maps[:,:,i]
    _map = gaussian_filter(_map, sigma=0.3)
    _nmsPeaks = non_max_supression(_map, windowSize=3, threshold=1e-6)
    y, x = np.where(_nmsPeaks == _nmsPeaks.max())
    if len(x) > 0 and len(y) > 0:
        lst[:,i] = [int(x[0]), int(y[0]), _nmsPeaks[y[0], x[0]]]

def non_max_supression(map, windowSize, threshold):
    under_th_indices = plain < threshold
    plain[under_th_indices] = 0
    return plain * (plain == maximum_filter(plain, footprint=np.ones((windowSize, windowSize))))


#TF layer style

# adapted from here https://stackoverflow.com/questions/52012657/how-to-make-a-2d-gaussian-filter-in-tensorflow 
from keras import backend as K
import tensorflow as tf

def gaussian_kernel(size: int, mean: float, std: float):
    d = tf.distributions.Normal(mean, std)
    vals = d.prob(tf.range(start = -size, limit = size + 1, dtype = tf.float32))
    gauss_kernel = tf.einsum('i,j->ij', vals, vals)
    return gauss_kernel / tf.reduce_sum(gauss_kernel)

gauss_kernel = gaussian_kernel(5, 0.44, 0.5) # have to set correct params here 
gauss_kernel = gauss_kernel[:, :, tf.newaxis, tf.newaxis]
filt_op = tf.nn.conv2d(np.expand_dims(np.expand_dims(np.array(map[:,:,0] , dtype = np.float32), axis=0),axis=3), 
                       gauss_kernel, strides=[1, 1, 1, 1], padding="SAME")    

peaks_nhwc_tensor = tf.nn.max_pool(filt_op, windowSize, strides= [1,1,1,1], padding="SAME", data_format='NHWC')
# not sure of the equivalent op here compared to numpy above 
y, x = tf.where(peaks_nhwc_tensor == peaks_nhwc_tensor.max())

如何从过滤后的指数中得到lst作为模型的输出?我正在使用keras和TF。你知道吗

输入:从模型到形状的运算[1,64,64,16]

输出:过滤操作后-形状[16,3]#[x,y,置信度#分数]


Tags: fromimportmaptftensorflownpgaussianfilter
1条回答
网友
1楼 · 发布于 2024-09-30 18:24:50

转换模型的等效代码如下所示

model_output = op_from_orig_model

import tensorflow as tf
from keras.layers import Lambda
from keras.models import Model

def gaussian_kernel(size: int, mean: float, std: float, ):
    d = tf.distributions.Normal(mean, std)
    vals = d.prob(tf.range(start = -size, limit = size + 1, dtype = tf.float32))
    gauss_kernel = tf.einsum('i,j->ij', vals, vals)
    return gauss_kernel / tf.reduce_sum(gauss_kernel)

gauss_kernel = gaussian_kernel(5, 0.0, 0.3)

def gaussian(x):
    return tf.nn.conv2d(x, gauss_kernel, strides=[1, 1, 1, 1], padding="SAME")

def pooling(x):
    return tf.nn.max_pool(x, ksize=[1,3,3,1], strides= [1,1,1,1], padding="SAME")

def keepers(x):
    return tf.where(tf.equal(x, tf.reduce_max(tf.reduce_max(x, axis=1), axis=1)))


gauss = Lambda(lambda x: gaussian(x))(model_output)
filter_op = Lambda(lambda x:pooling(x))(gauss)
vals = Lambda(lambda x:keepers(x))(filter_op)

new_model = Model(inputs=original_model.inputs, outputs=[vals])

希望这对别人有帮助。你知道吗

相关问题 更多 >