2213470 2024-02-10 13:04 采纳率: 33.3%
浏览 6
已结题

Keras能train起来的模型,Pytorch训练一直出问题,很简单的模型

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%

  • 写回答

7条回答 默认 最新

  • 「已注销」 2024-02-10 13:18
    关注

    用BATCHNORM时,将其放在激活函数前

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 2月18日
  • 已采纳回答 2月10日
  • 修改了问题 2月10日
  • 创建了问题 2月10日