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,不使用竞争对手”)