我在Keras有一个自动编码器。我希望能够根据预先确定的“精度”向量对输入向量的特征进行加权。这个连续值向量的长度与输入相同,每个元素位于[0, 1]
范围内,对应于相应输入元素的置信度,其中1表示完全自信,0表示不可信。在
每个例子都有一个精确向量。在
我已经定义了一个考虑到这个精度向量的损失。在这里,低置信度特征的重建是向下加权的。在
def MAEpw_wrapper(y_prec):
def MAEpw(y_true, y_pred):
return K.mean(K.square(y_prec * (y_pred - y_true)))
return MAEpw
我的问题是精度张量y_prec
取决于批处理。我希望能够根据当前批处理更新y_prec
,以便每个精度向量都与其观察值正确关联。在
我已经完成了以下工作:
^{pr2}$这里P
是一个numpy数组,它包含所有精度向量以及与示例相对应的索引。我初始化y_prec
以使批量大小为32时具有正确的形状。然后我定义以下DataGenerator
:
class DataGenerator(Sequence):
def __init__(self, batch_size, y, shuffle=True):
self.batch_size = batch_size
self.y = y
self.shuffle = shuffle
self.on_epoch_end()
def on_epoch_end(self):
self.indexes = np.arange(len(self.y))
if self.shuffle == True:
np.random.shuffle(self.indexes)
def __len__(self):
return int(np.floor(len(self.y) / self.batch_size))
def __getitem__(self, index):
indexes = self.indexes[index * self.batch_size: (index+1) * self.batch_size]
# Set precision vector.
global y_prec
new_y_prec = K.variable(P[indexes])
y_prec = K.update(y_prec, new_y_prec)
# Get training examples.
y = self.y[indexes]
return y, y
这里我的目标是在生成批处理的同一个函数中更新y_prec
。这似乎正在按预期更新y_prec
。然后定义我的模型体系结构:
dims = [40, 20, 2]
model2 = Sequential()
model2.add(Dense(dims[0], input_dim=64, activation='relu'))
model2.add(Dense(dims[1], input_dim=dims[0], activation='relu'))
model2.add(Dense(dims[2], input_dim=dims[1], activation='relu', name='bottleneck'))
model2.add(Dense(dims[1], input_dim=dims[2], activation='relu'))
model2.add(Dense(dims[0], input_dim=dims[1], activation='relu'))
model2.add(Dense(64, input_dim=dims[0], activation='linear'))
最后,我编译并运行:
model2.compile(optimizer='adam', loss=MAEpw_wrapper(y_prec))
model2.fit_generator(DataGenerator(32, digits.data), epochs=100)
其中digits.data
是一个numpy数组。在
但是,这最终会定义单独的图形:
StopIteration: Tensor("Variable:0", shape=(32, 64), dtype=float32_ref) must be from the same graph as Tensor("Variable_4:0", shape=(32, 64), dtype=float32_ref).
我一直在寻找解决我问题的办法,但没有找到任何有效的办法。如有任何帮助,请妥善处理。在
在调用fit_generator时,尝试使用worker=0测试代码,如果它正常工作,那么线程就是问题所在。在
如果是线程导致的,请尝试以下方法:
使用Keras functional API可以很容易地实现这个自动编码器。这将允许有一个额外的输入占位符
y_prec_input
,它将与“precision”向量一起输入。完整的源代码可以找到here。在数据生成器
首先,让我们重新实现数据生成器,如下所示:
注意,我去掉了全局变量。现在,精度向量
P
作为输入参数(prec
)提供,生成器生成一个额外的输入,该输入将馈送给精度占位符y_prec_input
(请参见模型定义)。在型号
最后,您的模型可以定义和训练如下:
^{pr2}$其中
input_dim = digits.data.shape[1]
。请注意,我还将解码器的输出维度更改为input_dim
,因为它必须与输入维度匹配。在相关问题 更多 >
编程相关推荐