151 lines
4.2 KiB
Python
Executable file
151 lines
4.2 KiB
Python
Executable file
import numpy as np
|
|
import easynn as nn
|
|
import easynn_golden as golden
|
|
import easynn_cpp as cpp
|
|
import grade
|
|
|
|
|
|
def random_kwargs(kwargs):
|
|
return {k: np.random.random(shape) if shape != None else np.random.random() for k, shape in kwargs.items()}
|
|
|
|
|
|
def is_same(p, n, **kwargs):
|
|
e0 = p.compile(golden.Builder())
|
|
e1 = p.compile(cpp.Builder())
|
|
nkwargs = [random_kwargs(kwargs) for i in range(n)]
|
|
return all([np.allclose(e0(**nkwargs[i]), e1(**nkwargs[i])) for i in range(n)])
|
|
|
|
|
|
def grade_Q1():
|
|
relu = nn.ReLU()
|
|
x = relu(nn.Input("x"))
|
|
return is_same(x, 1, x = (10, 11, 12, 13))
|
|
|
|
|
|
def grade_Q2():
|
|
flatten = nn.Flatten()
|
|
x = flatten(nn.Input("x"))
|
|
return is_same(x, 1, x = (10, 11, 12, 13))
|
|
|
|
|
|
def grade_Q3():
|
|
x = nn.Input2d("images", 10, 11, 3)
|
|
return is_same(x, 1, images = (50, 10, 11, 3))
|
|
|
|
|
|
def grade_Q4():
|
|
f = nn.Linear("f", 100, 10)
|
|
x = f(nn.Input("x"))
|
|
x.resolve({
|
|
"f.weight": np.random.random((10, 100)),
|
|
"f.bias": np.random.random((10,))})
|
|
return is_same(x, 1, x = (50, 100))
|
|
|
|
|
|
def grade_Q5():
|
|
pool = nn.MaxPool2d(3, 3)
|
|
x = pool(nn.Input2d("x", 12, 15, 3))
|
|
return is_same(x, 1, x = (10, 12, 15, 3))
|
|
|
|
|
|
def grade_Q6():
|
|
c = nn.Conv2d("c", 3, 16, 5)
|
|
x = c(nn.Input2d("x", 15, 20, 3))
|
|
x.resolve({
|
|
"c.weight": np.random.random((16, 3, 5, 5)),
|
|
"c.bias": np.random.random((16,))
|
|
})
|
|
return is_same(x, 1, x = (10, 15, 20, 3))
|
|
|
|
|
|
def grade_Q7():
|
|
relu = nn.ReLU()
|
|
flatten = nn.Flatten()
|
|
f1 = nn.Linear("f1", 28*28, 100)
|
|
f2 = nn.Linear("f2", 100, 10)
|
|
x = nn.Input2d("images", 28, 28, 1)
|
|
x = flatten(x)
|
|
x = f2(relu(f1(x)))
|
|
x.resolve(np.load("msimple_params.npz"))
|
|
mnist_test = np.load("mnist_test.npz")
|
|
images = mnist_test["images"][:20]
|
|
|
|
infer0 = x.compile(golden.Builder())
|
|
infer1 = x.compile(cpp.Builder())
|
|
logit0 = infer0(images = images)
|
|
logit1 = infer1(images = images)
|
|
return np.allclose(logit0, logit1)
|
|
|
|
|
|
def grade_Q8():
|
|
relu = nn.ReLU()
|
|
flatten = nn.Flatten()
|
|
f1 = nn.Linear("f1", 28*28, 100)
|
|
f2 = nn.Linear("f2", 100, 10)
|
|
x = nn.Input2d("images", 28, 28, 1)
|
|
x = flatten(x)
|
|
x = f2(relu(f1(x)))
|
|
x.resolve(np.load("msimple_params.npz"))
|
|
mnist_test = np.load("mnist_test.npz")
|
|
images = mnist_test["images"][:1000]
|
|
|
|
infer0 = x.compile(golden.Builder())
|
|
infer1 = x.compile(cpp.Builder())
|
|
label0 = infer0(images = images).argmax(axis = 1)
|
|
label1 = infer1(images = images).argmax(axis = 1)
|
|
return np.allclose(label0, label1)
|
|
|
|
|
|
def grade_Q9():
|
|
pool = nn.MaxPool2d(2, 2)
|
|
relu = nn.ReLU()
|
|
flatten = nn.Flatten()
|
|
|
|
x = nn.Input2d("images", 28, 28, 1)
|
|
c1 = nn.Conv2d("c1", 1, 8, 3) # 28->26
|
|
c2 = nn.Conv2d("c2", 8, 8, 3) # 26->24
|
|
x = pool(relu(c2(relu(c1(x))))) # 24->12
|
|
c3 = nn.Conv2d("c3", 8, 16, 3) # 12->10
|
|
c4 = nn.Conv2d("c4", 16, 16, 3) # 10->8
|
|
x = pool(relu(c4(relu(c3(x))))) # 8->4
|
|
f = nn.Linear("f", 16*4*4, 10)
|
|
x = f(flatten(x))
|
|
|
|
x.resolve(np.load("mnist_params.npz"))
|
|
mnist_test = np.load("mnist_test.npz")
|
|
images = mnist_test["images"][:20]
|
|
|
|
infer0 = x.compile(golden.Builder())
|
|
infer1 = x.compile(cpp.Builder())
|
|
logit0 = infer0(images = images)
|
|
logit1 = infer1(images = images)
|
|
return np.allclose(logit0, logit1)
|
|
|
|
|
|
def grade_Q10():
|
|
pool = nn.MaxPool2d(2, 2)
|
|
relu = nn.ReLU()
|
|
flatten = nn.Flatten()
|
|
|
|
x = nn.Input2d("images", 28, 28, 1)
|
|
c1 = nn.Conv2d("c1", 1, 8, 3) # 28->26
|
|
c2 = nn.Conv2d("c2", 8, 8, 3) # 26->24
|
|
x = pool(relu(c2(relu(c1(x))))) # 24->12
|
|
c3 = nn.Conv2d("c3", 8, 16, 3) # 12->10
|
|
c4 = nn.Conv2d("c4", 16, 16, 3) # 10->8
|
|
x = pool(relu(c4(relu(c3(x))))) # 8->4
|
|
f = nn.Linear("f", 16*4*4, 10)
|
|
x = f(flatten(x))
|
|
|
|
x.resolve(np.load("mnist_params.npz"))
|
|
mnist_test = np.load("mnist_test.npz")
|
|
images = mnist_test["images"][:1000]
|
|
|
|
infer0 = x.compile(golden.Builder())
|
|
infer1 = x.compile(cpp.Builder())
|
|
label0 = infer0(images = images).argmax(axis = 1)
|
|
label1 = infer1(images = images).argmax(axis = 1)
|
|
return np.allclose(label0, label1)
|
|
|
|
|
|
grade.grade_all("p4", 1, 11, globals())
|