繁体   English   中英

在 pytorch 中编写训练循环时遇到问题

[英]Having trouble writing training loop in pytorch

我从 20+6 列(特征和标签)的 CSV 文件中加载数据。 我试图通过 pytorch 中的卷积神经网络运行我的数据。 我收到错误消息,说它需要 3D 输入,而我给它的是 1D 输入。 我正在使用 Conv1d 。

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import pandas as pd
from torch.utils.data import Dataset,DataLoader
from sklearn.model_selection import train_test_split

#Read Data
data=pd.read_csv('Data.csv')
Features=data[data.columns[0:20]]
Labels=data[data.columns[20:]]
#Split Data
X_train, X_test, y_train, y_test = train_test_split( Features, Labels, test_size=0.33, shuffle=True)
#Create Tensors
train_in=torch.tensor(X_train.values)
train_out=torch.tensor(y_train.values)
test_in=torch.tensor(X_test.values)
test_out=torch.tensor(y_test.values)
#Model CNN
class CNN(nn.Module):
        def __init__(self):
                super(CNN,self).__init__()
                self.layer1 = nn.Sequential(
                                nn.Conv1d(20,40,kernel_size=5,stride=1,padding=2),
                                nn.ReLU(),
                                nn.MaxPool1d(kernel_size=2,stride=2)
                                )
                self.layer2 = nn.Sequential(
                                nn.Conv1d(40,60,kernel_size=5,stride=1,padding=2),
                                nn.ReLU(),
                                nn.MaxPool1d(kernel_size=2,stride=2)
                                )
                self.drop_out = nn.Dropout()
                self.fc1 = nn.Linear(60,30)
                self.fc2 = nn.Linear(30,15)
                self.fc3 = nn.Linear(15,6)

        def forward(self,x):
                out=self.layer1(x)
                out=self.layer2(out)
                out=self.drop_out(out)
                out=self.fc1(out)
                out=self.fc2(out)
                out=self.fc3(out)
                return out


Epochs=10
N_labels=len(Labels.columns)
N_features=len(Features.columns)
batch_size=100
learning_rate=0.001
#TRAIN MODEL        
model = CNN()
#LOSS AND OPTIMIZER
criterion = torch.nn.SmoothL1Loss()
optimizer = torch.optim.Adam(model.parameters(),lr=learning_rate)
#TRAIN MODEL
model.train()
idx=0
for i in train_in:
        y=model(i)
        loss=criterion(y,train_out[idx])
        idx+=1
        loss.backward()
        optimizer.step()

如何编写训练和评估循环? 我在互联网上看到的所有示例都使用图像,它们也使用 DataLoader。

Conv1D将具有 3 个维度(N, C, L)的张量作为输入(N, C, L)其中N是批量大小, C是通道数和一维数据的L大小。 在您的情况下,似乎一个样本有 20 个条目,而您有一个频道。 您有一个batch_size变量,但未在发布的代码中使用。

 nn.Conv1d(20,40,kernel_size=5,stride=1,padding=2)

这条线创建了一个卷积,它接受 20 个通道的输入(你有 1 个)并输出 40 个通道。 因此,您必须将 20 更改为 1,并且您可能希望将 40 更改为更小的值。 由于卷积应用于整个输入(由 stride、patting 和 kernel size 控制),因此无需指定样本的大小。

此外,您可能想添加一些逻辑来构建小批量。 现在似乎您只想自己输入每个样本。 也许阅读一些关于 pytorch 中的数据集类和数据加载器的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM