我在图像分类任务中使用了泰勒展开。基本上,首先,从RGB图像生成像素向量,并且像素向量中的每个像素值将用sin(x)
的泰勒级数展开来近似。在tensorflow实现中,我尝试用tensorflow对其进行编码,但当我尝试用扩展项叠加tensor来创建特征图时,仍然存在一些问题。有人能提供可能的观点吗?我怎样才能使我目前的尝试更有效率?有什么想法吗
以下是sin(x)
泰勒级数的展开项:
以下是我目前的尝试:
term = 2
c = tf.constant([1, -1/6])
power = tf.constant([1, 3])
x = tf.keras.Input(shape=(32, 32, 3))
res =[]
for x in range(term):
expansion = c * tf.math.pow(tf.tile(x[..., None], [1, 1, 1, 1, term]),power)
m_ij = tf.math.cumsum(expansion, axis=-1)
res.append(m_i)
但这并不是很有效,因为我想从每个扩展神经元创建输入特征映射,delta_1
,delta_2
需要堆叠,这是我在上面的尝试中没有正确完成的,而且我的代码也没有很好地通用化。如何以正确的实现方式改进上述编码尝试?有谁能给我可能的想法或规范的答案来改进我目前的尝试吗
如果按照所述进行系列扩展,如果输入具有C通道且扩展具有T项,则扩展输入应具有C*T通道,否则形状相同。因此,原始输入和每个项的近似函数应沿通道维度连接。使用转置和重塑比使用实际的连接更容易实现这一点
下面是在CIFAR10上训练的卷积网络的示例代码:
这假设原始网络(无扩展)的第一层如下所示:
网络的其余部分与不进行扩展时完全相同
terms
包含原始文档中的c_i*x^p_i列表expansion
包含单个张量(其中T是第一维)中的项(第一、然后是第一和第二等)的和expansion_terms_last
将T维度移动到最后一个,并且重新整形将形状从(..., C, T)
更改为(..., C*T)
model.summary()
的输出如下所示:在CIFAR10上,通过扩展,该网络的训练效果稍好-可能会获得1%的精度增益(从71%到72%)
使用示例数据逐步解释代码:
关键假设(1)c_i和p_i不是学习参数,因此“扩展神经元”实际上不是神经元,它们只是一个乘法和求和节点(尽管神经元听起来更酷:)和(2)每个输入通道的扩展是独立的,因此,扩展为T项的C输入通道每个产生C*T输入特征,但每个通道的T特征完全独立于其他通道计算(如图中所示),并且(3)输入包含所有部分和(即C_1*x^p_1、C_1*x^p_1+C_2*x^p_2等等)但不包含术语(同样,在图表中看起来是这样的)
相关问题 更多 >
编程相关推荐