Что значит
if self.transforms:
data = self.transforms(data)
делать? Я не понимаю логики этой строки - какое условие использует линия?
Я читаю статью о создании пользовательского набора данных с помощью pytorch на основе следующей реализации:
#custom dataset
class MNISTDataset(Dataset):
def __init__(self, images, labels=None, transforms=None):
self.X = images
self.y = labels
self.transforms = transforms
def __len__(self):
return (len(self.X))
def __getitem__(self, i):
data = self.X.iloc[i, :]
data = np.asarray(data).astype(np.uint8).reshape(28, 28, 1)
if self.transforms:
data = self.transforms(data)
if self.y is not None:
return (data, self.y[i])
else:
return data
train_data = MNISTDataset(train_images, train_labels, transform)
test_data = MNISTDataset(test_images, test_labels, transform)
# dataloaders
trainloader = DataLoader(train_data, batch_size=128, shuffle=True)
testloader = DataLoader(test_data, batch_size=128, shuffle=True)
Спасибо! я в основном пытаюсь понять, почему это работает и как оно применяется к данным.
Набор данных MNISTDataset
может быть дополнительно инициализирован с помощью функции преобразования. Если задана такая функция преобразования, она будет сохранена в self.transforms
, иначе она сохранит значения по умолчанию None
. При вызове нового элемента с помощью __getitem__
он сначала проверяет, является ли преобразование истинным значением, в этом случае он проверяет, можно ли self.transforms
привести к True
, что имеет место для вызываемого объекта. В противном случае это означает, что self.transforms
не было предоставлено в первую очередь, и к data
не применяется функция преобразования.
Вот общий пример вне контекста torch/torchvision:
def do(x, callback=None):
if callback: # will be True if callback is a function/lambda
return callback(x)
return x
do(2) # returns 2
do(2, callback=lambda x: 2*x) # returns 4
Кроме того, не могли бы вы объяснить, на что ссылается not None в ````, если self.y is not None: return (data, self.y[i]) else: return data ````?
При использовании оператора if
условие приводится (преобразуется) в логическое значение путем вызова функции __bool__
объекта. Большинство объектов в Python переводятся в True
, лишь немногие переводятся в False
(например, False
, None
, []
пустой список...). Вот еще о истинных и ложных ценностях . Лямбды — это анонимные функции, которые ведут себя как объекты-функции. В моем примере я использовал...
...лямбда, чтобы определить выражение f(x)=2*x
, чтобы передать его do
. Потому что нет смысла создавать отдельную функцию снаружи как def callback(x): return 2*x
только для того, чтобы передать ее как do(2, callback=callback)
. Наконец, о if self.y is not None
. То же самое здесь, вы проверяете, что self.y
не является None
, если это так, вы возвращаете только data
, иначе вы возвращаете кортеж, состоящий из data
и self.y[i]
.
извините, забыл ответить! спасибо за такой подробный ответ (-:
это имеет больше смысла, спасибо! Могу я уточнить, что вы подразумеваете под принуждением к правде? как это относится к вызываемой функции? а также, я видел это тонну, но не смог понять, что означает лямда. Спасибо!