Hi, everyone I am trying to replace MLP with KAN in VIT for the MNIST images, but I am encountering this problem : 'TypeError: 'bool' object is not subscriptable' #274
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import time
from torch.utils.data import DataLoader, TensorDataset
from torchvision import datasets, transforms
from kan import KAN, KANLayer
Define the Patches class
class Patches(nn.Module):
def init(self, patch_size):
super(Patches, self).init()
self.patch_size = patch_size
import numpy as np import torch import torch.nn as nn import torch.optim as optim import time from torch.utils.data import DataLoader, TensorDataset from torchvision import datasets, transforms from kan import KAN, KANLayer
Define the Patches class
class Patches(nn.Module): def init(self, patch_size): super(Patches, self).init() self.patch_size = patch_size
Define the PatchEncoder class
class PatchEncoder(nn.Module): def init(self, num_patches, input_dim, output_dim): super(PatchEncoder, self).init() self.num_patches = num_patches self.projection = nn.Linear(input_dim, output_dim) self.position_embedding = nn.Parameter(torch.zeros(1, num_patches, output_dim))
Define the MultiHeadAttention class
class MultiHeadAttention(nn.Module): def init(self, dim, num_heads, dropout=0.1): super(MultiHeadAttention, self).init() self.num_heads = num_heads self.dim = dim self.head_dim = dim // num_heads self.scale = self.head_dim ** -0.5
class ViTWithKAN(nn.Module): def init(self, image_size=28, patch_size=14, num_classes=10, dim=96, depth=4, heads=4): super(ViTWithKAN, self).init() self.patch_size = patch_size self.num_patches = (image_size // patch_size) ** 2 self.dim = dim
def train(model, device, train_loader, optimizer, criterion, epoch): model.train() epoch_loss = 0 correct = 0 total = 0 start_time = time.time()
def validate(model, device, val_loader, criterion): model.eval() val_loss = 0 correct = 0 with torch.no_grad(): for data, target in val_loader: data, target = data.to(device), target.to(device) output = model(data) val_loss += criterion(output, target).item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() val_loss /= len(val_loader.dataset) accuracy = 100. * correct / len(val_loader.dataset) return val_loss, accuracy
def main(): device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = ViTWithKAN().to(device) optimizer = optim.Adam(model.parameters(), lr=learning_rate) criterion = nn.CrossEntropyLoss()
if name == "main":
Define transformations for MNIST data
this is my code