如何在Keras Lambda层中实现一维插值?
解决Keras Lambda层插值无梯度问题
别用
np.interp,直接换TensorFlow原生的tf.math.interp函数。numpy的操作属于静态计算,不会被Keras的计算图追踪梯度,而TensorFlow的原生函数支持自动微分,能正常传播梯度。代码示例:
原来用numpy的无梯度写法:from tensorflow.keras.layers import Lambda import numpy as np def interpolate_fn(x): # x[0]为带插值的原始数据,x[1]为目标查询点 return np.interp(x[1], x[0][:,0], x[0][:,1]) interp_layer = Lambda(interpolate_fn)改成TensorFlow的可微分写法:
from tensorflow.keras.layers import Lambda import tensorflow as tf def interpolate_fn(x): # 拆分输入:x[0]是原始数据,维度为[batch_size, 点数, 2];x[1]是目标查询点,维度为[batch_size, 查询点数] raw_x = x[0][:, :, 0] raw_y = x[0][:, :, 1] queries = x[1] # tf.math.interp参数顺序和np.interp完全一致:查询点、原始x轴值、原始y轴值 return tf.math.interp(queries, raw_x, raw_y) interp_layer = Lambda(interpolate_fn)要是需要多维插值(比如二维),可以用
tf.image.resize或者tf.grid_sample这类TensorFlow原生插值函数,同样支持梯度传播。
内容的提问来源于stack exchange,提问作者raffale_05
相关产品推荐
相关产品推荐

