Reputation: 195
i build a classifying model about phishing site.
1. first, about my data
num_dataset: i have about 16000 dataset
num_feature: my dataset has 12 characterisitics.
label: if it's a phishing site, i set it's label -1. else 1
batch_size: set batch_size 128, for cnn model
kernel_size: 3
2. I try
from torch.utils.data import DataLoader, TensorDataset
train_dataset = TensorDataset(x_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
#-------------------------------------------------------#
class CNN(nn.Module):
def __init__(self, kernel_size):
super().__init__()
self.layer1 = nn.Sequential(
nn.Conv1d(12, 32, 3,
stride=1, padding=1)
...
def forward(self, x):
out = self.layer1(x)
...
#-------------------------------------------------------#
model = CNN()
for epoch in range(epochs):
avg_cost = 0
for x_train, y_train in train_loader:
Hypothesis = model(x_train)
x_train.shape
torch.Size([16072, 12])
y_train.shape
torch.Size([16072, 1])
3. Error
at Hypothesis = model(x_train)
RuntimeError: Expected 3-dimensional input for 3-dimensional weight [32, 12, 3], but got 2-dimensional input of size [128, 12] instead
4. Finnally
i think it's because I'm confused between conv1d and conv2d but i can't figure it out...
plz, i want to know the cause of this problem
Upvotes: 0
Views: 487
Reputation: 40778
You are using a nn.Conv1d
which should receive a 3-dimensional input shaped (batch_size, n_channels, sequence_length)
. This being said your input has n_channels=12
(since you've initialized your 1d conv with 12 input channels) and a sequence_length=1
. To match the requirements, you need to have an additional dimension on your input. Passing something like x_train.unsqueeze(-1)
to your network should work.
See the following example:
>>> x = torch.rand(100, 12, 1)
>>> L = nn.Conv1d(12, 32, 3, stride=1, padding=1)
>>> L(x).shape
torch.Size([100, 32, 1])
Upvotes: 1