# 思想描述

## 知识铺垫

### Transposed convolution and sub-pixel convolution layers

上图左面是一个转置卷积（stride为2），右面是sub-pixel convolution（stride为1/2），作用在1D上。

## 实现代码（摘自Deepfake-keras实现版本）

```class PixelShuffler(Layer):
def __init__(self, size=(2, 2), data_format=None, **kwargs):
super(PixelShuffler, self).__init__(**kwargs)
self.data_format = conv_utils.normalize_data_format(data_format)
self.size = conv_utils.normalize_tuple(size, 2, 'size')  # (2,2)

def call(self, inputs):

input_shape = K.int_shape(inputs)
if len(input_shape) != 4:
raise ValueError('Inputs should have rank ' +
str(4) +

if self.data_format == 'channels_first':
batch_size, c, h, w = input_shape
if batch_size is None:
batch_size = -1
rh, rw = self.size
oh, ow = h * rh, w * rw
oc = c // (rh * rw)

out = K.reshape(inputs, (batch_size, rh, rw, oc, h, w))
out = K.permute_dimensions(out, (0, 3, 4, 1, 5, 2))
out = K.reshape(out, (batch_size, oc, oh, ow))
return out

elif self.data_format == 'channels_last':
batch_size, h, w, c = input_shape
if batch_size is None:
batch_size = -1
rh, rw = self.size
oh, ow = h * rh, w * rw
oc = c // (rh * rw)

out = K.reshape(inputs, (batch_size, h, w, rh, rw, oc))
out = K.permute_dimensions(out, (0, 1, 3, 2, 4, 5))
out = K.reshape(out, (batch_size, oh, ow, oc))
return out

def compute_output_shape(self, input_shape):

if len(input_shape) != 4:
raise ValueError('Inputs should have rank ' +
str(4) +

if self.data_format == 'channels_first':
height = input_shape[2] * self.size[0] if input_shape[2] is not None else None
width = input_shape[3] * self.size[1] if input_shape[3] is not None else None
channels = input_shape[1] // self.size[0] // self.size[1]

if channels * self.size[0] * self.size[1] != input_shape[1]:
raise ValueError('channels of input and size are incompatible')

return (input_shape[0],
channels,
height,
width)

elif self.data_format == 'channels_last':
height = input_shape[1] * self.size[0] if input_shape[1] is not None else None
width = input_shape[2] * self.size[1] if input_shape[2] is not None else None
channels = input_shape[3] // self.size[0] // self.size[1]

if channels * self.size[0] * self.size[1] != input_shape[3]:
raise ValueError('channels of input and size are incompatible')

return (input_shape[0],
height,
width,
channels)```

0 条评论

• ### 我的模型能跑多快——神经网络模型速度调研(一)

对于神经网络，我们更多谈的是其精度怎么样，有百分之零点几的提升。但是如果谈到速度的话，深度学习神经网络相比于传统的算法来说，速度恐怕没有那么快了。

在使用Keras的时候会遇到这样的代码x = Conv2D(filters, kernel_size=5, strides=2, padding='same')...

• ### 先读懂CapsNet架构然后用TensorFlow实现：全面解析Hinton提出的Capsule

本文转载于：https://www.jiqizhixin.com/articles/2017-11-05。如有侵权请告知。

• ### Qt开源作品29-NTP服务器时间同步

很多软件都有时间同步的功能，尤其是Qt在嵌入式设备上的，有时候还有很多是没有UI界面的程序，而硬件上有个时钟，时间久了难免没有电，需要从服务器来同步时间来保证本...

在使用Keras的时候会遇到这样的代码x = Conv2D(filters, kernel_size=5, strides=2, padding='same')...

• ### JAVA_WEB--jsp概述

JSP处理过程 就像其他普通的网页一样，您的浏览器发送一个HTTP请求给服务器。 Web服务器识别出这是一个对JSP网页的请求，并且将该请求传递给JSP引擎...

• ### 某公司自然语言处理算法笔试题

1 请列出几种文本特征提取算法 答：文档频率、信息增益、互信息、X^2统计、TF-IDF 2 简述几种自然语言处理开源工具包 答：LingPipe、FudanN...

• ### 前端面试题

· 3.优化CSS（压缩合并css，如margin-top,margin-left…)