Возникли проблемы с написанием обучения l oop в pytorch - PullRequest
0 голосов
/ 01 февраля 2020

Я загружаю данные из CSV-файла 20 + 6 столбцов (элементы и метки). Я пытаюсь запустить свои данные через Convolutional Neural Network в 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()

Как мне написать Тренинг и Eval l oop? Все примеры, которые я вижу в inte rnet, используют изображения, а также DataLoader.

1 Ответ

1 голос
/ 03 февраля 2020

Conv1D принимает в качестве входных данных тензор с 3 измерениями (N, C, L), где N - размер пакета, C - количество каналов и L размер данных 1D. В вашем случае кажется, что один образец имеет 20 записей, и у вас есть один канал. У вас есть переменная batch_size, но она не используется в опубликованном коде.

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

Эта строка создает свертку, которая принимает вход с 20 каналами (у вас есть 1) и выводит 40 каналов. Таким образом, вы должны изменить 20 на 1, и вы можете изменить 40 на что-то меньшее. Поскольку свертки применяются ко всему входу (управляются шагами, паттингом и размером ядра), нет необходимости указывать размер выборки.

Также вы можете добавить некоторые логики c для создания мини-пакетов , Сейчас кажется, что вы просто хотите ввести каждый семпл отдельно. Возможно, прочитайте немного о классах наборов данных и загрузчиках данных в pytorch.

...