gpt4 book ai didi

python - 在 Keras 中实现批量相关损失

转载 作者:太空狗 更新时间:2023-10-30 00:15:49 26 4
gpt4 key购买 nike

我在 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,以便每个精度向量与其观察值正确关联。

我已经完成了以下操作:

global y_prec
y_prec = K.variable(P[:32])

此处 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).

我已经搜索过 SO 来解决我的问题,但我发现没有任何效果。感谢任何有关如何正确执行此操作的帮助。

最佳答案

可以使用 Keras functional API 轻松实现此自动编码器.这将允许有一个额外的输入占位符 y_prec_input,它将使用“精度”向量提供。可以找到完整的源代码 here .


数据生成器

首先,让我们按如下方式重新实现您的数据生成器:

class DataGenerator(Sequence):
def __init__(self, batch_size, y, prec, shuffle=True):
self.batch_size = batch_size
self.y = y
self.shuffle = shuffle
self.prec = prec
self.on_epoch_end()

def on_epoch_end(self):
self.indexes = np.arange(len(self.y))
if self.shuffle:
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]
y = self.y[indexes]
y_prec = self.prec[indexes]
return [y, y_prec], y

请注意,我去掉了全局变量。现在,精度向量 P 作为输入参数 (prec) 提供,并且生成器会产生一个额外的输入,该输入将被馈送到精度占位符 y_prec_input (见模型定义)。


型号

最后,您的模型可以按如下方式定义和训练:

y_input = Input(shape=(input_dim,))
y_prec_input = Input(shape=(1,))
h_enc = Dense(dims[0], activation='relu')(y_input)
h_enc = Dense(dims[1], activation='relu')(h_enc)
h_enc = Dense(dims[2], activation='relu', name='bottleneck')(h_enc)
h_dec = Dense(dims[1], activation='relu')(h_enc)
h_dec = Dense(input_dim, activation='relu')(h_dec)
model2 = Model(inputs=[y_input, y_prec_input], outputs=h_dec)
model2.compile(optimizer='adam', loss=MAEpw_wrapper(y_prec_input))

# Train model
model2.fit_generator(DataGenerator(32, digits.data, P), epochs=100)

其中 input_dim = digits.data.shape[1]。请注意,我还将解码器的输出维度更改为 input_dim,因为它必须与输入维度匹配。

关于python - 在 Keras 中实现批量相关损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53105294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com