Das mit dem (Un-)Supervised Learning schauen wir uns nun in einem sehr einfachen Beispiel an und fragen uns
Wieviele Bits kann ein einziges Neuron eigentlich speichern?
Wir betrachten also die Rekonstruktionen \(\hat y_i\) des Neuron gegeben durch \(f_\omega(x) := w^T\cdot x\) mit Parameter \(\omega\) und Aktivierungsfunktion \(a\): \[ \hat y_i := a\left(f_\omega\left(x_i\right)\right),\qquad a(x) = \left\{\begin{matrix} 1 & x>0\\ 0 & x ≤ 0\end{matrix}\right. \]
Es sei nun \(T(N,K)\) die Anzahl verschiedener Funktionen \(f_\omega\), um eine beliebige aber feste Menge von \(N\) Punkte in \(K\) Dimensionen auf je eine Ausgabe \(\{0,1\}\) abzubilden. (Alle Punkte seien dabei in allgemeiner Lage. Im Prinzip gehen wir so davon aus, dass keine zwei Punkte gleichzeitig auf der so definierten Null-Ebene von \(f_\omega\) liegen).)
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/luke/views/View.py", line 315, in handle_dict
return "{}".format(self.translator[mytype](adict, scopes))
File "/usr/local/lib/python3.8/site-packages/luke/views/View.py", line 81, in translate_x_with_scope
return translate_x(self, x, scopes, var, run)
File "/usr/local/lib/python3.8/site-packages/luke/views/View.py", line 550, in translate_tikz
output = subprocess.check_output(
File "/usr/local/lib/python3.8/subprocess.py", line 411, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "/usr/local/lib/python3.8/subprocess.py", line 489, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/local/lib/python3.8/subprocess.py", line 854, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/local/lib/python3.8/subprocess.py", line 1702, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'pdflatex'
Wir drehen die Aufgabe nun um: Wir starten mit dem Skalarprodukt auf einem gegebenen Datensatz, dass diesen möglichst "optimal" löst. Das Ziel ist nun zu bestimmen, wieviele Bits dieses Skalarprodukt in der Praxis tatsächlich speichert bzw. rekonstruieren kann.
Dazu schaun wir uns den Datensatz CIFAR-10 an: Der Datensatz besteht aus 10 Klassen (airplane
, automobile
, bird
, cat
, deer
, dog
, frog
, horse
, ship
, truck
) zu je \(12.000\) Farb-Bildern, wiederum jeweils bestehend aus \(32\cdot 32\) Pixeln.
import matplotlib.pyplot as plt
import numpy as np
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
batch_size = 64 # number of images to get for every iteration of trainloader
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=2)
classes = ('class-%i' % i for i in range(10))
# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()
# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(batch_size)))
sklearn
.svm = LinearSVC(dual=False, max_iter=25)
svm.fit(traindata.reshape((num_examples,-1)), trainlabels)
trainlabels_reconstruct = svm.predict(traindata.reshape((num_examples,-1)))
# übrigens: das Gewicht w können Sie per svm.coeff_ einsehen.
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor())
traindata = trainset.train_data.numpy()
trainlabels = trainset.test_labels.numpy()
4
und 7
.predict
wie oben angegeben, und Zählen Sie wieviele Punkte (des Trainingssets!) korrekt auswendig gelernt wurden.