drug_random_mask = torch.rand_like(drug_graph_label)
时间: 2023-09-15 08:21:17 浏览: 84
这行代码创建了一个随机掩码张量drug_random_mask,其形状与drug_graph_label相同,即具有与drug_graph_label相同的行数和列数。该张量中的每个元素都是从0到1之间的均匀分布中随机采样得到的,表示是否将对应位置上的边作为掩码。
这种随机掩码的方法常用于数据集的划分、模型的训练中的样本抽取等场景中。通过随机掩码,可以随机选择一部分样本或特征进行计算或训练,从而加速模型的运行或减小训练时间。
相关问题
drug_graph_label = drug_graph.to_dense() drug_random_mask = torch.rand_like(drug_graph_label) train_mask = drug_random_mask < train_ratio valid_mask = (drug_random_mask < (train_ratio + valid_ratio)) * (drug_random_mask >= train_ratio) test_mask = drug_random_mask >= (train_ratio + valid_ratio)解释一下
这段代码是为了将药物分子图数据集划分为训练集、验证集和测试集,并且使用随机掩码来进行划分。
首先,将药物分子图数据集转换为稠密矩阵形式,即 `drug_graph.to_dense()`。
接下来,使用与 `drug_graph_label` 相同形状的随机张量 `drug_random_mask`,其中随机值在 0 到 1 之间。这个随机掩码将被用于划分数据集。
然后,使用 `train_ratio` 将 `drug_random_mask` 划分为训练集,即 `train_mask = drug_random_mask < train_ratio`,其中小于 `train_ratio` 的随机值将被视为训练集。这个值通常是一个介于 0 到 1 之间的小数,例如 0.8 表示将 80% 的数据用于训练。
接下来,使用 `valid_ratio` 将 `drug_random_mask` 划分为验证集,即 `valid_mask = (drug_random_mask < (train_ratio + valid_ratio)) * (drug_random_mask >= train_ratio)`,其中小于 `train_ratio + valid_ratio` 且大于等于 `train_ratio` 的随机值将被视为验证集。这个值通常也是一个介于 0 到 1 之间的小数,例如 0.1 表示将 10% 的数据用于验证。
最后,将剩余的数据作为测试集,即 `test_mask = drug_random_mask >= (train_ratio + valid_ratio)`。
这样就可以将药物分子图数据集划分为训练集、验证集和测试集了。
model = HetGraphSAGE(nfeat1=drug_feat_dim, nfeat2=protein_feat_dim, nhid=hidden_size, out_dim=drug_node, gamma=gamma) criterion = nn.MSELoss() # MSE损失函数 optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=0.0001) # 优化器 drug_graph = (torch.ones_like(drug_graph.to_dense())).to_sparse() data = (drug_feat.float(), protein_feat.float(), drug_graph.float(), drug_protein_graph.float()) for epoch in range(epochs): model.train() # 模型在train模式 optimizer.zero_grad() # zero_grad 清除上一次的一些梯度 output = model(data) # forward loss = criterion(output[train_mask].float(), drug_graph_label[train_mask].float()) # 只计算Train节点的损失 # 测试模型准确率 accuracy = (torch.abs(output[test_mask].float() - drug_graph_label[test_mask].float()) < eps).sum() / (drug_graph_label[test_mask].shape[0]) r2_score = stats.linregress(output[test_mask].tolist(), drug_graph_label[test_mask].tolist()).rvalue ** 2 print("Epoch [{}/{}], train loss: {:.4f}, test accuracy: {:.4f}, r2_score: {:.4f}".format(epoch + 1, epochs, loss.item(), accuracy,r2_score)) loss.backward() optimizer.step() # test阶段 model.eval() # 不进行梯度优化 output = model(data) 把它改成用optuna调参,在valid_mask上调参,在test_mask上检验结果
好的,你可以使用 Optuna 进行参数调优。具体来说,你可以将 train_mask 划分为 train_mask 和 valid_mask,然后在 valid_mask 上进行调参,最后使用 test_mask 进行结果的检验。
首先,你需要安装 optuna:
```
pip install optuna
```
接下来,你需要定义一个函数,该函数将会被 Optuna 优化器调用,该函数的输入为 Optuna 的 Trial 对象,输出为一个 float 类型的值,表示该模型的性能。
```python
import optuna
def objective(trial):
hidden_size = trial.suggest_int('hidden_size', 32, 128)
gamma = trial.suggest_float('gamma', 0.1, 1.0)
lr = trial.suggest_float('lr', 1e-5, 1e-3, log=True)
weight_decay = trial.suggest_float('weight_decay', 1e-6, 1e-3, log=True)
model = HetGraphSAGE(nfeat1=drug_feat_dim, nfeat2=protein_feat_dim, nhid=hidden_size, out_dim=drug_node, gamma=gamma)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=lr, weight_decay=weight_decay)
drug_graph = (torch.ones_like(drug_graph.to_dense())).to_sparse()
data = (drug_feat.float(), protein_feat.float(), drug_graph.float(), drug_protein_graph.float())
for epoch in range(epochs):
model.train()
optimizer.zero_grad()
output = model(data)
loss = criterion(output[train_mask].float(), drug_graph_label[train_mask].float())
# 只计算Train节点的损失
accuracy = (torch.abs(output[valid_mask].float() - drug_graph_label[valid_mask].float()) < eps).sum() / (drug_graph_label[valid_mask].shape[0])
loss.backward()
optimizer.step()
model.eval()
output = model(data)
# 在 test_mask 上计算 r2_score
r2_score = stats.linregress(output[test_mask].tolist(), drug_graph_label[test_mask].tolist()).rvalue ** 2
return r2_score
```
在定义好 objective 函数之后,你需要使用 Optuna 的 study 对象进行优化。这里我使用 TPE 算法进行优化。
```python
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
```
最后,你可以打印出最佳参数和对应的 r2_score。
```python
print('Best trial:')
trial = study.best_trial
print(' Value: {:.4f}'.format(trial.value))
print(' Params: ')
for key, value in trial.params.items():
print(' {}: {}'.format(key, value))
```
注意,由于你需要将 train_mask 划分为 train_mask 和 valid_mask,因此训练集的大小会相应减小。因此,你需要考虑增加 epochs 的数量来保证模型的性能。
阅读全文