Python 如何在tensorflow中将每个历元中的张量值保存在一个层中并传递给下一个历元

Python 如何在tensorflow中将每个历元中的张量值保存在一个层中并传递给下一个历元,python,tensorflow,neural-network,keras-layer,Python,Tensorflow,Neural Network,Keras Layer,我有一个一般性问题 我正在开发一个新的层,以纳入一个自动编码器。更具体地说,该层类似于上面的KCompetitive类。我想要的是,我需要将这一层的输出保存在一个变量中,我们称之为previous\u mat\u values,然后在下一个历元中将其传递到同一层 换句话说,我希望能够将这一层的epoch 1的输出保存在一个变量中,然后在epoch 2中,再次使用相同的矩阵 所以问题出现了,在第一个历元,这个矩阵的值是多少,因为它还没有那个层的输出。我们可以使用相同形状的权重矩阵初始化数组,但值为

我有一个一般性问题

我正在开发一个新的层,以纳入一个自动编码器。更具体地说,该层类似于上面的
KCompetitive
类。我想要的是,我需要将这一层的输出保存在一个变量中,我们称之为
previous\u mat\u values
,然后在下一个历元中将其传递到同一层

换句话说,我希望能够将这一层的
epoch 1
的输出保存在一个变量中,然后在
epoch 2
中,再次使用相同的矩阵

所以问题出现了,在第一个历元,这个矩阵的值是多少,因为它还没有那个层的输出。我们可以使用相同形状的权重矩阵初始化数组,但值为
0
我将这样做

previous_mat_values = tf.zeros_like(weight_tensor)
因此,步骤如下:

  • 在第一个历元中,
    以前的材料值
    重量
    将传递到该层

    1.a在该层函数的末尾,我们称之为“修改的重量”的最终值将保存到“以前的重量”值中

    previous_mat_values=修改的_weight_mat

  • 在第二个历元中,
    previous\u mat\u值
    weight\u mat
    将传递到层,但是,
    previous\u mat\u值
    在第一个历元中保存了值

  • 我没有任何问题通过
    weight\u mat
    并做与此相关的事情。这里唯一的问题是,我们如何在每个历元中保存
    以前的\u mat\u值
    ,并将其传递到下一个历元

    我想在该层的
    类中创建一个全局张量变量,并将其初始化为零,但我认为将前一个历元的值保留到第二个历元是没有帮助的

    你知道我该怎么做吗

    如果我的解释不清楚,请告诉我

    更新1:

    x_prev = zero
    mask = tf.greate(x, x_prev)   # x here related to sample 1
    x_modified = x[mask]
    x_prev = x_modified
    
    mask = tf.greater(x, x_prev)   # x here related to sample 2  and 
    x_prev is from previous sample
    x_modified = x[mask]
    x_prev = x_modified
    
    这是该层的实现:

    class KCompetitive(Layer):
        '''Applies K-Competitive layer.
        # Arguments
        '''
        def __init__(self, topk, ctype, **kwargs):
            self.topk = topk
            self.ctype = ctype
            self.uses_learning_phase = True
            self.supports_masking = True
            super(KCompetitive, self).__init__(**kwargs)
    
        def call(self, x):
            if self.ctype == 'ksparse':
                return K.in_train_phase(self.kSparse(x, self.topk), x)
            elif self.ctype == 'kcomp':
                return K.in_train_phase(self.k_comp_tanh(x, self.topk), x)
            else:
                warnings.warn("Unknown ctype, using no competition.")
                return x
    
        def get_config(self):
            config = {'topk': self.topk, 'ctype': self.ctype}
            base_config = super(KCompetitive, self).get_config()
            return dict(list(base_config.items()) + list(config.items()))
    
        def k_comp_tanh(self, x, topk, factor=6.26):
            ###Some modification on x so now the x becomes 
            x= x+1
            res = x
            return res
    
    更新2

    为了进一步澄清,我将补充以下内容:

    数据示例1:

    x_prev = zero
    mask = tf.greate(x, x_prev)   # x here related to sample 1
    x_modified = x[mask]
    x_prev = x_modified
    
    mask = tf.greater(x, x_prev)   # x here related to sample 2  and 
    x_prev is from previous sample
    x_modified = x[mask]
    x_prev = x_modified
    
    数据样本2:

    x_prev = zero
    mask = tf.greate(x, x_prev)   # x here related to sample 1
    x_modified = x[mask]
    x_prev = x_modified
    
    mask = tf.greater(x, x_prev)   # x here related to sample 2  and 
    x_prev is from previous sample
    x_modified = x[mask]
    x_prev = x_modified
    

    我不确定这是否是你的意思,但你可以在你的层中有一个变量,该变量在每个训练步骤上用另一个变量的先前值进行更新,大致如下:

    将tensorflow导入为tf
    MyLayer类(tf.keras.layers.Layer):
    定义初始值(自身,单位,**kwargs):
    超级(MyLayer,self)。\uuuuu初始化(**kwargs)
    self.units=单位
    def构建(自我,输入_形状):
    self.w=self.add_weight(shape=(输入_shape[-1],self.units),
    初始化器='random_normal',
    可培训=可自我培训,
    name='W')
    self.w\u prev=self.add\u权重(shape=self.w.shape,
    初始值设定项='零',
    可训练=错误,
    name='W_prev')
    def呼叫(自我、输入、培训=错误):
    #仅更新培训步骤上的w_prev值
    deps=[]
    如果培训:
    副附加(self.w_prev.assign(self.w))
    具有tf.控制依赖项(DEP):
    返回tf.matmul(输入,self.w)
    
    下面是一个使用示例:

    将tensorflow导入为tf
    将numpy作为np导入
    tf.random.set_种子(0)
    np.random.seed(0)
    #做一个随机线性问题
    x=np.rand.rand(50,3)
    y=x@np.random.rand(3,2)
    #制作模型
    model=tf.keras.Sequential()
    my_layer=MyLayer(2,输入_形状=(3,))
    model.add(我的图层)
    model.compile(优化器='SGD',loss='mse')
    #训练
    cbk=tf.keras.callbacks.LambdaCallback(
    在\u batch\u begin=lambda批上,日志:(tf.print('batch:',batch),
    tf.print('w_prev:',my_layer.w_prev,sep='\n'),
    tf.print('w:',my_layer.w,sep='\n'))
    model.fit(x,y,批处理大小=10,时代=1,详细=0,回调=[cbk])
    
    输出:

    批处理:0 w_prev: [[0 0] [0 0] [0 0]] w: [[0.0755531341 0.0211461019] [-0.0209847465 -0.0518018603] [-0.0618413948 0.0235136505]] 批次:1 w_prev: [[0.0755531341 0.0211461019] [-0.0209847465 -0.0518018603] [-0.0618413948 0.0235136505]] w: [[0.0770048052 0.0292659812] [-0.0199236758 -0.04635958] [-0.060054455 0.0332755931]] 批次:2 w_prev: [[0.0770048052 0.0292659812] [-0.0199236758 -0.04635958] [-0.060054455 0.0332755931]] w: [[0.0780589 0.0353098139] [-0.0189863108 -0.0414136574] [-0.0590113513 0.0387929156]] 批次:3 w_prev: [[0.0780589 0.0353098139] [-0.0189863108 -0.0414136574] [-0.0590113513 0.0387929156]] w: [[0.0793346688 0.042034667] [-0.0173048507 -0.0330933407] [-0.0573575757 0.0470812619]] 批次:4 w_prev: [[0.0793346688 0.042034667] [-0.0173048507 -0.0330933407] [-0.0573575757 0.0470812619]] w: [[0.0805450454 0.0485667922] [-0.0159637 -0.0261840075] [-0.0563304275 0.052557759]]

    编辑:我仍然不能100%确定你到底需要它如何工作,但这里有一些东西可能适合你:

    将tensorflow导入为tf
    KC类竞争性(层):
    ''应用K-竞争层。
    #论据
    '''
    定义初始化(self、topk、ctype、**kwargs):
    self.topk=topk
    self.ctype=ctype
    self.uses\u learning\u phase=真
    self.supports\u masking=True
    self.x_prev=无
    超级(KCompetitive,self)。\uuuu init\uuuuuuuu(**kwargs)
    def呼叫(自我,x):
    如果self.ctype==“ksparse”:
    返回K.in\u train\u阶段(self.kSparse(x,self.topk),x)
    elif self.ctype==“kcomp”:
    返回K.in_train_相位(self.K_comp_tanh(x,self.topk),x)
    其他:
    warnings.warn(“未知ctype,不使用竞争对手”)