简体   繁体   English

conv1d() 收到 arguments 的无效组合

[英]conv1d() received an invalid combination of arguments

I tried to repeat https://github.com/munhouiani/Deep-Packet and came across an error This program uses CNN to classify network traffic.我尝试重复https://github.com/munhouiani/Deep-Packet并遇到错误此程序使用 CNN 对网络流量进行分类。 I decided to rewrite the program as I could not run the original on my computer.我决定重写程序,因为我无法在我的计算机上运行原始程序。 I am new to neural networks, so I cannot give a detailed description of the problem我是神经网络的新手,所以我无法详细描述问题

TypeError: conv1d() received an invalid combination of arguments - got (list, Parameter, Parameter, tuple, tuple, tuple, int), but expected one of:
 * (Tensor input, Tensor weight, Tensor bias, tuple of ints stride, tuple of ints padding, tuple of ints dilation, int groups)
      didn't match because some of the arguments have invalid types: (!list!, !Parameter!, !Parameter!, !tuple!, !tuple!, !tuple!, int)
 * (Tensor input, Tensor weight, Tensor bias, tuple of ints stride, str padding, tuple of ints dilation, int groups)
      didn't match because some of the arguments have invalid types: (!list!, !Parameter!, !Parameter!, !tuple!, !tuple!, !tuple!, int)

code:代码:

import torch
from pathlib import Path
from torch import nn as nn
from torch.nn import functional as F
from torch.utils.data import DataLoader
from argparse import Namespace
from pytorch_lightning import Trainer
import pytorch_lightning as pl
import numpy as np
class CNN(pl.LightningModule):
    def __init__(self, hparams):
        super().__init__()
        # config
        self.save_hyperparameters(hparams)
        self.data_path = self.hparams.data_path

        # two convolution, then one max pool
        self.conv1 = nn.Sequential(
            nn.Conv1d(
                in_channels=1,
                out_channels=self.hparams.c1_output_dim,
                kernel_size=self.hparams.c1_kernel_size,
                stride=self.hparams.c1_stride
            ),
            nn.ReLU()
        )
        self.conv2 = nn.Sequential(
            nn.Conv1d(
                in_channels=self.hparams.c1_output_dim,
                out_channels=self.hparams.c2_output_dim,
                kernel_size=self.hparams.c2_kernel_size,
                stride=self.hparams.c2_stride
            ),
            nn.ReLU()
        )

        self.max_pool = nn.MaxPool1d(
            kernel_size=2
        )

        # flatten, calculate the output size of max pool
        # use a dummy input to calculate
        dummy_x = torch.rand(1, 1, self.hparams.signal_length, requires_grad=False)
        dummy_x = self.conv1(dummy_x)
        dummy_x = self.conv2(dummy_x)
        dummy_x = self.max_pool(dummy_x)
        max_pool_out = dummy_x.view(1, -1).shape[1]

        # followed by 5 dense layers
        self.fc1 = nn.Sequential(
            nn.Linear(
                in_features=max_pool_out,
                out_features=200
            ),
            nn.Dropout(p=0.05),
            nn.ReLU()
        )
        self.fc2 = nn.Sequential(
            nn.Linear(
                in_features=200,
                out_features=100
            ),
            nn.Dropout(p=0.05),
            nn.ReLU()
        )
        self.fc3 = nn.Sequential(
            nn.Linear(
                in_features=100,
                out_features=50
            ),
            nn.Dropout(p=0.05),
            nn.ReLU()
        )

        # finally, output layer
        self.out = nn.Linear(
            in_features=50,
            out_features=self.hparams.output_dim
        )

    def forward(self, x):
        # make sure the input is in [batch_size, channel, signal_length]
        # where channel is 1
        # signal_length is 1500 by default
        #batch_size = x.shape[0]
        batch_size = 16

        # 2 conv 1 max
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.max_pool(x)

        x = x.reshape(batch_size, -1)

        # 3 fc
        x = self.fc1(x)
        x = self.fc2(x)
        x = self.fc3(x)

        # output
        x = self.out(x)

        return x
    def train_dataloader(self):
        reader = self.data_path
        dataloader = DataLoader(reader, batch_size=16)

        return dataloader
    def configure_optimizers(self):
        return torch.optim.Adam(self.parameters())

    def training_step(self, batch, batch_idx):
        x = batch
        y = batch
        y_hat = self(x)
        loss = F.cross_entropy(y_hat, y)

        if (batch_idx % 50) == 0:
            self.logger.log_metrics(loss, step=batch_idx)
        return loss
num_epochs = 6
num_classes = 10
batch_size = 100
learning_rate = 0.001
train_dataset = "D:\Deep-Packet-master\Deep-Packet-master\processed_data"
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
hparams = Namespace(**{
    'c1_kernel_size': 4,
    'c1_output_dim': 200,
    'c1_stride': 3,
    'c2_kernel_size': 5,
    'c2_output_dim': 200,
    'c2_stride': 1,
    'output_dim': 17,
    'data_path': train_dataset,
    'signal_length': 1500,
    'epoch': 6
})
model = CNN(hparams).float()
gpus = None
trainer = Trainer(val_check_interval=4, max_epochs=1)
trainer.fit(model)
trainer.save_checkpoint(str(train_dataset.absolute()))

Please, help请帮忙

I'm going to guess that your training_step is incorrect:我猜你的training_step不正确:

def training_step(self, batch, batch_idx):
    x = batch[0]
    y = batch[1]
    y_hat = self(x)
    loss = F.cross_entropy(y_hat, y)

    if (batch_idx % 50) == 0:
        self.logger.log_metrics(loss, step=batch_idx)
    return loss

In your code, you set both x and y to batch which should be a tuple or a list, which conv1d 's forward cannot interpret.在您的代码中,您将 x 和 y 都设置为batch ,它应该是一个元组或一个列表, conv1dforward无法解释。

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

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