Het_Patel_HW_1[1]
.pdf
keyboard_arrow_up
School
University of Texas, Dallas *
*We aren’t endorsed by this school
Course
6337
Subject
Mathematics
Date
May 1, 2024
Type
Pages
10
Uploaded by ProfAtom13452
1/28/24, 6:00 PM
1_Tensors_instructions.ipynb - Colaboratory
https://colab.research.google.com/drive/1ELnxRfj_ngoJ78kNZscBDbTV50lRNgFP?authuser=1#scrollTo=TtYsJM4mJNdE&printMode=true
1/10
You have to submit two ±les for this part of the HW
(1) ipynb (colab notebook) and
(2) pdf file (pdf version of the colab file).**
Files should be named as follows
:
FirstName_LastName_HW_1**
HW1 - 15 Points
import torch
import time
Create a torch Tensor of shape (5, 3) which is filled with zeros. Modify the tensor to set element (0, 2) to 10 and element (2, 0) to 100.
Q1 : Create Tensor (1/2 Point)
my_tensor = torch.zeros(5, 3)
my_tensor.shape
torch.Size([5, 3])
my_tensor
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
my_tensor[0,2] = 10
my_tensor[2,0] = 100
my_tensor
tensor([[ 0., 0., 10.],
[ 0., 0., 0.],
[100., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
You have following tensor as input:
x=torch.tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
Using only reshaping functions (like view, reshape, transpose, permute), you need to get at the following tensor as output:
tensor([[ 0, 4, 8, 12, 16, 20],
[ 1, 5, 9, 13, 17, 21],
[ 2, 6, 10, 14, 18, 22],
[ 3, 7, 11, 15, 19, 23]])
Q2: Reshape tensor (1/2 Point)
x=torch.tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
reshaped_tensor = x.view(6 ,4)
output_tensor = reshaped_tensor.transpose(0,1)
print(output_tensor)
1/28/24, 6:00 PM
1_Tensors_instructions.ipynb - Colaboratory
https://colab.research.google.com/drive/1ELnxRfj_ngoJ78kNZscBDbTV50lRNgFP?authuser=1#scrollTo=TtYsJM4mJNdE&printMode=true
2/10
tensor([[ 0, 4, 8, 12, 16, 20],
[ 1, 5, 9, 13, 17, 21],
[ 2, 6, 10, 14, 18, 22],
[ 3, 7, 11, 15, 19, 23]])
Slice the tensor x to get the following
last row of x
fourth column of x
first three rows and first two columns - the shape of subtensor should be (3,2)
odd valued rows and columns
Q3: Slice tensor (1Point)
x = torch.tensor([[1, 2, 3, 4, 5], [6, 7, 8, 8, 10], [11, 12, 13, 14, 15]])
x
tensor([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 8, 10],
[11, 12, 13, 14, 15]])
x.shape
torch.Size([3, 5])
# Student Task: Retrieve the last row of the tensor 'x'
# Hint: Negative indexing can help you select rows or columns counting from the end of the tensor.
# Think about how you can select all columns for the desired row.
last_row = x[-1]
last_row
tensor([11, 12, 13, 14, 15])
# Student Task: Retrieve the fourth column of the tensor 'x'
# Hint: Pay attention to the indexing for both rows and columns.
# Remember that indexing in Python starts from zero.
fourth_column = x[:, 3]
fourth_column
tensor([ 4, 8, 14])
# Student Task: Retrieve the first 3 rows and first 2 columns from the tensor 'x'.
# Hint: Use slicing to extract the required subset of rows and columns.
first_3_rows_2_columns = x[:3 ,:2]
first_3_rows_2_columns
tensor([[ 1, 2],
[ 6, 7],
[11, 12]])
# Student Task: Retrieve the rows and columns with odd-indexed positions from the tensor 'x'.
# Hint: Use stride slicing to extract the required subset of rows and columns with odd indices.
odd_valued_rows_columns = x[::2, ::2]
odd_valued_rows_columns
tensor([[ 1, 3, 5],
[11, 13, 15]])
Write the function that normalizes the columns of a matrix. You have to compute the mean and standard deviation of each column. Then for
each element of the column, you subtract the mean and divide by the standard deviation.
Q4 -Normalize Function (1/2 Points)
1/28/24, 6:00 PM
1_Tensors_instructions.ipynb - Colaboratory
https://colab.research.google.com/drive/1ELnxRfj_ngoJ78kNZscBDbTV50lRNgFP?authuser=1#scrollTo=TtYsJM4mJNdE&printMode=true
3/10
# Given Data
x = [[ 3, 60, 100, -100],
[ 2, 20, 600, -600],
[-5, 50, 900, -900]]
# Convert to PyTorch Tensor and set to float
X = torch.tensor(x)
X= X.float()
# Print shape and data type for verification
print(X.shape)
print(X.dtype)
torch.Size([3, 4])
torch.float32
# Compute and display the mean and standard deviation of each column for reference
X.mean(axis = 0)
X.std(axis = 0)
tensor([ 4.3589, 20.8167, 404.1452, 404.1452])
X.std(axis = 0)
tensor([ 4.3589, 20.8167, 404.1452, 404.1452])
Your task starts here
Your normalize_matrix function should take a PyTorch tensor x as input.
It should return a tensor where the columns are normalized.
After implementing your function, use the code provided to verify if the mean for each column in Z is close to zero and the standard
deviation is 1.
def normalize_matrix(x):
# Calculate the mean along each column (think carefully , you will take mean along axis = 0 or 1)
mean = torch.mean(x, dim=0)
# Calculate the standard deviation along each column
std = torch.std(x, dim=0)
# Normalize each element in the columns by subtracting the mean and dividing by the standard deviation
y = (x - mean) / std
return y # Return the normalized matrix
Z = normalize_matrix(X)
Z
tensor([[ 0.6882, 0.8006, -1.0722, 1.0722],
[ 0.4588, -1.1209, 0.1650, -0.1650],
[-1.1471, 0.3203, 0.9073, -0.9073]])
Z.mean(axis = 0)
tensor([ 0.0000e+00, 4.9671e-08, 3.9736e-08, -3.9736e-08])
1. Create a tensor A
with values [1, 2, 3]
.
2. Perform an in-place addition (use add_
method) of 5
to tensor A
.
3. Then, create another tensor B
with values [4, 5, 6]
and perform an out-of-place addition of 5
.
Print the memory addresses of A
and B
before and after the operations to demonstrate the difference in memory usage. Provide explanation
Q5: In-place vs. Out-of-place Operations (1 Point)
1/28/24, 6:00 PM
1_Tensors_instructions.ipynb - Colaboratory
https://colab.research.google.com/drive/1ELnxRfj_ngoJ78kNZscBDbTV50lRNgFP?authuser=1#scrollTo=TtYsJM4mJNdE&printMode=true
4/10
A = torch.tensor([1, 2, 3])
print('Original memory address of A:', id(A))
A.add_(5)
print('Memory address of A after in-place addition:', id(A))
print('A after in-place addition:', A)
B = torch.tensor([4, 5, 6])
print('Original memory address of B:', id(B))
B = B + 5
print('Memory address of B after out-of-place addition:', id(B))
print('B after out-of-place addition:', B)
Original memory address of A: 140592758940000
Memory address of A after in-place addition: 140592758940000
A after in-place addition: tensor([6, 7, 8])
Original memory address of B: 140590330455648
Memory address of B after out-of-place addition: 140592748489408
B after out-of-place addition: tensor([ 9, 10, 11])
Provide Explanation for above question here :
Justification
When using the add_ method (in-place addition), the operation changes the tensor (A) that is already in place. Thus, both before and after the in-
place addition, A's memory address stays the same.
When addition occurs out of place (using B = B + 5), the result of the addition is used to generate a new tensor, to which variable B is
subsequently transferred. As a result, following the out-of-place addition, B's memory address changes.
Because in-place operations alter the current tensor rather than creating a new one, they can be memory-efficient. It's crucial to remember that
in-place procedures might not be appropriate in all situations and may have unintended consequences.
1. Create two tensors X
with shape (3, 1)
and Y
with shape (1, 3)
. Perform an addition operation on X
and Y
.
2. Explain how broadcasting is applied in this operation by describing the shape changes that occur internally.
Q6: Tensor Broadcasting (1 Point)
X = torch.tensor([[2], [4], [6]]) Y = torch.tensor([[3, 6, 9]])
print('Original shapes:', X.shape, Y.shape)
result = X + Y
print('Result:', result)
print('Result shape:', result.shape)
Original shapes: torch.Size([3, 1]) torch.Size([1, 3])
Result: tensor([[ 5, 8, 11],
[ 7, 10, 13],
[ 9, 12, 15]])
Result shape: torch.Size([3, 3])
Provide Explanation for above question here :
Broadcasting is used in the addition operation X + Y to make the operation consistent with the forms of X and Y. Broadcasting is a method that
implicitly replicates values throughout dimensions to make disparate tensors compatible, hence enabling operations between them.
This is the way that broadcasting is used in this particular instance:
Extend Dimensions: X: (3, 1) and Y: (1, 3) are the initial forms. The first step in broadcasting is to enlarge the smaller tensor's dimensions to
match the larger tensor's. Y is the smaller tensor; by duplicating its rows, it can expand from (1, 3) to (3, 3).
Apply Element-wise Addition: After both tensors have expanded to the form (3, 3), element-wise addition is applied.
Outcome: The greatest size along each of the X and Y dimensions is represented by the shape of (3, 3) in the result tensor. The appropriate
elements from X and Y are added to create each element in the result tensor.
To summarise, broadcasting makes tensors X and Y compatible for element-wise addition by automatically expanding and replicating
dimensions, enabling a smooth addition operation between them.
Q7: Linear Algebra Operations (1 Point)
Your preview ends here
Eager to read complete document? Join bartleby learn and gain access to the full version
- Access to all documents
- Unlimited textbook solutions
- 24/7 expert homework help