Keras能train起来的模型,Pytorch训练一直出问题,数据是完全一致的。
pytorch多了一段数据的整合和dataloader,其它都一样!
from torch.utils.data import DataLoader
from torch.utils.data import TensorDataset
data_kos = TensorDataset(X_kos, y_kos)
dataloader=DataLoader(data_kos,batch_size=64)
Pytorch代码:
import torch
import torch.nn as nn
# 定义模型
model = nn.Sequential(
nn.Linear(30, 1000), # 输入维度为15,输出维度为1000
nn.ReLU(), # 使用 ReLU 激活函数
nn.Linear(1000, 100), # 输入维度为1000,输出维度为100
nn.ReLU(), # 使用 ReLU 激活函数
nn.Dropout(p=0.3), # 使用 Dropout
nn.BatchNorm1d(num_features=100), # 使用 BatchNormalization
nn.Linear(100, 1), # 输入维度为100,输出维度为1
nn.Sigmoid() # 使用 Sigmoid 激活函数
)
import torch.optim as optim
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
epoch = 300
lr = 0.001
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr)
#optimizer = optim.SGD(model.parameters(),lr=lr,momentum=0.9)
l = []
# 创建一个空列表来存储每个epoch的损失值
epoch_losses = []
#%%
# 训练模型
import time
start_time = time.time()
for epoch in range(epoch):
model.train()
batch_losses = [] # 用于存储当前epoch的每个batch的损失值
for x, y in dataloader:
x, y = x.to(device), y.to(device)
y=y.view(-1,1)
# print(y)
# break
optimizer.zero_grad()
ht = model(x)
loss = criterion(ht, y)
loss.backward()
optimizer.step()
batch_losses.append(loss.item()) # 记录当前batch的损失值
# 计算当前epoch的平均损失值
epoch_loss = sum(batch_losses) / len(batch_losses)
epoch_losses.append(epoch_loss) # 将当前epoch的损失值添加到列表中
# 输出当前epoch的损失值
print("Epoch: {}, Average Loss: {:.6f}".format(epoch, epoch_loss))
end_time = time.time()
duration = end_time - start_time
print("程序运行时间为:", duration, "秒")
keras代码
model1 = Sequential()
model1.add(Dense(1000, activation='relu'))
model1.add(Dense(100, activation='relu'))
model1.add(Dropout(0.3))
model1.add(keras.layers.BatchNormalization())
model1.add(Dense(1, activation='sigmoid'))
from keras.optimizers import Adam,SGD
from keras.callbacks import EarlyStopping
adam = Adam()
model1.compile(optimizer=adam, loss='binary_crossentropy')
import time
start_time = time.time()
history_kos = model.fit(X_kos, y_kos,
epochs=300,
batch_size=64,
shuffle=True,
verbose=1)
end_time = time.time()
duration = end_time - start_time
print("程序运行时间为:", duration, "秒")
完全同样的数据,为什么keras能够正常的训练,loss也可以正常降低,但是pytorch的loss无法降低,最后的预测准确率也只有5%