[英]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.