[英]Tensorflow simple cumulative sum of product RNN cell
我正在嘗試構建一個 Tensorflow model 來計算兩個輸入特征的乘積的累積和,即僅預測 (1,2) 應該返回 2,然后預測 (2,2) 應該給出 6=(1 * 2) + (2 * 2)
model.predict([1,2])
>>> 2
model.predict([2,2])
>>> 6
model.reset_states()
model.predict([2,2])
>>> 4
我嘗試了以下方法:
import numpy as np
import tensorflow as tf
class MinimalRNNCell(tf.keras.layers.Layer):
def __init__(self, units, **kwargs):
self.states = np.array([0])
self.state = np.array([0])
self.units = units
self.state_size = units
super(MinimalRNNCell, self).__init__(**kwargs)
def call(self, inputs, states):
prev_output = states[0]
output = tf.math.add(prev_output,inputs)
return output, [output]
# Define model
#input
inp = tf.keras.layers.Input(shape=(2,))
#split input
x1,x2 = tf.split(inp, num_or_size_splits=2, axis=1)
#calculate product
product = tf.math.multiply(x1,x2)
#reshape product
time_product = tf.keras.layers.Reshape((1,1))(product)
#Define memory cell and layer
memory_product = MinimalRNNCell(units=1)
layer_product = tf.keras.layers.RNN(memory_product)
#calculate cumulative product
cumulative_product = layer_product(time_product)
output = cumulative_product
model = tf.keras.models.Model(inp, output)
if __name__=="__main__":
x = np.array([
[1, 2],
[2, 2]
])
model.compile()
y = model.predict(x)
print()
print("outptut: ", y)
>>> [[2],
[4]]
請注意我拆分輸入的原因是因為這是應該工作的最小 model。 我正在實施的 model 更復雜,並且有更多的步驟相互關聯,但這是我無法開始工作的積累。 我覺得使用RNN或LSTM單元可以很容易地實現累積和之類的東西,但它並不像我期望的那樣工作。
如果您只想累積乘積,則在build()
方法上initialize
weight
,然后每次將model.predict()
的結果添加到其中。 這是代碼...
import tensorflow as tf
tf.keras.backend.clear_session()
class CumulativeProduct(tf.keras.layers.Layer):
def __init__(self):
super(CumulativeProduct, self).__init__()
def build(self, input_shape):
self.cumulative_product = self.add_weight(shape=(), initializer=tf.keras.initializers.Zeros(), trainable=False)
def call(self, inputs):
self.cumulative_product.assign(self.cumulative_product + tf.reduce_sum(tf.reduce_prod(inputs, axis=1)))
return self.cumulative_product
def reset_states(self):
self.cumulative_product.assign(0.)
inp = tf.keras.layers.Input(shape=(2,))
cumulative_product = CumulativeProduct()
cum_prod = cumulative_product(inp)
model = tf.keras.models.Model(inp, cum_prod)
x = [[1, 2], [2,2]]
model.predict(x)
6.0
x = [[2, 2]]
model.predict(x)
10.0
#to reset the model variable
cumulative_product.reset_states()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.