我想实现随机汇集 . 我正在使用Keras和theano后端 . 我有
import theano.tensor as T
from ..engine import Layer
from ..utils import conv_utils
class StochasticPool2DLayer(Layer):
def __init__(self, pool_size=2, maxpool=True, grid_size=None, **kwargs):
super(StochasticPool2DLayer, self).__init__(**kwargs)
self.rng = T.shared_randomstreams.RandomStreams(123)
self.pool_size = pool_size
self.maxpool = maxpool
if grid_size:
self.grid_size = grid_size
else:
self.grid_size = pool_size
def compute_output_shape(self, input_shape):
"""return (input_shape[0], input_shape[1],
input_shape[2]/self.pool_size, input_shape[3]/self.pool_size)"""
length = conv_utils.conv_output_length(input_shape[1],
self.pool_size[0],
self.padding,
self.strides[0])
return (input_shape[0], length, input_shape[2])
def call(self, input, deterministic=False, **kwargs):
# return input[:, :, ::self.pool_size, ::self.pool_size]
w, h = self.input_shape[2:]
n_w, n_h = w / self.grid_size, h / self.grid_size
n_sample_per_grid = self.grid_size / self.pool_size
idx_w = []
idx_h = []
for i in range(n_w):
offset = self.grid_size * i
if i < n_w - 1:
this_n = self.grid_size
else:
this_n = input.shape[2] - offset
this_idx = T.sort(self.rng.permutation(size=(1,), n=this_n)[0, :n_sample_per_grid])
idx_w.append(offset + this_idx)
for i in range(n_h):
offset = self.grid_size * i
if i < n_h - 1:
this_n = self.grid_size
else:
this_n = input.shape[3] - offset
this_idx = T.sort(self.rng.permutation(size=(1,), n=this_n)[0, :n_sample_per_grid])
idx_h.append(offset + this_idx)
idx_w = T.concatenate(idx_w, axis=0)
idx_h = T.concatenate(idx_h, axis=0)
output = input[:, :, idx_w][:, :, :, idx_h]
return output
def get_config(self):
config = {'maxpool': self.maxpool,
'pool_size': self.pool_size,
'grid_size': self.grid_size}
base_config = super(StochasticPool2DLayer, self).get_config()
return dict(list(base_config.items()) + list(config.items()))
但它会出现以下错误
classifier.add中的文件“”,第16行(StochasticPool2DLayer(pool_size =(2,2)))
文件“C:\ Users \ aiza \ Anaconda3 \ envs \ py2 \ lib \ site-packages \ keras \ models.py”,第455行,添加output_tensor = layer(self.outputs [0])
文件"C:\Users\aiza\Anaconda3\envs\py2\lib\site-packages\keras\engine\topology.py",第554行,在 call output = self.call(inputs,** kwargs)
文件“C:\ Users \ aiza \ Anaconda3 \ envs \ py2 \ lib \ site-packages \ keras \ layers \ Stochasticpooling.py”,第38行,在调用w中,h = self.input_shape [2:]
文件“C:\ Users \ aiza \ Anaconda3 \ envs \ py2 \ lib \ site-packages \ keras \ engine \ topology.py”,第961行,在input_shape中引发AttributeError('该图层从未被调用过'
AttributeError:从未调用过图层,因此没有定义的输入形状 .