Skip to content

Commit 7c1ab3c

Browse files
committed
upload deep dream
1 parent 09bcf1a commit 7c1ab3c

File tree

9 files changed

+445
-0
lines changed

9 files changed

+445
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Deep-Dream
2+
PyTorch implement of Google Deep Dream
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import numpy as np
2+
import torch
3+
from util import showtensor
4+
import scipy.ndimage as nd
5+
from torch.autograd import Variable
6+
7+
8+
def objective_L2(dst, guide_features):
9+
return dst.data
10+
11+
12+
def make_step(img, model, control=None, distance=objective_L2):
13+
mean = np.array([0.485, 0.456, 0.406]).reshape([3, 1, 1])
14+
std = np.array([0.229, 0.224, 0.225]).reshape([3, 1, 1])
15+
16+
learning_rate = 2e-2
17+
max_jitter = 32
18+
num_iterations = 20
19+
show_every = 10
20+
end_layer = 3
21+
guide_features = control
22+
23+
for i in range(num_iterations):
24+
shift_x, shift_y = np.random.randint(-max_jitter, max_jitter + 1, 2)
25+
img = np.roll(np.roll(img, shift_x, -1), shift_y, -2)
26+
# apply jitter shift
27+
model.zero_grad()
28+
img_tensor = torch.Tensor(img)
29+
if torch.cuda.is_available():
30+
img_variable = Variable(img_tensor.cuda(), requires_grad=True)
31+
else:
32+
img_variable = Variable(img_tensor, requires_grad=True)
33+
34+
act_value = model.forward(img_variable, end_layer)
35+
diff_out = distance(act_value, guide_features)
36+
act_value.backward(diff_out)
37+
ratio = np.abs(img_variable.grad.data.cpu().numpy()).mean()
38+
learning_rate_use = learning_rate / ratio
39+
img_variable.data.add_(img_variable.grad.data * learning_rate_use)
40+
img = img_variable.data.cpu().numpy() # b, c, h, w
41+
img = np.roll(np.roll(img, -shift_x, -1), -shift_y, -2)
42+
img[0, :, :, :] = np.clip(img[0, :, :, :], -mean / std,
43+
(1 - mean) / std)
44+
if i == 0 or (i + 1) % show_every == 0:
45+
showtensor(img)
46+
return img
47+
48+
49+
def dream(model,
50+
base_img,
51+
octave_n=6,
52+
octave_scale=1.4,
53+
control=None,
54+
distance=objective_L2):
55+
octaves = [base_img]
56+
for i in range(octave_n - 1):
57+
octaves.append(
58+
nd.zoom(
59+
octaves[-1], (1, 1, 1.0 / octave_scale, 1.0 / octave_scale),
60+
order=1))
61+
62+
detail = np.zeros_like(octaves[-1])
63+
for octave, octave_base in enumerate(octaves[::-1]):
64+
h, w = octave_base.shape[-2:]
65+
if octave > 0:
66+
h1, w1 = detail.shape[-2:]
67+
detail = nd.zoom(
68+
detail, (1, 1, 1.0 * h / h1, 1.0 * w / w1), order=1)
69+
70+
input_oct = octave_base + detail
71+
print(input_oct.shape)
72+
out = make_step(input_oct, model, control, distance=distance)
73+
detail = out - octave_base
20.7 KB
Loading
463 KB
Loading
20.9 KB
Loading
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
__author__ = 'SherlockLiao'
2+
3+
import torch
4+
from torch import nn
5+
from torchvision import models
6+
import torch.utils.model_zoo as model_zoo
7+
8+
9+
model_urls = {
10+
'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth',
11+
'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth',
12+
'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth',
13+
'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth',
14+
'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',
15+
}
16+
17+
18+
class Bottleneck(nn.Module):
19+
expansion = 4
20+
21+
def __init__(self, inplanes, planes, stride=1, downsample=None):
22+
super(Bottleneck, self).__init__()
23+
self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
24+
self.bn1 = nn.BatchNorm2d(planes)
25+
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
26+
padding=1, bias=False)
27+
self.bn2 = nn.BatchNorm2d(planes)
28+
self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)
29+
self.bn3 = nn.BatchNorm2d(planes * 4)
30+
self.relu = nn.ReLU(inplace=True)
31+
self.downsample = downsample
32+
self.stride = stride
33+
34+
def forward(self, x):
35+
residual = x
36+
37+
out = self.conv1(x)
38+
out = self.bn1(out)
39+
out = self.relu(out)
40+
41+
out = self.conv2(out)
42+
out = self.bn2(out)
43+
out = self.relu(out)
44+
45+
out = self.conv3(out)
46+
out = self.bn3(out)
47+
48+
if self.downsample is not None:
49+
residual = self.downsample(x)
50+
51+
out += residual
52+
out = self.relu(out)
53+
54+
return out
55+
56+
57+
class CustomResNet(models.resnet.ResNet):
58+
def forward(self, x, end_layer):
59+
"""
60+
end_layer range from 1 to 4
61+
"""
62+
x = self.conv1(x)
63+
x = self.bn1(x)
64+
x = self.relu(x)
65+
x = self.maxpool(x)
66+
67+
layers = [self.layer1, self.layer2, self.layer3, self.layer4]
68+
for i in range(end_layer):
69+
x = layers[i](x)
70+
return x
71+
72+
73+
def resnet50(pretrained=False, **kwargs):
74+
model = CustomResNet(Bottleneck, [3, 4, 6, 3], **kwargs)
75+
if pretrained:
76+
model.load_state_dict(model_zoo.load_url(model_urls['resnet50']))
77+
return model

chapter8_Application/Deep-Dream/show_image.ipynb

Lines changed: 271 additions & 0 deletions
Large diffs are not rendered by default.
145 KB
Loading
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import PIL.Image
2+
from io import BytesIO
3+
from IPython.display import clear_output, Image, display
4+
import numpy as np
5+
6+
7+
def showarray(a, fmt='jpeg'):
8+
a = np.uint8(np.clip(a, 0, 255))
9+
f = BytesIO()
10+
PIL.Image.fromarray(a).save(f, fmt)
11+
display(Image(data=f.getvalue()))
12+
13+
14+
def showtensor(a):
15+
mean = np.array([0.485, 0.456, 0.406]).reshape([1, 1, 3])
16+
std = np.array([0.229, 0.224, 0.225]).reshape([1, 1, 3])
17+
inp = a[0, :, :, :]
18+
inp = inp.transpose(1, 2, 0)
19+
inp = std * inp + mean
20+
inp *= 255
21+
showarray(inp)
22+
clear_output(wait=True)

0 commit comments

Comments
 (0)