我想实现随机汇集 . 我正在使用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:从未调用过图层,因此没有定义的输入形状 .