导入必要的库

import torch import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import roc_curve, auc

读入数据

data = pd.read_excel(r'C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx') x = data.iloc[:, 1:].values # 除第一列之外的所有列作为输入 y = data.iloc[:, 0].values # 第一列作为输出

数据预处理

x = (x - np.mean(x, axis=0)) / np.std(x, axis=0) # 数据标准化

将数据转换为tensor

x = torch.tensor(x, dtype=torch.float) y = torch.tensor(y, dtype=torch.float)

设置超参数

input_size = x.shape[1] hidden_size = [128, 64, 32] output_size = 1 dropout_rate = 0.5 lr = 0.01 epochs = 1000

定义模型

class DNN(torch.nn.Module): def init(self, input_size, hidden_size, output_size, dropout_rate): super(DNN, self).init() self.fc1 = torch.nn.Linear(input_size, hidden_size[0]) self.bn1 = torch.nn.BatchNorm1d(hidden_size[0]) self.fc2 = torch.nn.Linear(hidden_size[0], hidden_size[1]) self.bn2 = torch.nn.BatchNorm1d(hidden_size[1]) self.fc3 = torch.nn.Linear(hidden_size[1], hidden_size[2]) self.bn3 = torch.nn.BatchNorm1d(hidden_size[2]) self.fc4 = torch.nn.Linear(hidden_size[2], output_size) self.dropout = torch.nn.Dropout(dropout_rate) self.attention = torch.nn.MultiheadAttention(hidden_size[2], num_heads=1)

def forward(self, x):
    x = torch.relu(self.bn1(self.fc1(x)))
    x = self.dropout(x)
    x = torch.relu(self.bn2(self.fc2(x)))
    x = self.dropout(x)
    x = torch.relu(self.bn3(self.fc3(x)))
    x = self.dropout(x)
    x, _ = self.attention(x, x, x)
    x = torch.sigmoid(self.fc4(x))
    return x

定义模型、损失函数、优化器

model = DNN(input_size, hidden_size, output_size, dropout_rate) loss_fn = torch.nn.BCELoss() optimizer = torch.optim.Adam(model.parameters(), lr=lr)

训练模型

acc_list = [] loss_list = [] for epoch in range(epochs): # 向前传播 y_pred = model(x) loss = loss_fn(y_pred, y) # 计算准确率 y_pred_label = (y_pred >= 0.5).float() acc = torch.mean((y_pred_label == y).float()) # 向后传播 optimizer.zero_grad() loss.backward() optimizer.step() # 记录准确率和损失值 acc_list.append(acc.item()) loss_list.append(loss.item()) # 每隔10个epoch输出一次准确率和损失值 if (epoch + 1) % 10 == 0: print('Epoch [{}/{}], Loss: {:.4f}, Accuracy: {:.2f}%' .format(epoch + 1, epochs, loss.item(), acc.item() * 100))

输出最后一次训练得到每个样本的概率

y_pred_prob = model(x).detach().numpy().squeeze() print('The probability of each sample:', y_pred_prob)

绘制准确率变化的图

plt.plot(acc_list) plt.title('Accuracy') plt.xlabel('Epochs') plt.ylabel('Accuracy') plt.show()

绘制损失变化的图

plt.plot(loss_list) plt.title('Loss') plt.xlabel('Epochs') plt.ylabel('Loss') plt.show()

绘制模型的ROC图

fpr, tpr, thresholds = roc_curve(y, y_pred_prob) roc_auc = auc(fpr, tpr) plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = {:.2f})'.format(roc_auc)) plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver operating characteristic') plt.legend(loc="lower right") plt.show()

使用python编写DNN神经网络根据基因的表达量来预测患者是否患病并且满足以下要求:1读入Excel表格第一行为患者状态标志state1为患病0为正常和16个基因名称第0列为患者是否患病的真值其余列为基因的表达量2路径为CUserslenovoDesktopHIVDNN神经网络测试data1xlsx3模型为二分类模型即是否患病有三个隐藏层4加入dropout层5加入注意力机制6给出详细注释7数据

原文地址: http://www.cveoy.top/t/topic/bLEr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录