Experiment with recursive super-resolution and weight reuse, mixed results.
This commit is contained in:
+34
-9
@@ -85,6 +85,8 @@ def warn(message, *lines):
|
|||||||
string = "\n{}WARNING: " + message + "{}\n" + "\n".join(lines) + "{}\n"
|
string = "\n{}WARNING: " + message + "{}\n" + "\n".join(lines) + "{}\n"
|
||||||
print(string.format(ansi.YELLOW_B, ansi.YELLOW, ansi.ENDC))
|
print(string.format(ansi.YELLOW_B, ansi.YELLOW, ansi.ENDC))
|
||||||
|
|
||||||
|
def extend(lst): return itertools.chain(lst, itertools.repeat(lst[-1]))
|
||||||
|
|
||||||
print("""{} {}Super Resolution for images and videos powered by Deep Learning!{}
|
print("""{} {}Super Resolution for images and videos powered by Deep Learning!{}
|
||||||
- Code licensed as AGPLv3, models under CC BY-NC-SA.{}""".format(ansi.CYAN_B, __doc__, ansi.CYAN, ansi.ENDC))
|
- Code licensed as AGPLv3, models under CC BY-NC-SA.{}""".format(ansi.CYAN_B, __doc__, ansi.CYAN, ansi.ENDC))
|
||||||
|
|
||||||
@@ -231,8 +233,23 @@ class Model(object):
|
|||||||
return list(self.network.values())[-1]
|
return list(self.network.values())[-1]
|
||||||
|
|
||||||
def make_layer(self, name, input, units, filter_size=(3,3), stride=(1,1), pad=(1,1), alpha=0.25):
|
def make_layer(self, name, input, units, filter_size=(3,3), stride=(1,1), pad=(1,1), alpha=0.25):
|
||||||
conv = ConvLayer(input, units, filter_size=filter_size, stride=stride, pad=pad, nonlinearity=None)
|
orig = '1.'+''.join(name.split('.')[1:])
|
||||||
prelu = lasagne.layers.ParametricRectifierLayer(conv, alpha=lasagne.init.Constant(alpha))
|
if orig+'x' in self.network:
|
||||||
|
print('reused', orig, 'for', name)
|
||||||
|
l = self.network[orig +'x']
|
||||||
|
extra = {'W': l.W, 'b': l.b}
|
||||||
|
else:
|
||||||
|
extra = {}
|
||||||
|
|
||||||
|
conv = ConvLayer(input, units, filter_size=filter_size, stride=stride, pad=pad, nonlinearity=None, **extra)
|
||||||
|
|
||||||
|
alpha = lasagne.init.Constant(alpha)
|
||||||
|
if orig +'>' in self.network:
|
||||||
|
l = self.network[orig +'>']
|
||||||
|
alpha = l.alpha
|
||||||
|
|
||||||
|
prelu = lasagne.layers.ParametricRectifierLayer(conv, alpha=alpha)
|
||||||
|
|
||||||
self.network[name+'x'] = conv
|
self.network[name+'x'] = conv
|
||||||
self.network[name+'>'] = prelu
|
self.network[name+'>'] = prelu
|
||||||
return prelu
|
return prelu
|
||||||
@@ -244,17 +261,25 @@ class Model(object):
|
|||||||
|
|
||||||
def setup_generator(self, input, config):
|
def setup_generator(self, input, config):
|
||||||
for k, v in config.items(): setattr(args, k, v)
|
for k, v in config.items(): setattr(args, k, v)
|
||||||
units = args.generator_filters
|
units_iter = extend(args.generator_filters)
|
||||||
self.make_layer('iter.0', input, units, filter_size=(5,5), pad=(2,2))
|
units = next(units_iter)
|
||||||
|
self.make_layer('iter.0-A', input, units, filter_size=(5,5), pad=(2,2))
|
||||||
|
self.make_layer('iter.0-B', self.last_layer(), units, filter_size=(5,5), pad=(2,2))
|
||||||
|
self.network['iter.0'] = self.last_layer()
|
||||||
|
|
||||||
for i in range(0, args.generator_blocks):
|
for i in range(0, args.generator_iters):
|
||||||
self.network['iter.%i'%(i+1)] = self.make_block('iter.%i'%(i+1), self.last_layer(), units)
|
base = self.last_layer()
|
||||||
|
for j in range(0, args.generator_blocks):
|
||||||
|
self.make_block('%i.iter-%i'%(i+1, j), self.last_layer(), units)
|
||||||
|
print('iter.%i-%i'%(i+1, j))
|
||||||
|
# self.network['iter.%i'%(i+1)] = DropPathLayer([base, self.last_layer()])
|
||||||
|
|
||||||
for i in range(args.scales, 0, -1):
|
for i in range(0, args.scales):
|
||||||
u = units // 2**(args.scales-i)
|
u = next(units_iter)
|
||||||
self.make_layer('scale%i.3'%i, self.last_layer(), u*4)
|
self.make_layer('scale%i.3'%i, self.last_layer(), u*4)
|
||||||
self.network['scale%i.2'%i] = SubpixelReshuffleLayer(self.last_layer(), u, 2)
|
self.network['scale%i.2'%i] = SubpixelReshuffleLayer(self.last_layer(), u, 2)
|
||||||
self.make_layer('scale%i.1'%i, self.network['scale%i.2'%i], u)
|
self.make_layer('scale%i.1'%i, self.last_layer(), u)
|
||||||
|
|
||||||
|
|
||||||
self.network['out'] = ConvLayer(self.last_layer(), 3, filter_size=(5,5), stride=(1,1), pad=(2,2),
|
self.network['out'] = ConvLayer(self.last_layer(), 3, filter_size=(5,5), stride=(1,1), pad=(2,2),
|
||||||
nonlinearity=lasagne.nonlinearities.tanh)
|
nonlinearity=lasagne.nonlinearities.tanh)
|
||||||
|
|||||||
Reference in New Issue
Block a user