def inputVar(l, voc): indexes_batch = [indexesFromSentence(voc, sentence) for sentence in l] lengths = torch.tensor([len(indexes) for indexes in indexes_batch]) padList = zeroPadding(indexes_batch) padVar = torch.LongTensor(padList) return padVar, lengths
时间: 2024-04-15 13:25:40 浏览: 24
这个函数的作用是将输入的句子列表转换成模型所需的张量格式,并返回填充后的句子张量和每个句子的长度。其中,`l` 是句子列表,`voc` 是词汇表。
函数首先通过 `indexesFromSentence(voc, sentence)` 将每个句子转换成对应的索引序列列表,并将所有句子的索引序列列表组成一个列表 `indexes_batch`。
接下来,通过 `torch.tensor([len(indexes) for indexes in indexes_batch])` 获取每个句子索引序列的长度,并将其存储在长度张量 `lengths` 中。
然后,通过调用 `zeroPadding(indexes_batch)` 进行填充操作,将所有句子的索引序列填充到相同长度,并将填充后的结果存储在列表 `padList` 中。
最后,将 `padList` 转换成张量 `padVar`(LongTensor 类型),并返回 `padVar` 和 `lengths`。
相关问题
def evaluate(encoder, decoder, voc, sentence, beam_size, max_length=MAX_LENGTH): indexes_batch = [indexesFromSentence(voc, sentence)] # [1, seq_len] lengths = [len(indexes) for indexes in indexes_batch] input_batch = torch.LongTensor(indexes_batch).transpose(0, 1) input_batch = input_batch.to(device) encoder_outputs, encoder_hidden = encoder(input_batch, lengths, None) # decoder_hidden = encoder_hidden[:decoder.n_layers] decoder_hidden = encoder_hidden[:decoder.n_layers] + encoder_hidden[decoder.n_layers:] if beam_size == 1: return decode(decoder, decoder_hidden, encoder_outputs, voc) else: return beam_decode(decoder, decoder_hidden, encoder_outputs, voc, beam_size)
这段代码实现了一个评估函数 `evaluate`,用于对给定句子进行模型的推理。下面是对该函数的解释:
- `evaluate` 函数接受以下参数:
- `encoder`:编码器模型
- `decoder`:解码器模型
- `voc`:词汇表对象,用于将索引转换为单词
- `sentence`:要进行推理的输入句子
- `beam_size`:束搜索的大小,即每个时间步保留的候选序列数
- `max_length`:生成序列的最大长度,默认为预定义的最大长度 `MAX_LENGTH`
- 首先,将输入句子转换为索引序列,并计算每个索引序列的长度。
- 创建一个输入批次张量 `input_batch`,将索引序列转置后转换为张量。
- 将 `input_batch` 移动到适当的设备上。
- 使用编码器模型和输入序列长度计算编码器的输出和隐藏状态。
- 获取编码器最后一层隐藏状态作为解码器的初始隐藏状态。
- 如果 `beam_size` 等于 1,表示不使用束搜索,调用 `decode` 函数进行解码并返回解码结果。
- 否则,调用 `beam_decode` 函数进行束搜索解码,并返回束搜索的结果。
希望以上解释对您有帮助!如果您还有其他问题,请随时提问。
class AbstractGreedyAndPrune(): def __init__(self, aoi: AoI, uavs_tours: dict, max_rounds: int, debug: bool = True): self.aoi = aoi self.max_rounds = max_rounds self.debug = debug self.graph = aoi.graph self.nnodes = self.aoi.n_targets self.uavs = list(uavs_tours.keys()) self.nuavs = len(self.uavs) self.uavs_tours = {i: uavs_tours[self.uavs[i]] for i in range(self.nuavs)} self.__check_depots() self.reachable_points = self.__reachable_points() def __pruning(self, mr_solution: MultiRoundSolution) -> MultiRoundSolution: return utility.pruning_multiroundsolution(mr_solution) def solution(self) -> MultiRoundSolution: mrs_builder = MultiRoundSolutionBuilder(self.aoi) for uav in self.uavs: mrs_builder.add_drone(uav) residual_ntours_to_assign = {i : self.max_rounds for i in range(self.nuavs)} tour_to_assign = self.max_rounds * self.nuavs visited_points = set() while not self.greedy_stop_condition(visited_points, tour_to_assign): itd_uav, ind_tour = self.local_optimal_choice(visited_points, residual_ntours_to_assign) residual_ntours_to_assign[itd_uav] -= 1 tour_to_assign -= 1 opt_tour = self.uavs_tours[itd_uav][ind_tour] visited_points |= set(opt_tour.targets_indexes) # update visited points mrs_builder.append_tour(self.uavs[itd_uav], opt_tour) return self.__pruning(mrs_builder.build()) class CumulativeGreedyCoverage(AbstractGreedyAndPrune): choice_dict = {} for ind_uav in range(self.nuavs): uav_residual_rounds = residual_ntours_to_assign[ind_uav] if uav_residual_rounds > 0: uav_tours = self.uavs_tours[ind_uav] for ind_tour in range(len(uav_tours)): tour = uav_tours[ind_tour] quality_tour = self.evaluate_tour(tour, uav_residual_rounds, visited_points) choice_dict[quality_tour] = (ind_uav, ind_tour) best_value = max(choice_dict, key=int) return choice_dict[best_value] def evaluate_tour(self, tour : Tour, round_count : int, visited_points : set): new_points = (set(tour.targets_indexes) - visited_points) return round_count * len(new_points) 如何改写上述程序,使其能返回所有已经探索过的目标点visited_points的数量,请用代码表示
可以在 `solution()` 方法中添加一个变量来记录已经探索过的目标点数量,然后在每次更新 `visited_points` 后更新这个变量。下面是修改后的代码:
```
class AbstractGreedyAndPrune():
def __init__(self, aoi: AoI, uavs_tours: dict, max_rounds: int, debug: bool = True):
self.aoi = aoi
self.max_rounds = max_rounds
self.debug = debug
self.graph = aoi.graph
self.nnodes = self.aoi.n_targets
self.uavs = list(uavs_tours.keys())
self.nuavs = len(self.uavs)
self.uavs_tours = {i: uavs_tours[self.uavs[i]] for i in range(self.nuavs)}
self.__check_depots()
self.reachable_points = self.__reachable_points()
def __pruning(self, mr_solution: MultiRoundSolution) -> MultiRoundSolution:
return utility.pruning_multiroundsolution(mr_solution)
def solution(self) -> Tuple[MultiRoundSolution, int]:
mrs_builder = MultiRoundSolutionBuilder(self.aoi)
for uav in self.uavs:
mrs_builder.add_drone(uav)
residual_ntours_to_assign = {i : self.max_rounds for i in range(self.nuavs)}
tour_to_assign = self.max_rounds * self.nuavs
visited_points = set()
explored_points = 0
while not self.greedy_stop_condition(visited_points, tour_to_assign):
itd_uav, ind_tour = self.local_optimal_choice(visited_points, residual_ntours_to_assign)
residual_ntours_to_assign[itd_uav] -= 1
tour_to_assign -= 1
opt_tour = self.uavs_tours[itd_uav][ind_tour]
new_points = set(opt_tour.targets_indexes) - visited_points
explored_points += len(new_points)
visited_points |= new_points # update visited points
mrs_builder.append_tour(self.uavs[itd_uav], opt_tour)
return self.__pruning(mrs_builder.build()), explored_points
class CumulativeGreedyCoverage(AbstractGreedyAndPrune):
def evaluate_tour(self, tour : Tour, round_count : int, visited_points : set):
new_points = set(tour.targets_indexes) - visited_points
return round_count * len(new_points)
def local_optimal_choice(self, visited_points, residual_ntours_to_assign):
choice_dict = {}
for ind_uav in range(self.nuavs):
uav_residual_rounds = residual_ntours_to_assign[ind_uav]
if uav_residual_rounds > 0:
uav_tours = self.uavs_tours[ind_uav]
for ind_tour in range(len(uav_tours)):
tour = uav_tours[ind_tour]
quality_tour = self.evaluate_tour(tour, uav_residual_rounds, visited_points)
choice_dict[quality_tour] = (ind_uav, ind_tour)
best_value = max(choice_dict, key=int)
return choice_dict[best_value]