Deep Learning PyTorch Course, Anaconda Installation

Deep learning is a field of artificial intelligence that is especially used to learn patterns from large amounts of data and make predictions based on it. PyTorch is a popular library that helps implement deep learning easily. In this course, we will introduce how to install and set up PyTorch using the Anaconda environment.

1. What is Anaconda?

Anaconda is a Python distribution for data science, machine learning, and deep learning. This distribution includes a variety of libraries and tools, providing easy package management and environment management. By using Anaconda, you can easily create and manage Python environments suited for specific projects, which greatly helps prevent version conflicts between libraries.

1.1. Features of Anaconda

  • Package management: You can install and manage various packages through the conda package manager.
  • Environment management: You can create independent Python environments for each project to prevent library conflicts.
  • Diverse libraries: It includes many libraries related to data science such as NumPy, SciPy, Pandas, and Matplotlib.

2. Installing Anaconda

The process of installing Anaconda is simple. Let’s download and install Anaconda by following the steps below.

2.1. Downloading Anaconda

You can download the installation file from the official Anaconda website. Click the following link to go to the download page: Anaconda Distribution.

Choose the installation file suitable for your operating system (supports Windows, macOS, Linux).

2.2. Installation Process

Once the download is complete, run the installer. Although the process varies by operating system, it generally proceeds with the following steps.

  • Run the installer: Double-click the downloaded installation file to run it.
  • License agreement: Select the checkbox agreeing to the license agreement and click “Next”.
  • Select installation type: Choosing “Just Me” installs it only for personal use. Selecting “All Users” allows all users to use it.
  • Select installation path: You can leave the default installation path or change it to your desired path.
  • Other settings: You can choose whether to set environment variables (recommended).
  • Proceed with installation: Click the “Install” button to begin the installation.
  • Installation complete: Click the “Finish” button to end the installation.

2.3. Verifying Anaconda Installation

Once Anaconda is installed, open the Anaconda Prompt to verify that the installation was successful. You can search for “Anaconda Prompt” in the start menu to open it.

conda --version

By entering the above command, the version of the installed conda will be displayed. If there is no output, the installation was not successful. In this case, please check the installation process again.

3. Creating a New Anaconda Environment

Now, let’s create a new environment to install the libraries needed for deep learning using Anaconda. Please proceed with the steps below.

3.1. Creating a New Environment

conda create --name mypytorch python=3.8

By entering the above command, a new environment named “mypytorch” will be created. Here, “python=3.8” sets the version of Python to be used in that environment.

3.2. Activating the Environment

conda activate mypytorch

Activate the newly created environment. The name of the prompt will change when the environment is activated.

3.3. Installing PyTorch

After activating the environment, install PyTorch using the command provided on the PyTorch official website. (It can be configured differently depending on the CUDA version you want to install.)

conda install pytorch torchvision torchaudio cpuonly -c pytorch

The above command installs PyTorch, TorchVision, and Torchaudio for CPU only. To install for a GPU that supports CUDA, you can choose the corresponding CUDA version to install.

4. Verifying PyTorch Installation

To check whether PyTorch was installed correctly, run the Python interpreter and input the following code.

python
import torch
print(torch.__version__)

If you enter the above code, the version of the installed PyTorch will be displayed. If no errors occur and the version is displayed, PyTorch has been successfully installed.

5. Simple PyTorch Code Example

Now that PyTorch is successfully installed, let’s write code to train a simple deep learning model. We will implement a simple linear regression model.

5.1. Generating Data

import torch
import numpy as np
import matplotlib.pyplot as plt

# Generate data
x = np.random.rand(100, 1) * 10  # Random values between 0 and 10
y = 2 * x + 1 + np.random.randn(100, 1)  # y = 2x + 1 + noise

# Visualize data
plt.scatter(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Generated Data')
plt.show()

5.2. Defining the Model

import torch.nn as nn

# Define the linear regression model
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)  # 1 input, 1 output

    def forward(self, x):
        return self.linear(x)

5.3. Defining the Loss Function and Optimizer

# Setting the loss function and optimizer
model = LinearRegressionModel()
criterion = nn.MSELoss()  # Mean Squared Error
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # Stochastic Gradient Descent

5.4. Training the Model

# Convert data to tensors
X = torch.from_numpy(x).float()  # Input
Y = torch.from_numpy(y).float()  # Output

# Train the model
for epoch in range(100):  # 100 epochs
    optimizer.zero_grad()  # Zero the gradients
    outputs = model(X)  # Model prediction
    loss = criterion(outputs, Y)  # Calculate loss
    loss.backward()  # Compute gradients
    optimizer.step()  # Update parameters

    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')

5.5. Visualizing the Training Result

# Visualize the training result
predicted = model(X).detach().numpy()  # Model predictions

plt.scatter(x, y, label='Original Data')
plt.plot(x, predicted, color='red', label='Fitted Line')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Linear Regression Result')
plt.legend()
plt.show()

6. Conclusion

In this course, we covered how to install Anaconda and how to install PyTorch in that environment, as well as how to implement a simple linear regression model. Efficiently managing the Python environment through Anaconda and installing libraries related to deep learning is a very important first step in the field of data science and machine learning.

Furthermore, I recommend getting familiar with the basic structure and usage of PyTorch through practice and trying to implement various deep learning models. I hope your deep learning journey is an interesting and beneficial experience.

Deep Learning PyTorch Course, Deep Neural Networks

In this course, we will start with the basic concepts of deep learning and learn how to implement Deep Neural Networks (DNN) using PyTorch. Deep Neural Networks are a crucial element in solving various problems in the field of artificial intelligence. Through this course, you will learn about the structure of deep neural networks, learning methods, and the basic usage of PyTorch.

1. What is Deep Learning?

Deep Learning is a field of Artificial Intelligence (AI) that processes and predicts data based on Artificial Neural Networks. A Deep Neural Network consists of multiple hidden layers, allowing it to learn complex patterns.

1.1. Key Features of Deep Learning

  • Large Amounts of Data: Deep learning learns features from large amounts of data.
  • Unsupervised Learning: Typically, deep learning learns the relationships between inputs and outputs through unsupervised learning.
  • Complex Models: It can model non-linearity through a hierarchical structure.

2. Structure of Deep Neural Networks

A Deep Neural Network consists of an input layer, several hidden layers, and an output layer. Each layer consists of multiple nodes, and each node calculates the output value of that layer.

2.1. Components

2.1.1. Node

A node receives input, applies weights and biases, passes the result through an activation function, and generates the output.

2.1.2. Activation Function

An activation function is a function that non-linearly transforms the output of a node. Common activation functions include Sigmoid, Tanh, and ReLU (Rectified Linear Unit).

2.1.3. Forward Propagation

The forward propagation process is the procedure of passing input data through the network to calculate the output. In this process, the nodes of all hidden layers receive input values, apply weights and biases, and generate results through the activation function.

2.1.4. Backward Propagation

The backward propagation process is the procedure of adjusting weights and biases to reduce the error between the network’s output and the actual target values. We update the weights using Gradient Descent.

2.2. Formulas for Deep Neural Networks

The output of a deep neural network can be expressed as follows:

y = f(W * x + b)

Here, y represents the output, f is the activation function, W is the weight, x is the input, and b is the bias.

3. Basics of PyTorch

PyTorch is an open-source machine learning library developed by Facebook (now Meta). It features ease of use and dynamic computation graphs (Define-by-Run). We will learn how to implement deep neural networks with PyTorch.

3.1. Installation

PyTorch can be easily installed using pip.

pip install torch torchvision torchaudio

3.2. Basic Data Structure

The tensor provided by PyTorch is similar to a numpy array but supports GPU operations, making it optimized for deep learning. Here’s how to create tensors:


import torch

# 1D tensor
x = torch.tensor([1.0, 2.0, 3.0])
print(x)

# 2D tensor
y = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
print(y)

4. Implementing Deep Neural Networks

4.1. Preparing the Dataset

To practice deep learning, we can use an empty dataset. Here, we will use the MNIST dataset. MNIST is a handwritten digit dataset consisting of numbers from 0 to 9.


from torchvision import datasets, transforms

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

# Download MNIST dataset
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)

4.2. Defining the Model

Next, we define the deep neural network model. The nn.Module class allows you to easily create a custom neural network class.


import torch.nn as nn
import torch.nn.functional as F

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, 10)

    def forward(self, x):
        x = x.view(-1, 28 * 28)  # Flatten the 2D tensor to 1D.
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)  # No activation function at the output layer
        return x

model = SimpleNN()

4.3. Setting Loss Function and Optimizer

We set the loss function and optimizer for model training. Here, we will use Cross Entropy Loss and Stochastic Gradient Descent (SGD) optimizer.


import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

4.4. Training Loop

Finally, we will write a loop for model training. For each batch, we will perform forward propagation, loss calculation, and backward propagation.


num_epochs = 5

for epoch in range(num_epochs):
    for images, labels in train_loader:
        # Zero gradients
        optimizer.zero_grad()
        
        # Forward propagation
        outputs = model(images)
        
        # Calculate loss
        loss = criterion(outputs, labels)
        
        # Backward propagation
        loss.backward()
        
        # Update weights
        optimizer.step()
    
    print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')

5. Performance Evaluation

Once the model training is complete, we use the test dataset to evaluate the model’s performance and calculate accuracy. This will help verify how well the model has learned.


# Prepare test dataset
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

model.eval()  # Switch to evaluation mode
correct = 0
total = 0

with torch.no_grad():
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy: {100 * correct / total:.2f}%')

Conclusion

In this course, we explored the basic concepts of deep neural networks and how to implement them using PyTorch. After preparing the dataset and defining the model, we built the model through actual training and evaluation processes. Based on your understanding of deep learning and PyTorch, I encourage you to try more complex networks or various models.

Research and application of deep neural networks will continue to develop, contributing to the advancement of the fields of machine learning and artificial intelligence.

Please continue your in-depth learning through additional materials and references. We wish all readers a successful journey in deep learning!

Deep Learning PyTorch Course, Deep Belief Neural Networks

Deep learning is a field of artificial intelligence that uses deep neural networks to learn patterns from data and make predictions. Today, we will introduce Deep Belief Networks (DBN) and explore how to implement them using PyTorch.

1. What is a Deep Belief Network?

A Deep Belief Network is an artificial neural network with multiple layers, characterized particularly by the following features:

  • It primarily learns the latent structure of data through unsupervised learning.
  • It is composed of several stacked Restricted Boltzmann Machines (RBM).
  • Each RBM learns the probability distribution of the data and passes information to the upper layer.

DBN plays an important role in deep learning models. This model allows input data to be represented as probability distributions across multiple layers, enabling it to learn complex features.

1.1 Restricted Boltzmann Machine

A Restricted Boltzmann Machine (RBM) is a probabilistic model used in unsupervised learning, consisting of two layers:

  • Visible Layer: The layer that receives input data.
  • Hidden Layer: The layer that extracts features from the data.

An RBM has connections between the neurons in each layer, and these connections learn a probability distribution based on survival probability.

2. Implementing DBN with PyTorch

Now, let’s look at how to implement a Deep Belief Network using PyTorch. Here, we will construct a DBN using a simple MNIST digit recognition dataset.

2.1 Loading the Dataset

First, we load and preprocess the MNIST dataset.

import torch
from torchvision import datasets, transforms

# Define data transformations
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

# Download MNIST dataset
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)

# Define data loaders
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

2.2 Implementing DBN

DBN can be built by stacking multiple RBMs. Below is an example of how to implement DBN using PyTorch.

class RBM:
    def __init__(self, n_visible, n_hidden):
        self.W = torch.randn(n_hidden, n_visible) * 0.1
        self.h_bias = torch.zeros(n_hidden)
        self.v_bias = torch.zeros(n_visible)

    def sample_h(self, v):
        h_prob = torch.sigmoid(torch.matmul(self.W, v.t()) + self.h_bias.unsqueeze(1))
        return h_prob, torch.bernoulli(h_prob)

    def sample_v(self, h):
        v_prob = torch.sigmoid(torch.matmul(h, self.W) + self.v_bias)
        return v_prob, torch.bernoulli(v_prob)

    def train(self, data, lr=0.1, k=1):
        for epoch in range(k):
            v0 = data
            h0, h0_sample = self.sample_h(v0)
            v1, v1_sample = self.sample_v(h0_sample)
            h1, _ = self.sample_h(v1_sample)

            # Update
            self.W += lr * (torch.matmul(h0_sample.t(), v0) - torch.matmul(h1.t(), v1_sample)) / data.size(0)
            self.h_bias += lr * (h0_sample.mean(0) - h1.mean(0))
            self.v_bias += lr * (v0.mean(0) - v1.mean(0))

2.3 Building DBN by Stacking Multiple RBMs

class DBN:
    def __init__(self, layer_sizes):
        self.RBMs = []
        for i in range(len(layer_sizes) - 1):
            self.RBMs.append(RBM(layer_sizes[i], layer_sizes[i + 1]))

    def fit(self, data, lr=0.1, k=1):
        for rbm in self.RBMs:
            rbm.train(data, lr=lr, k=k)
            data, _ = rbm.sample_h(data)

    def transform(self, data):
        for rbm in self.RBMs:
            _, data = rbm.sample_h(data)
        return data

2.4 Training the DBN Model

# Training DBN
dbn = DBN(layer_sizes=[784, 256, 128])
for batch_idx, (data, target) in enumerate(train_loader):
    dbn.fit(data.view(-1, 784), lr=0.1, k=10)  # Perform K-learning 10 times

2.5 Transforming and Evaluating on Test Dataset

test_data = next(iter(test_loader))[0].view(-1, 784)
transformed_data = dbn.transform(test_data)
print(transformed_data)
# Here, transformed_data can be used for subsequent models.

3. Conclusion

In this tutorial, we have explored the fundamental concepts and principles of Deep Belief Networks and how to implement them with PyTorch. DBNs are very useful models for learning the latent structure of complex data. Using PyTorch, these deep learning models can be effectively implemented.

For deeper learning and utilization, we recommend referring to the official PyTorch documentation and various examples. Welcome to the world of deep learning!

Deep Learning PyTorch Course, Setting Up the Practice Environment

Deep learning has become the core of modern artificial intelligence (AI) technologies, and as a result, various frameworks have emerged. Among them, PyTorch is favored by many researchers and developers due to its dynamic computation approach and intuitive API. In this course, we will learn in detail about setting up the environment for deep learning practices using PyTorch.

1. Introduction to PyTorch

PyTorch is an open-source machine learning library developed by the Facebook AI Research Group. Its two main features are:

  • Dynamic Graph (Define-by-Run) Construction: The graph is generated according to the flow of data, making debugging and modifications easier.
  • Simplified API: It supports tensor operations similar to NumPy, providing excellent compatibility with existing NumPy code.

2. Setting Up the Practice Environment

To implement deep learning models with PyTorch, it is necessary to set up the practice environment, including the installation of Python and libraries.

2.1. Installing Python

Since PyTorch is a Python-based library, you need to install Python first. You can install Python by following these steps:

  1. Download Python: Visit the official Python website to download the latest version.
  2. Installation: After executing the downloaded installation file, check the “Add Python to PATH” option and proceed with the installation.

2.2. Setting Up a Virtual Environment

A virtual environment allows you to manage independent packages and dependencies for each project. You can create a virtual environment using the venv module. Follow the steps below:

bash
    # Create a virtual environment
    python -m venv myenv

    # Activate the virtual environment (Windows)
    myenv\Scripts\activate

    # Activate the virtual environment (Mac/Linux)
    source myenv/bin/activate
    

2.3. Installing PyTorch

Once the virtual environment is activated, you can install PyTorch. The installation method may vary depending on the operating system and whether CUDA is supported. You can install PyTorch using the following command:

bash
    # Install CPU version
    pip install torch torchvision torchaudio

    # If using on a GPU that supports CUDA:
    # Install the version supporting CUDA with the command below
    # (Please find the appropriate command based on your CUDA version at the following link)
    # https://pytorch.org/get-started/locally/
    

2.4. Installing Jupyter Notebook (Optional)

It is recommended to use Jupyter Notebook for deep learning practices. Jupyter Notebook provides an interactive environment that is very useful for experimenting with code.

bash
    # Install Jupyter Notebook
    pip install jupyter
    

3. Simple PyTorch Example

Now let’s perform a simple tensor operation using the PyTorch we installed. Please run the following code in Jupyter Notebook.

python
    import torch

    # Create tensors
    a = torch.tensor([1.0, 2.0, 3.0])
    b = torch.tensor([4.0, 5.0, 6.0])

    # Sum of tensors
    c = a + b
    print("Sum of tensors:", c)

    # Tensor addition - in-place operation
    a.add_(b)  # a is now [5.0, 7.0, 9.0]
    print("Value of a after in-place operation:", a)
    

This code demonstrates basic tensor operations in PyTorch. It shows how to create tensors, calculate the sum of two tensors, and perform in-place operations.

4. Other Useful Resources

If you want more resources related to PyTorch, please refer to the following links:

Conclusion

You have successfully set up the practice environment for PyTorch. In future classes, we will work together on building and training actual deep learning models. I hope you can leverage the advantages of PyTorch to solve various deep learning problems!

Author: [Your Name]

Date: [Date]

Deep Learning PyTorch Course, Recurrent Neural Networks

1. Introduction

Deep learning is a branch of artificial intelligence that uses artificial neural networks to learn patterns from data and make predictions. In this lecture, we will take a closer look at the concept of Recurrent Neural Networks (RNNs) and how to implement RNN models using PyTorch.

2. What is a Recurrent Neural Network?

Recurrent Neural Networks (RNNs) are a type of neural network designed to process sequence data. While typical artificial neural networks have a fixed input size and process data at once, RNNs maintain an internal state that remembers past information and affects the current output. This is particularly useful in fields like Natural Language Processing (NLP).

2.1 Structure of RNN

The basic structure of an RNN is as follows. At each time step, the input \( x_t \) is processed along with the previous hidden state \( h_{t-1} \) to generate a new hidden state \( h_t \). This can be expressed with the following formula:

    h_t = f(W_h * h_{t-1} + W_x * x_t)
    

Here, \( f \) is the activation function, \( W_h \) is the weight of the hidden state, and \( W_x \) is the weight of the input.

2.2 Advantages and Disadvantages of RNN

RNNs are strong at processing sequence data, but they exhibit challenges in learning from long sequences due to issues like vanishing gradients or exploding gradients. To overcome these problems, improved architectures like Long Short-Term Memory (LSTM) or Gated Recurrent Unit (GRU) are used.

3. Implementing RNN Using PyTorch

Now, let’s implement a basic RNN model using PyTorch. In this example, we will tackle a simple natural language processing problem, which is predicting the next word for each word in a sentence.

3.1 Preparing the Data

First, we will import the necessary libraries and prepare the data. For this example, we will use simple sentences.

    import torch
    import torch.nn as nn
    import numpy as np
    from sklearn.preprocessing import OneHotEncoder

    # Data preparation
    sentences = ['I ate rice', 'I like apples', 'I code']
    words = set(' '.join(sentences).split())
    word_to_index = {word: i for i, word in enumerate(words)}
    index_to_word = {i: word for i, word in enumerate(words)}
    

The code above extracts words from the sentences and assigns an index to each word. Now, let’s move forward to convert the words into one-hot encoding.

    # One-hot encoding
    ohe = OneHotEncoder(sparse=False)
    X = []
    y = []

    for sentence in sentences:
        words = sentence.split()
        for i in range(len(words) - 1):
            X.append(word_to_index[words[i]])
            y.append(word_to_index[words[i + 1]])

    X = np.array(X).reshape(-1, 1)
    y = np.array(y).reshape(-1, 1)

    X_onehot = ohe.fit_transform(X)
    y_onehot = ohe.fit_transform(y)
    

3.2 Building the RNN Model

Now let’s build the RNN model. In PyTorch, RNN can be implemented using the nn.RNN class.

    class RNNModel(nn.Module):
        def __init__(self, input_size, hidden_size, output_size):
            super(RNNModel, self).__init__()
            self.hidden_size = hidden_size
            self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
            self.fc = nn.Linear(hidden_size, output_size)

        def forward(self, x):
            h0 = torch.zeros(1, x.size(0), self.hidden_size)
            out, _ = self.rnn(x, h0)
            out = self.fc(out[:, -1, :])
            return out
    

3.3 Training the Model

After creating the model, we will set up the loss function and optimization method, and proceed with the training.

    input_size = len(words)
    hidden_size = 5
    output_size = len(words)

    model = RNNModel(input_size, hidden_size, output_size)
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

    num_epochs = 1000
    for epoch in range(num_epochs):
        model.train()
        optimizer.zero_grad()

        X_tensor = torch.Tensor(X_onehot).view(-1, 1, input_size)
        y_tensor = torch.Tensor(y).long().view(-1)

        outputs = model(X_tensor)
        loss = criterion(outputs, y_tensor)
        loss.backward()
        optimizer.step()

        if (epoch + 1) % 100 == 0:
            print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
    

3.4 Evaluating the Model

After the training is complete, we will evaluate the model. The following explains the process of predicting the next word for a new input.

    def predict_next_word(model, current_word):
        model.eval()
        with torch.no_grad():
            input_index = word_to_index[current_word]
            input_onehot = ohe.transform([[input_index]])
            input_tensor = torch.Tensor(input_onehot).view(-1, 1, input_size)
            output = model(input_tensor)
            next_word_index = torch.argmax(output).item()
            return index_to_word[next_word_index]

    # Prediction
    next_word = predict_next_word(model, 'I')
    print(f"Next word prediction: {next_word}")
    

4. Conclusion

In this lecture, we explored the concept of Recurrent Neural Networks (RNNs) and how to implement a basic RNN model using PyTorch. RNNs are powerful tools for processing sequence data, but variations like LSTM or GRU may be required for long sequences.

4.1 Future Directions for RNN

RNNs are just the basic form, and recently, more advanced models like Transformer have gained attention in the field of natural language processing. To further advance to strong models, an understanding of various deep learning techniques and architectures is necessary.

4.2 Additional Learning Resources

If you want a deeper understanding of recurrent neural networks, the following resources are recommended:

  • Deep Learning Book: “Deep Learning” by Ian Goodfellow, Yoshua Bengio, and Aaron Courville
  • PyTorch Official Documentation
  • Deep Learning courses on Coursera

5. References

  • Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
  • Pereyra, G., et al. (2017). Dealing with the curse of dimensionality in RNNs.
  • Sepp Hochreiter, Jürgen Schmidhuber, (1997). Long Short-Term Memory.