{
  "id": 403078,
  "title": "too many dimensions 'str'",
  "url": "/competitions/birdclef-2023/discussion/403078",
  "author_name": "AugustinRenard",
  "post_date": "2023-04-21T03:56:15.380000",
  "votes": 0,
  "comment_count": 0,
  "views": 0,
  "content": "<p>Hi everyone, I'm currently trying my best to develop a CNN to classify the  birds sound as a beginner data scientist, but I run into an issue while trying to train my model, here is the entire traceback:<br>\n`---------------------------------------------------------------------------<br>\nValueError                                Traceback (most recent call last)<br>\n/tmp/ipykernel_27/2595944468.py in <br>\n     48 <br>\n     49 # train model<br>\n---&gt; 50 train(cnn, train_dataloader, loss_fn, optimiser, device, EPOCHS)<br>\n     51 <br>\n     52 # save model</p>\n<p>/tmp/ipykernel_27/2595944468.py in train(model, data_loader, loss_fn, optimiser, device, epochs)<br>\n     30     for i in range(epochs):<br>\n     31         print(f\"Epoch {i+1}\")<br>\n---&gt; 32         train_single_epoch(model, data_loader, loss_fn, optimiser, device)<br>\n     33         print(\"---------------------------\")<br>\n     34     print(\"Finished training\")</p>\n<p>/tmp/ipykernel_27/2595944468.py in train_single_epoch(model, data_loader, loss_fn, optimiser, device)<br>\n     14 def train_single_epoch(model, data_loader, loss_fn, optimiser, device):<br>\n     15     for input, target in data_loader:<br>\n---&gt; 16         input, target = torch.tensor(input).to(device), torch.tensor(target).to(device)<br>\n     17         # calculate loss<br>\n     18         prediction = model(input)</p>\n<p>ValueError: too many dimensions 'str'`</p>\n<p>and here is my code: <br>\n`annotations = pd.read_csv('/kaggle/input/birdclef-2023/train_metadata.csv')<br>\nannotations.head()</p>\n<p>class_names = sorted(os.listdir('/kaggle/input/birdclef-2023/train_audio/'))<br>\nnum_classes = len(class_names)<br>\nprint(num_classes)`</p>\n<p>`class BirdDataset(Dataset):<br>\n    def <strong>init</strong>(self, annotations_file, audio_dir, transformation, target_sample_rate, num_samples, device):<br>\n        self.annotations = pd.read_csv(annotations_file)<br>\n        self.audio_dir = audio_dir<br>\n        self.device = device<br>\n        self.transformation = transformation.to(self.device)<br>\n        self.target_sample_rate = target_sample_rate<br>\n        self.num_samples = num_samples</p>\n<pre><code>def __len__(self):\n    return len(self.annotations)\n\ndef __getitem__(self, index):\n    audio_sample_path = self._get_audio_sample_path(index)\n    label = self._get_audio_sample_label(index)\n    signal, sr = torchaudio.load(audio_sample_path)\n    signal = signal.to(self.device)\n    signal = self._resample_if_necessary(signal, sr)\n    signal = self._mix_down_if_necessary(signal)\n    signal = self._right_pad_if_necessary(signal)\n    signal = self._cut_if_necessary(signal)\n    signal = self.transformation(signal)\n    return signal, label\n\ndef _get_audio_sample_path(self, index):\n    file_name = self.annotations.iloc[index, 11]\n    path = os.path.join(self.audio_dir, file_name)\n    return path\n\ndef _get_audio_sample_label(self, index):\n    return self.annotations.iloc[index, 0]\n\ndef _resample_if_necessary(self, signal, sr):\n    if sr != self.target_sample_rate:\n        resampler = torchaudio.transforms.Resample(sr, self.target_sample_rate)\n        signal  = resample(signal)\n    return signal\n\ndef _mix_down_if_necessary(self, signal):\n    if signal.shape[0] &gt; 1:\n        signal = torch.mean(signal, dim=0, keepdim=True)\n    return signal\n\ndef _cut_if_necessary(self, signal):\n    if signal.shape[1] &gt; self.num_samples:\n        signal = signal[:, :self.num_samples]\n    return signal\n\ndef _right_pad_if_necessary(self, signal):\n    length_signal = signal.shape[1]\n    if length_signal &lt; self.num_samples:\n        num_missing_samples = self.num_samples - length_signal\n        last_dim_padding = (0, num_missing_sampels)\n        signal = torch.nn.functional.pad(signal, last_dim_padding)\n    return signal`\n</code></pre>\n<p>`class CNNNetwork(nn.Module):<br>\n    def <strong>init</strong>(self):<br>\n        super().<strong>init</strong>()</p>\n<pre><code>    self.conv1 = nn.Sequential(\n        nn.Conv2d(\n            in_channels=1,\n            out_channels=16,\n            kernel_size=3,\n            stride=1,\n            padding=2\n            ),\n        nn.ReLU(),\n        nn.MaxPool2d(kernel_size=2)\n    )\n\n    self.conv2 = nn.Sequential(\n        nn.Conv2d(\n            in_channels=16,\n            out_channels=32,\n            kernel_size=3,\n            stride=1,\n            padding=2\n            ),\n        nn.ReLU(),\n        nn.MaxPool2d(kernel_size=2)\n    )\n    self.conv3 = nn.Sequential(\n        nn.Conv2d(\n            in_channels=32,\n            out_channels=64,\n            kernel_size=3,\n            stride=1,\n            padding=2\n            ),\n        nn.ReLU(),\n        nn.MaxPool2d(kernel_size=2)\n    )\n    self.conv4 = nn.Sequential(\n        nn.Conv2d(\n            in_channels=64,\n            out_channels=128,\n            kernel_size=3,\n            stride=1,\n            padding=2\n            ),\n        nn.ReLU(),\n        nn.MaxPool2d(kernel_size=2)\n    )\n    self.flatten = nn.Flatten()\n    self.linear = nn.Linear(in_features= 128 * 5 * 3 ,  out_features=num_classes)\n    self.softmax = nn.Softmax(dim=1)\n\ndef forward(self, input_data):\n    x = self.conv1(input_data)\n    x = self.conv2(x)\n    x = self.conv3(x)\n    x = self.conv4(x)\n    x = self.flatten(x)\n    logits = self.linear(x)\n    predictions = self.softmax(logits)\n    return predictions`\n</code></pre>\n<p>`ANNOTATIONS_FILE = '../input/birdclef-2023/train_metadata.csv'<br>\nAUDIO_DIR = \"../input/birdclef-2023/train_audio/\"<br>\nSAMPLE_RATE = 32000<br>\nNUM_SAMPLES = 32000</p>\n<p>device = \"cuda\" if torch.cuda.is_available() else \"cpu\"<br>\nprint(\"Running on\", device)</p>\n<p>mel_spectogram = torchaudio.transforms.MelSpectrogram(sample_rate = SAMPLE_RATE, n_fft=2028, hop_length=1024, n_mels=64)<br>\nbird_ds = BirdDataset(ANNOTATIONS_FILE, AUDIO_DIR, mel_spectogram, SAMPLE_RATE, NUM_SAMPLES, device)`</p>\n<p>`from torch.utils.data import DataLoader</p>\n<p>BATCH_SIZE = 128<br>\nEPOCHS = 10<br>\nLEARNING_RATE = 0.001</p>\n<p>device = \"cuda\" if torch.cuda.is_available() else \"cpu\"</p>\n<p>def create_data_loader(train_data, batch_size):<br>\n    train_dataloader = DataLoader(train_data, batch_size=batch_size)<br>\n    return train_dataloader</p>\n<p>def train_single_epoch(model, data_loader, loss_fn, optimiser, device):<br>\n    for input, target in data_loader:<br>\n        input, target = torch.tensor(input).to(device), torch.tensor(target).to(device)<br>\n        # calculate loss<br>\n        prediction = model(input)<br>\n        loss = loss_fn(prediction, target)</p>\n<pre><code>    # backpropagate error and update weights\n    optimiser.zero_grad()\n    loss.backward()\n    optimiser.step()\n\nprint(f\"loss: {loss.item()}\")\n</code></pre>\n<p>def train(model, data_loader, loss_fn, optimiser, device, epochs):<br>\n    for i in range(epochs):<br>\n        print(f\"Epoch {i+1}\")<br>\n        train_single_epoch(model, data_loader, loss_fn, optimiser, device)<br>\n        print(\"---------------------------\")<br>\n    print(\"Finished training\")</p>\n<p>train_dataloader = create_data_loader(bird_ds, BATCH_SIZE)</p>\n<p>cnn = CNNNetwork().to(device)<br>\nprint(cnn)</p>\n<p>loss_fn = nn.CrossEntropyLoss()<br>\noptimiser = torch.optim.Adam(cnn.parameters(),<br>\n                             lr=LEARNING_RATE)<br>\ntrain(cnn, train_dataloader, loss_fn, optimiser, device, EPOCHS)<br>\ntorch.save(cnn.state_dict(), \"feedforwardnet.pth\")<br>\nprint(\"Trained feed forward net saved at feedforwardnet.pth\")`</p>\n<p>At first I thought it was extra labels but apparently it's not. I know my code is not optimized at all and the model might create nightmares for advanced people but I'm just trying to learn and get a first prediction to be able to tweak the model after :) </p>\n<p>I would really appreciate a little boost/help here to what I'm doing wrong :( </p>\n<p>Thank you very much</p>",
  "messages": [
    {
      "id": 2229056,
      "postDate": "2023-04-21T03:56:15.380Z",
      "content": "<p>Hi everyone, I'm currently trying my best to develop a CNN to classify the  birds sound as a beginner data scientist, but I run into an issue while trying to train my model, here is the entire traceback:<br>\n`---------------------------------------------------------------------------<br>\nValueError                                Traceback (most recent call last)<br>\n/tmp/ipykernel_27/2595944468.py in <br>\n     48 <br>\n     49 # train model<br>\n---&gt; 50 train(cnn, train_dataloader, loss_fn, optimiser, device, EPOCHS)<br>\n     51 <br>\n     52 # save model</p>\n<p>/tmp/ipykernel_27/2595944468.py in train(model, data_loader, loss_fn, optimiser, device, epochs)<br>\n     30     for i in range(epochs):<br>\n     31         print(f\"Epoch {i+1}\")<br>\n---&gt; 32         train_single_epoch(model, data_loader, loss_fn, optimiser, device)<br>\n     33         print(\"---------------------------\")<br>\n     34     print(\"Finished training\")</p>\n<p>/tmp/ipykernel_27/2595944468.py in train_single_epoch(model, data_loader, loss_fn, optimiser, device)<br>\n     14 def train_single_epoch(model, data_loader, loss_fn, optimiser, device):<br>\n     15     for input, target in data_loader:<br>\n---&gt; 16         input, target = torch.tensor(input).to(device), torch.tensor(target).to(device)<br>\n     17         # calculate loss<br>\n     18         prediction = model(input)</p>\n<p>ValueError: too many dimensions 'str'`</p>\n<p>and here is my code: <br>\n`annotations = pd.read_csv('/kaggle/input/birdclef-2023/train_metadata.csv')<br>\nannotations.head()</p>\n<p>class_names = sorted(os.listdir('/kaggle/input/birdclef-2023/train_audio/'))<br>\nnum_classes = len(class_names)<br>\nprint(num_classes)`</p>\n<p>`class BirdDataset(Dataset):<br>\n    def <strong>init</strong>(self, annotations_file, audio_dir, transformation, target_sample_rate, num_samples, device):<br>\n        self.annotations = pd.read_csv(annotations_file)<br>\n        self.audio_dir = audio_dir<br>\n        self.device = device<br>\n        self.transformation = transformation.to(self.device)<br>\n        self.target_sample_rate = target_sample_rate<br>\n        self.num_samples = num_samples</p>\n<pre><code>def __len__(self):\n    return len(self.annotations)\n\ndef __getitem__(self, index):\n    audio_sample_path = self._get_audio_sample_path(index)\n    label = self._get_audio_sample_label(index)\n    signal, sr = torchaudio.load(audio_sample_path)\n    signal = signal.to(self.device)\n    signal = self._resample_if_necessary(signal, sr)\n    signal = self._mix_down_if_necessary(signal)\n    signal = self._right_pad_if_necessary(signal)\n    signal = self._cut_if_necessary(signal)\n    signal = self.transformation(signal)\n    return signal, label\n\ndef _get_audio_sample_path(self, index):\n    file_name = self.annotations.iloc[index, 11]\n    path = os.path.join(self.audio_dir, file_name)\n    return path\n\ndef _get_audio_sample_label(self, index):\n    return self.annotations.iloc[index, 0]\n\ndef _resample_if_necessary(self, signal, sr):\n    if sr != self.target_sample_rate:\n        resampler = torchaudio.transforms.Resample(sr, self.target_sample_rate)\n        signal  = resample(signal)\n    return signal\n\ndef _mix_down_if_necessary(self, signal):\n    if signal.shape[0] &gt; 1:\n        signal = torch.mean(signal, dim=0, keepdim=True)\n    return signal\n\ndef _cut_if_necessary(self, signal):\n    if signal.shape[1] &gt; self.num_samples:\n        signal = signal[:, :self.num_samples]\n    return signal\n\ndef _right_pad_if_necessary(self, signal):\n    length_signal = signal.shape[1]\n    if length_signal &lt; self.num_samples:\n        num_missing_samples = self.num_samples - length_signal\n        last_dim_padding = (0, num_missing_sampels)\n        signal = torch.nn.functional.pad(signal, last_dim_padding)\n    return signal`\n</code></pre>\n<p>`class CNNNetwork(nn.Module):<br>\n    def <strong>init</strong>(self):<br>\n        super().<strong>init</strong>()</p>\n<pre><code>    self.conv1 = nn.Sequential(\n        nn.Conv2d(\n            in_channels=1,\n            out_channels=16,\n            kernel_size=3,\n            stride=1,\n            padding=2\n            ),\n        nn.ReLU(),\n        nn.MaxPool2d(kernel_size=2)\n    )\n\n    self.conv2 = nn.Sequential(\n        nn.Conv2d(\n            in_channels=16,\n            out_channels=32,\n            kernel_size=3,\n            stride=1,\n            padding=2\n            ),\n        nn.ReLU(),\n        nn.MaxPool2d(kernel_size=2)\n    )\n    self.conv3 = nn.Sequential(\n        nn.Conv2d(\n            in_channels=32,\n            out_channels=64,\n            kernel_size=3,\n            stride=1,\n            padding=2\n            ),\n        nn.ReLU(),\n        nn.MaxPool2d(kernel_size=2)\n    )\n    self.conv4 = nn.Sequential(\n        nn.Conv2d(\n            in_channels=64,\n            out_channels=128,\n            kernel_size=3,\n            stride=1,\n            padding=2\n            ),\n        nn.ReLU(),\n        nn.MaxPool2d(kernel_size=2)\n    )\n    self.flatten = nn.Flatten()\n    self.linear = nn.Linear(in_features= 128 * 5 * 3 ,  out_features=num_classes)\n    self.softmax = nn.Softmax(dim=1)\n\ndef forward(self, input_data):\n    x = self.conv1(input_data)\n    x = self.conv2(x)\n    x = self.conv3(x)\n    x = self.conv4(x)\n    x = self.flatten(x)\n    logits = self.linear(x)\n    predictions = self.softmax(logits)\n    return predictions`\n</code></pre>\n<p>`ANNOTATIONS_FILE = '../input/birdclef-2023/train_metadata.csv'<br>\nAUDIO_DIR = \"../input/birdclef-2023/train_audio/\"<br>\nSAMPLE_RATE = 32000<br>\nNUM_SAMPLES = 32000</p>\n<p>device = \"cuda\" if torch.cuda.is_available() else \"cpu\"<br>\nprint(\"Running on\", device)</p>\n<p>mel_spectogram = torchaudio.transforms.MelSpectrogram(sample_rate = SAMPLE_RATE, n_fft=2028, hop_length=1024, n_mels=64)<br>\nbird_ds = BirdDataset(ANNOTATIONS_FILE, AUDIO_DIR, mel_spectogram, SAMPLE_RATE, NUM_SAMPLES, device)`</p>\n<p>`from torch.utils.data import DataLoader</p>\n<p>BATCH_SIZE = 128<br>\nEPOCHS = 10<br>\nLEARNING_RATE = 0.001</p>\n<p>device = \"cuda\" if torch.cuda.is_available() else \"cpu\"</p>\n<p>def create_data_loader(train_data, batch_size):<br>\n    train_dataloader = DataLoader(train_data, batch_size=batch_size)<br>\n    return train_dataloader</p>\n<p>def train_single_epoch(model, data_loader, loss_fn, optimiser, device):<br>\n    for input, target in data_loader:<br>\n        input, target = torch.tensor(input).to(device), torch.tensor(target).to(device)<br>\n        # calculate loss<br>\n        prediction = model(input)<br>\n        loss = loss_fn(prediction, target)</p>\n<pre><code>    # backpropagate error and update weights\n    optimiser.zero_grad()\n    loss.backward()\n    optimiser.step()\n\nprint(f\"loss: {loss.item()}\")\n</code></pre>\n<p>def train(model, data_loader, loss_fn, optimiser, device, epochs):<br>\n    for i in range(epochs):<br>\n        print(f\"Epoch {i+1}\")<br>\n        train_single_epoch(model, data_loader, loss_fn, optimiser, device)<br>\n        print(\"---------------------------\")<br>\n    print(\"Finished training\")</p>\n<p>train_dataloader = create_data_loader(bird_ds, BATCH_SIZE)</p>\n<p>cnn = CNNNetwork().to(device)<br>\nprint(cnn)</p>\n<p>loss_fn = nn.CrossEntropyLoss()<br>\noptimiser = torch.optim.Adam(cnn.parameters(),<br>\n                             lr=LEARNING_RATE)<br>\ntrain(cnn, train_dataloader, loss_fn, optimiser, device, EPOCHS)<br>\ntorch.save(cnn.state_dict(), \"feedforwardnet.pth\")<br>\nprint(\"Trained feed forward net saved at feedforwardnet.pth\")`</p>\n<p>At first I thought it was extra labels but apparently it's not. I know my code is not optimized at all and the model might create nightmares for advanced people but I'm just trying to learn and get a first prediction to be able to tweak the model after :) </p>\n<p>I would really appreciate a little boost/help here to what I'm doing wrong :( </p>\n<p>Thank you very much</p>",
      "rawMarkdown": "Hi everyone, I'm currently trying my best to develop a CNN to classify the  birds sound as a beginner data scientist, but I run into an issue while trying to train my model, here is the entire traceback:\n`---------------------------------------------------------------------------\nValueError                                Traceback (most recent call last)\n/tmp/ipykernel_27/2595944468.py in <module>\n     48 \n     49 # train model\n---> 50 train(cnn, train_dataloader, loss_fn, optimiser, device, EPOCHS)\n     51 \n     52 # save model\n\n/tmp/ipykernel_27/2595944468.py in train(model, data_loader, loss_fn, optimiser, device, epochs)\n     30     for i in range(epochs):\n     31         print(f\"Epoch {i+1}\")\n---> 32         train_single_epoch(model, data_loader, loss_fn, optimiser, device)\n     33         print(\"---------------------------\")\n     34     print(\"Finished training\")\n\n/tmp/ipykernel_27/2595944468.py in train_single_epoch(model, data_loader, loss_fn, optimiser, device)\n     14 def train_single_epoch(model, data_loader, loss_fn, optimiser, device):\n     15     for input, target in data_loader:\n---> 16         input, target = torch.tensor(input).to(device), torch.tensor(target).to(device)\n     17         # calculate loss\n     18         prediction = model(input)\n\nValueError: too many dimensions 'str'`\n\n\nand here is my code: \n`annotations = pd.read_csv('/kaggle/input/birdclef-2023/train_metadata.csv')\nannotations.head()\n\nclass_names = sorted(os.listdir('/kaggle/input/birdclef-2023/train_audio/'))\nnum_classes = len(class_names)\nprint(num_classes)`\n\n`class BirdDataset(Dataset):\n    def __init__(self, annotations_file, audio_dir, transformation, target_sample_rate, num_samples, device):\n        self.annotations = pd.read_csv(annotations_file)\n        self.audio_dir = audio_dir\n        self.device = device\n        self.transformation = transformation.to(self.device)\n        self.target_sample_rate = target_sample_rate\n        self.num_samples = num_samples\n        \n    def __len__(self):\n        return len(self.annotations)\n\n    def __getitem__(self, index):\n        audio_sample_path = self._get_audio_sample_path(index)\n        label = self._get_audio_sample_label(index)\n        signal, sr = torchaudio.load(audio_sample_path)\n        signal = signal.to(self.device)\n        signal = self._resample_if_necessary(signal, sr)\n        signal = self._mix_down_if_necessary(signal)\n        signal = self._right_pad_if_necessary(signal)\n        signal = self._cut_if_necessary(signal)\n        signal = self.transformation(signal)\n        return signal, label\n\n    def _get_audio_sample_path(self, index):\n        file_name = self.annotations.iloc[index, 11]\n        path = os.path.join(self.audio_dir, file_name)\n        return path\n\n    def _get_audio_sample_label(self, index):\n        return self.annotations.iloc[index, 0]\n    \n    def _resample_if_necessary(self, signal, sr):\n        if sr != self.target_sample_rate:\n            resampler = torchaudio.transforms.Resample(sr, self.target_sample_rate)\n            signal  = resample(signal)\n        return signal\n    \n    def _mix_down_if_necessary(self, signal):\n        if signal.shape[0] > 1:\n            signal = torch.mean(signal, dim=0, keepdim=True)\n        return signal\n    \n    def _cut_if_necessary(self, signal):\n        if signal.shape[1] > self.num_samples:\n            signal = signal[:, :self.num_samples]\n        return signal\n    \n    def _right_pad_if_necessary(self, signal):\n        length_signal = signal.shape[1]\n        if length_signal < self.num_samples:\n            num_missing_samples = self.num_samples - length_signal\n            last_dim_padding = (0, num_missing_sampels)\n            signal = torch.nn.functional.pad(signal, last_dim_padding)\n        return signal`\n\n\n`class CNNNetwork(nn.Module):\n    def __init__(self):\n        super().__init__()\n       \n        \n        self.conv1 = nn.Sequential(\n            nn.Conv2d(\n                in_channels=1,\n                out_channels=16,\n                kernel_size=3,\n                stride=1,\n                padding=2\n                ),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2)\n        )\n        \n        self.conv2 = nn.Sequential(\n            nn.Conv2d(\n                in_channels=16,\n                out_channels=32,\n                kernel_size=3,\n                stride=1,\n                padding=2\n                ),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2)\n        )\n        self.conv3 = nn.Sequential(\n            nn.Conv2d(\n                in_channels=32,\n                out_channels=64,\n                kernel_size=3,\n                stride=1,\n                padding=2\n                ),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2)\n        )\n        self.conv4 = nn.Sequential(\n            nn.Conv2d(\n                in_channels=64,\n                out_channels=128,\n                kernel_size=3,\n                stride=1,\n                padding=2\n                ),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2)\n        )\n        self.flatten = nn.Flatten()\n        self.linear = nn.Linear(in_features= 128 * 5 * 3 ,  out_features=num_classes)\n        self.softmax = nn.Softmax(dim=1)\n        \n    def forward(self, input_data):\n        x = self.conv1(input_data)\n        x = self.conv2(x)\n        x = self.conv3(x)\n        x = self.conv4(x)\n        x = self.flatten(x)\n        logits = self.linear(x)\n        predictions = self.softmax(logits)\n        return predictions`\n\n\n`ANNOTATIONS_FILE = '../input/birdclef-2023/train_metadata.csv'\nAUDIO_DIR = \"../input/birdclef-2023/train_audio/\"\nSAMPLE_RATE = 32000\nNUM_SAMPLES = 32000\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(\"Running on\", device)\n\nmel_spectogram = torchaudio.transforms.MelSpectrogram(sample_rate = SAMPLE_RATE, n_fft=2028, hop_length=1024, n_mels=64)\nbird_ds = BirdDataset(ANNOTATIONS_FILE, AUDIO_DIR, mel_spectogram, SAMPLE_RATE, NUM_SAMPLES, device)`\n\n`from torch.utils.data import DataLoader\n\nBATCH_SIZE = 128\nEPOCHS = 10\nLEARNING_RATE = 0.001\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\ndef create_data_loader(train_data, batch_size):\n    train_dataloader = DataLoader(train_data, batch_size=batch_size)\n    return train_dataloader\n\ndef train_single_epoch(model, data_loader, loss_fn, optimiser, device):\n    for input, target in data_loader:\n        input, target = torch.tensor(input).to(device), torch.tensor(target).to(device)\n        # calculate loss\n        prediction = model(input)\n        loss = loss_fn(prediction, target)\n\n        # backpropagate error and update weights\n        optimiser.zero_grad()\n        loss.backward()\n        optimiser.step()\n\n    print(f\"loss: {loss.item()}\")\n\ndef train(model, data_loader, loss_fn, optimiser, device, epochs):\n    for i in range(epochs):\n        print(f\"Epoch {i+1}\")\n        train_single_epoch(model, data_loader, loss_fn, optimiser, device)\n        print(\"---------------------------\")\n    print(\"Finished training\")\n\ntrain_dataloader = create_data_loader(bird_ds, BATCH_SIZE)\n\ncnn = CNNNetwork().to(device)\nprint(cnn)\n\nloss_fn = nn.CrossEntropyLoss()\noptimiser = torch.optim.Adam(cnn.parameters(),\n                             lr=LEARNING_RATE)\ntrain(cnn, train_dataloader, loss_fn, optimiser, device, EPOCHS)\ntorch.save(cnn.state_dict(), \"feedforwardnet.pth\")\nprint(\"Trained feed forward net saved at feedforwardnet.pth\")`\n\n\nAt first I thought it was extra labels but apparently it's not. I know my code is not optimized at all and the model might create nightmares for advanced people but I'm just trying to learn and get a first prediction to be able to tweak the model after :) \n\nI would really appreciate a little boost/help here to what I'm doing wrong :( \n\nThank you very much"
    }
  ],
  "comments": [],
  "raw_markdown_by_id": {
    "2229056": "Hi everyone, I'm currently trying my best to develop a CNN to classify the  birds sound as a beginner data scientist, but I run into an issue while trying to train my model, here is the entire traceback:\n`---------------------------------------------------------------------------\nValueError                                Traceback (most recent call last)\n/tmp/ipykernel_27/2595944468.py in <module>\n     48 \n     49 # train model\n---> 50 train(cnn, train_dataloader, loss_fn, optimiser, device, EPOCHS)\n     51 \n     52 # save model\n\n/tmp/ipykernel_27/2595944468.py in train(model, data_loader, loss_fn, optimiser, device, epochs)\n     30     for i in range(epochs):\n     31         print(f\"Epoch {i+1}\")\n---> 32         train_single_epoch(model, data_loader, loss_fn, optimiser, device)\n     33         print(\"---------------------------\")\n     34     print(\"Finished training\")\n\n/tmp/ipykernel_27/2595944468.py in train_single_epoch(model, data_loader, loss_fn, optimiser, device)\n     14 def train_single_epoch(model, data_loader, loss_fn, optimiser, device):\n     15     for input, target in data_loader:\n---> 16         input, target = torch.tensor(input).to(device), torch.tensor(target).to(device)\n     17         # calculate loss\n     18         prediction = model(input)\n\nValueError: too many dimensions 'str'`\n\n\nand here is my code: \n`annotations = pd.read_csv('/kaggle/input/birdclef-2023/train_metadata.csv')\nannotations.head()\n\nclass_names = sorted(os.listdir('/kaggle/input/birdclef-2023/train_audio/'))\nnum_classes = len(class_names)\nprint(num_classes)`\n\n`class BirdDataset(Dataset):\n    def __init__(self, annotations_file, audio_dir, transformation, target_sample_rate, num_samples, device):\n        self.annotations = pd.read_csv(annotations_file)\n        self.audio_dir = audio_dir\n        self.device = device\n        self.transformation = transformation.to(self.device)\n        self.target_sample_rate = target_sample_rate\n        self.num_samples = num_samples\n        \n    def __len__(self):\n        return len(self.annotations)\n\n    def __getitem__(self, index):\n        audio_sample_path = self._get_audio_sample_path(index)\n        label = self._get_audio_sample_label(index)\n        signal, sr = torchaudio.load(audio_sample_path)\n        signal = signal.to(self.device)\n        signal = self._resample_if_necessary(signal, sr)\n        signal = self._mix_down_if_necessary(signal)\n        signal = self._right_pad_if_necessary(signal)\n        signal = self._cut_if_necessary(signal)\n        signal = self.transformation(signal)\n        return signal, label\n\n    def _get_audio_sample_path(self, index):\n        file_name = self.annotations.iloc[index, 11]\n        path = os.path.join(self.audio_dir, file_name)\n        return path\n\n    def _get_audio_sample_label(self, index):\n        return self.annotations.iloc[index, 0]\n    \n    def _resample_if_necessary(self, signal, sr):\n        if sr != self.target_sample_rate:\n            resampler = torchaudio.transforms.Resample(sr, self.target_sample_rate)\n            signal  = resample(signal)\n        return signal\n    \n    def _mix_down_if_necessary(self, signal):\n        if signal.shape[0] > 1:\n            signal = torch.mean(signal, dim=0, keepdim=True)\n        return signal\n    \n    def _cut_if_necessary(self, signal):\n        if signal.shape[1] > self.num_samples:\n            signal = signal[:, :self.num_samples]\n        return signal\n    \n    def _right_pad_if_necessary(self, signal):\n        length_signal = signal.shape[1]\n        if length_signal < self.num_samples:\n            num_missing_samples = self.num_samples - length_signal\n            last_dim_padding = (0, num_missing_sampels)\n            signal = torch.nn.functional.pad(signal, last_dim_padding)\n        return signal`\n\n\n`class CNNNetwork(nn.Module):\n    def __init__(self):\n        super().__init__()\n       \n        \n        self.conv1 = nn.Sequential(\n            nn.Conv2d(\n                in_channels=1,\n                out_channels=16,\n                kernel_size=3,\n                stride=1,\n                padding=2\n                ),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2)\n        )\n        \n        self.conv2 = nn.Sequential(\n            nn.Conv2d(\n                in_channels=16,\n                out_channels=32,\n                kernel_size=3,\n                stride=1,\n                padding=2\n                ),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2)\n        )\n        self.conv3 = nn.Sequential(\n            nn.Conv2d(\n                in_channels=32,\n                out_channels=64,\n                kernel_size=3,\n                stride=1,\n                padding=2\n                ),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2)\n        )\n        self.conv4 = nn.Sequential(\n            nn.Conv2d(\n                in_channels=64,\n                out_channels=128,\n                kernel_size=3,\n                stride=1,\n                padding=2\n                ),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2)\n        )\n        self.flatten = nn.Flatten()\n        self.linear = nn.Linear(in_features= 128 * 5 * 3 ,  out_features=num_classes)\n        self.softmax = nn.Softmax(dim=1)\n        \n    def forward(self, input_data):\n        x = self.conv1(input_data)\n        x = self.conv2(x)\n        x = self.conv3(x)\n        x = self.conv4(x)\n        x = self.flatten(x)\n        logits = self.linear(x)\n        predictions = self.softmax(logits)\n        return predictions`\n\n\n`ANNOTATIONS_FILE = '../input/birdclef-2023/train_metadata.csv'\nAUDIO_DIR = \"../input/birdclef-2023/train_audio/\"\nSAMPLE_RATE = 32000\nNUM_SAMPLES = 32000\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(\"Running on\", device)\n\nmel_spectogram = torchaudio.transforms.MelSpectrogram(sample_rate = SAMPLE_RATE, n_fft=2028, hop_length=1024, n_mels=64)\nbird_ds = BirdDataset(ANNOTATIONS_FILE, AUDIO_DIR, mel_spectogram, SAMPLE_RATE, NUM_SAMPLES, device)`\n\n`from torch.utils.data import DataLoader\n\nBATCH_SIZE = 128\nEPOCHS = 10\nLEARNING_RATE = 0.001\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\ndef create_data_loader(train_data, batch_size):\n    train_dataloader = DataLoader(train_data, batch_size=batch_size)\n    return train_dataloader\n\ndef train_single_epoch(model, data_loader, loss_fn, optimiser, device):\n    for input, target in data_loader:\n        input, target = torch.tensor(input).to(device), torch.tensor(target).to(device)\n        # calculate loss\n        prediction = model(input)\n        loss = loss_fn(prediction, target)\n\n        # backpropagate error and update weights\n        optimiser.zero_grad()\n        loss.backward()\n        optimiser.step()\n\n    print(f\"loss: {loss.item()}\")\n\ndef train(model, data_loader, loss_fn, optimiser, device, epochs):\n    for i in range(epochs):\n        print(f\"Epoch {i+1}\")\n        train_single_epoch(model, data_loader, loss_fn, optimiser, device)\n        print(\"---------------------------\")\n    print(\"Finished training\")\n\ntrain_dataloader = create_data_loader(bird_ds, BATCH_SIZE)\n\ncnn = CNNNetwork().to(device)\nprint(cnn)\n\nloss_fn = nn.CrossEntropyLoss()\noptimiser = torch.optim.Adam(cnn.parameters(),\n                             lr=LEARNING_RATE)\ntrain(cnn, train_dataloader, loss_fn, optimiser, device, EPOCHS)\ntorch.save(cnn.state_dict(), \"feedforwardnet.pth\")\nprint(\"Trained feed forward net saved at feedforwardnet.pth\")`\n\n\nAt first I thought it was extra labels but apparently it's not. I know my code is not optimized at all and the model might create nightmares for advanced people but I'm just trying to learn and get a first prediction to be able to tweak the model after :) \n\nI would really appreciate a little boost/help here to what I'm doing wrong :( \n\nThank you very much"
  }
}