簡體   English   中英

Tensorflow 乘積RNN單元的簡單累加和

[英]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 更復雜,並且有更多的步驟相互關聯,但這是我無法開始工作的積累。 我覺得使用RNNLSTM單元可以很容易地實現累積和之類的東西,但它並不像我期望的那樣工作。

如果您只想累積乘積,則在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM