How to solve: " ValueError: Not enough dimensions on Elemwise{neg,no_inplace}.0 to reduce on axis 5000 "?

How to solve: " ValueError: Not enough dimensions on Elemwise{neg,no_inplace}.0 to reduce on axis 5000 "?

我正在尝试使用深度学习教程中教授的 CNN 代码 (Convolutional_mlp.py) 对大小为 166x166(Matlab 裁剪)的图像进行分类。输入是一个 .mat 文件,其中 X_2k.mat 用于输入图像像素值,y_2k.mat 用于这些图像的输出标签。目前有 2115 张图像及其标签,我们将它们作为训练数据、测试数据和验证数据提供。我已经将从 .mat 文件中获得的 numpy nd 数组转换为相应数据类型的相应 Tensor 共享变量,即将 X 的 uint8 矩阵转换为 float64 矩阵并转换为 Y 的 int32 向量。(也在代码),以解决在给.mat输入时出现的错误"Cannot convert tensor type (uint8,matrix) into tensor type(float 64,matrix) in case of X "。图像有 3 个 类,0、1 和 2。但需要帮助解决错误:"ValueError: Not enough dimensions on Elemwise{neg,no_inplace}.0 to reduce on axis 5000"

import os
import sys
import timeit
import random
import numpy
import cPickle
import gzip
import scipy.io as sio
from random import shuffle
import theano
from theano.tensor import *
import theano.tensor as T
from theano.tensor.signal import downsample
from theano.tensor.nnet import conv

from logistic_sgd import LogisticRegression, load_data
from mlp import HiddenLayer



class LeNetConvPoolLayer(object):
    """Pool Layer of a convolutional network """

    def __init__(self, rng, input, filter_shape, image_shape, poolsize=(2, 2)):
        """
        Allocate a LeNetConvPoolLayer with shared variable internal parameters.

        :type rng: numpy.random.RandomState
        :param rng: a random number generator used to initialize weights

        :type input: theano.tensor.dtensor4
        :param input: symbolic image tensor, of shape image_shape

        :type filter_shape: tuple or list of length 4
        :param filter_shape: (number of filters, num input feature maps,
                              filter height, filter width) #FILTER IS LOCAL RECEPTIVE FIELD

        :type image_shape: tuple or list of length 4
        :param image_shape: (batch size, num input feature maps,
                             image height, image width)

        :type poolsize: tuple or list of length 2
        :param poolsize: the downsampling (pooling) factor (#rows, #cols)
        """

        assert image_shape[1] == filter_shape[1]
        self.input = input

        # there are "num input feature maps * filter height * filter width"
        # inputs to each hidden unit
        fan_in = numpy.prod(filter_shape[1:])
        # each unit in the lower layer receives a gradient from:
        # "num output feature maps * filter height * filter width" /
        #   pooling size
        fan_out = (filter_shape[0] * numpy.prod(filter_shape[2:]) /
                   numpy.prod(poolsize))
        # initialize weights with random weights
        W_bound = numpy.sqrt(6. / (fan_in + fan_out))
        self.W = theano.shared(
            numpy.asarray(
                rng.uniform(low=-W_bound, high=W_bound, size=filter_shape),
                dtype=theano.config.floatX
            ),
            borrow=True
        )

        # the bias is a 1D tensor -- one bias per output feature map
        b_values = numpy.zeros((filter_shape[0],), dtype=theano.config.floatX)
        self.b = theano.shared(value=b_values, borrow=True)

        # convolve input feature maps with filters
        conv_out = conv.conv2d(
            input=input,
            filters=self.W,
            filter_shape=filter_shape,
            image_shape=image_shape
        )

        # downsample each feature map individually, using maxpooling
        pooled_out = downsample.max_pool_2d(
            input=conv_out,
            ds=poolsize,
            ignore_border=True
        )

        # add the bias term. Since the bias is a vector (1D array), we first
        # reshape it to a tensor of shape (1, n_filters, 1, 1). Each bias will
        # thus be broadcasted across mini-batches and feature map
        # width & height
        self.output = T.tanh(pooled_out + self.b.dimshuffle('x', 0, 'x', 'x'))


        # store parameters of this layer
        self.params = [self.W, self.b]

        # keep track of model input
        self.input = input


def evaluate_lenet5(learning_rate=0.1, n_epochs=200,
                    dataset='mnist.pkl.gz',
                    nkerns=[20, 50], batch_size=500):
    """ Demonstrates lenet on MNIST dataset

    :type learning_rate: float
    :param learning_rate: learning rate used (factor for the stochastic
                          gradient)

    :type n_epochs: int
    :param n_epochs: maximal number of epochs to run the optimizer AKA ITERATIONS

    :type dataset: string
    :param dataset: path to the dataset used for training /testing (MNIST here)

    :type nkerns: list of ints
    :param nkerns: number of kernels on each layer
    """
    matx = sio.loadmat('X_2k.mat')
    datax = matx['X']
    datax=datax.transpose()
    maty = sio.loadmat('y_2k.mat')
    datay = maty['M']           #M was used while creating the y MAT file
    training_data = (datax , datay)
    validation_data = training_data
    test_data = training_data

    train_set_x = training_data[0]
    train_set_y = training_data[1]
    valid_set_x = training_data[0]
    valid_set_y = training_data[1]
    test_set_x = training_data[0]
    test_set_y = training_data[1]
    rng = numpy.random.RandomState(23455)

    print ' type of train_set_x '
    print train_set_x.dtype


    train_set_x=numpy.ndarray.astype(train_set_x,dtype='float64') #converted from uint8 to float64 matrix
    valid_set_x=numpy.ndarray.astype(valid_set_x,dtype='float64')
    test_set_x=numpy.ndarray.astype(test_set_x,dtype='float64')



    train_set_y=numpy.ndarray.astype(train_set_y,dtype='int32') #converted from uint8 to int32 matrix
    valid_set_y=numpy.ndarray.astype(valid_set_y,dtype='int32')
    test_set_y=numpy.ndarray.astype(test_set_y,dtype='int32')
    train_set_y=train_set_y.reshape((-1,))                      #converted from int32 matrix to int32 vector
    valid_set_y=valid_set_y.reshape((-1,))
    test_set_y=test_set_y.reshape((-1,))

    print train_set_x.dtype
    print 'printing for y'
    print train_set_y.dtype
    train_set_xx=theano.shared(train_set_x)
    train_set_yy=theano.shared(train_set_y)

    valid_set_xx=theano.shared(valid_set_x)
    valid_set_yy=theano.shared(valid_set_y)

    test_set_xx=theano.shared(test_set_x)
    test_set_yy=theano.shared(test_set_y)
    '''datasets = load_data(dataset)

    train_set_x, train_set_y = datasets[0]
    valid_set_x, valid_set_y = datasets[1]
    test_set_x, test_set_y = datasets[2]'''

    print training_data
    print 'datax:  '
    print datax
    print 'datay:  '
    print datay
    print '  '
    print 'type of train_set_xx is :'
    print train_set_xx.type

    print 'type of train_set_yy is :'
    print train_set_yy.type
    print '  '

    # compute number of minibatches for training, validation and testing
    n_train_batches = train_set_xx.get_value(borrow=True).shape[0]
    n_valid_batches = valid_set_xx.get_value(borrow=True).shape[0]
    n_test_batches = test_set_xx.get_value(borrow=True).shape[0]
    n_train_batches /= batch_size
    n_valid_batches /= batch_size
    n_test_batches /= batch_size

    # allocate symbolic variables for the data
    index = T.lscalar()  # index to a [mini]batch

    # start-snippet-1
    x = T.matrix('x')   # the data is presented as rasterized images
    y = T.ivector('y')  # the labels are presented as 1D vector of
                        # [int] labels
    print 'type of x is:'
    print x.type
    print 'type of y is :'
    print y.type


    ######################
    # BUILD ACTUAL MODEL #
    ######################
    print '... building the model'

    # Reshape matrix of rasterized images of shape (batch_size, 28 * 28)
    # to a 4D tensor, compatible with our LeNetConvPoolLayer
    # (28, 28) is the size of MNIST images.
    layer0_input = x.reshape((batch_size, 1, 166, 166))
    print ' LAYER 0 INPUT IS:'
    print layer0_input

    # Construct the first convolutional pooling layer:
    # filtering reduces the image size to (28-5+1 , 28-5+1) = (24, 24)
    # maxpooling reduces this further to (24/2, 24/2) = (12, 12)
    # 4D output tensor is thus of shape (batch_size, nkerns[0], 12, 12)
    layer0 = LeNetConvPoolLayer(
        rng,
        input=layer0_input,
        image_shape=(batch_size, 1, 166, 166),
        filter_shape=(nkerns[0], 1, 11, 11),
        poolsize=(2, 2)
    )

    # Construct the second convolutional pooling layer
    # filtering reduces the image size to (12-5+1, 12-5+1) = (8, 8)
    # maxpooling reduces this further to (8/2, 8/2) = (4, 4)
    # 4D output tensor is thus of shape (batch_size, nkerns[1], 4, 4)
    layer1 = LeNetConvPoolLayer(
        rng,
        input=layer0.output,
        image_shape=(batch_size, nkerns[0], 78, 78),
        filter_shape=(nkerns[1], nkerns[0], 11, 11),
        poolsize=(2, 2)
    )

    # the HiddenLayer being fully-connected, it operates on 2D matrices of
    # shape (batch_size, num_pixels) (i.e matrix of rasterized images).
    # This will generate a matrix of shape (batch_size, nkerns[1] * 4 * 4),
    # or (500, 50 * 4 * 4) = (500, 800) with the default values.
    layer2_input = layer1.output.flatten(2)

    # construct a fully-connected sigmoidal layer
    layer2 = HiddenLayer(
        rng,
        input=layer2_input,
        n_in=nkerns[1] * 34 * 34,
        n_out=500,
        activation=T.tanh
    )

    # classify the values of the fully-connected sigmoidal layer
    layer3 = LogisticRegression(input=layer2.output, n_in=500, n_out=3)

    # the cost we minimize during training is the NLL of the model
    cost = layer3.negative_log_likelihood(y)

    # create a function to compute the mistakes that are made by the model
    test_model = theano.function(
        [index],
        layer3.errors(y),
        givens={
            x: test_set_xx[index * batch_size: (index + 1) * batch_size],
            y: test_set_yy[index * batch_size: (index + 1) * batch_size]
        }
    )
#type of x is float64,matrix
    validate_model = theano.function(
        [index],
        layer3.errors(y),
        givens={
            x: valid_set_xx[index * batch_size: (index + 1) * batch_size],
            y: valid_set_yy[index * batch_size: (index + 1) * batch_size]
        }
    )

    # create a list of all model parameters to be fit by gradient descent
    params = layer3.params + layer2.params + layer1.params + layer0.params

    # create a list of gradients for all model parameters
    grads = T.grad(cost, params)

    # train_model is a function that updates the model parameters by
    # SGD Since this model has many parameters, it would be tedious to
    # manually create an update rule for each model parameter. We thus
    # create the updates list by automatically looping over all
    # (params[i], grads[i]) pairs.
    updates = [
        (param_i, param_i - learning_rate * grad_i)
        for param_i, grad_i in zip(params, grads)
    ]

    train_model = theano.function(
        [index],
        cost,
        updates=updates,
        givens={
            x: train_set_xx[index * batch_size: (index + 1) * batch_size],
            y: train_set_yy[index * batch_size: (index + 1) * batch_size]
        }
    )
    # end-snippet-1

    ###############
    # TRAIN MODEL #
    ###############
    print '... training'
    # early-stopping parameters
    patience = 10000  # look as this many examples regardless
    patience_increase = 2  # wait this much longer when a new best is
                           # found
    improvement_threshold = 0.995  # a relative improvement of this much is
                                   # considered significant
    validation_frequency = min(n_train_batches, patience / 2)  #Error on this Line !!!!
                                  # go through this many
                                  # minibatche before checking the network
                                  # on the validation set; in this case we
                                  # check every epoch

    best_validation_loss = numpy.inf
    best_iter = 0
    test_score = 0.
    start_time = timeit.default_timer()

    epoch = 0
    done_looping = False

    while (epoch < n_epochs) and (not done_looping):
        epoch = epoch + 1
        for minibatch_index in xrange(n_train_batches):

            iter = (epoch - 1) * n_train_batches + minibatch_index

            if iter % 100 == 0:
                print 'training @ iter = ', iter
            cost_ij = train_model(minibatch_index)

            if (iter + 1) % validation_frequency == 0:

                # compute zero-one loss on validation set
                validation_losses = [validate_model(i) for i
                                     in xrange(n_valid_batches)]
                this_validation_loss = numpy.mean(validation_losses)
                print('epoch %i, minibatch %i/%i, validation error %f %%' %
                      (epoch, minibatch_index + 1, n_train_batches,
                       this_validation_loss * 100.))

                # if we got the best validation score until now
                if this_validation_loss < best_validation_loss:

                    #improve patience if loss improvement is good enough
                    if this_validation_loss < best_validation_loss *  \
                       improvement_threshold:
                        patience = max(patience, iter * patience_increase)

                    # save best validation score and iteration number
                    best_validation_loss = this_validation_loss
                    best_iter = iter

                    # test it on the test set
                    test_losses = [
                        test_model(i)
                        for i in xrange(n_test_batches)
                    ]
                    test_score = numpy.mean(test_losses)
                    print(('     epoch %i, minibatch %i/%i, test error of '
                           'best model %f %%') %
                          (epoch, minibatch_index + 1, n_train_batches,
                           test_score * 100.))

            if patience <= iter:
                done_looping = True
                break

    end_time = timeit.default_timer()
    print('Optimization complete.')
    print('Best validation score of %f %% obtained at iteration %i, '
          'with test performance %f %%' %
          (best_validation_loss * 100., best_iter + 1, test_score * 100.))
    print >> sys.stderr, ('The code for file ' +
                          os.path.split(__file__)[1] +
                          ' ran for %.2fm' % ((end_time - start_time) / 60.))

if __name__ == '__main__':
    evaluate_lenet5()


def experiment(state, channel):
    evaluate_lenet5(state.learning_rate, dataset=state.dataset)

输出:

sweta@sweta-HP-Pavilion-15-Notebook-PC:~//Deep_nn$ python convolutional_mlp.py optimizer=fast_compile exception_verbosity=high

 type of train_set_x 

uint8

float64

printing for y

int32
(array([[164, 164, 164, ..., 164, 164,   0],
       [164, 164, 164, ..., 156, 164,   0],
       [164, 164, 164, ..., 164, 164,   0],
       ..., 
       [164,  92,  82, ..., 247, 247,   0],
       [156, 156,  82, ..., 247, 247,   0],
       [164, 156,  82, ..., 247, 247,   0]], dtype=uint8), array([[1],
       [1],
       [1],
       ..., 
       [0],
       [0],
       [0]], dtype=uint8))
datax:  

[[164 164 164 ..., 164 164   0]
 [164 164 164 ..., 156 164   0]
 [164 164 164 ..., 164 164   0]
 ..., 
 [164  92  82 ..., 247 247   0]
 [156 156  82 ..., 247 247   0]
 [164 156  82 ..., 247 247   0]]
datay:  
[[1]
 [1]
 [1]
 ..., 
 [0]
 [0]
 [0]]


type of train_set_xx is :

TensorType(float64, matrix)

type of train_set_yy is :

TensorType(int32, vector)


type of x is:

TensorType(float64, matrix)

type of y is :

TensorType(int32, vector)


... building the model

 LAYER 0 INPUT IS:

Reshape{4}.0

... training




Traceback (most recent call last):

  File "convolutional_mlp.py", line 410, in <module>
    evaluate_lenet5()

  File "convolutional_mlp.py", line 339, in evaluate_lenet5
    validation_frequency = min(n_train_batches, patience / 2)

  File "/usr/local/lib/python2.7/dist-packages/theano/tensor/basic.py", line 1582, in min
    return -max(-x, axis=axis, keepdims=keepdims)

  File "/usr/local/lib/python2.7/dist-packages/theano/tensor/basic.py", line 1537, in max
    out = CAReduce(scal.maximum, axis)(x)

  File "/usr/local/lib/python2.7/dist-packages/theano/gof/op.py", line 507, in __call__
    node = self.make_node(*inputs, **kwargs)

  File "/usr/local/lib/python2.7/dist-packages/theano/tensor/elemwise.py", line 1314, in make_node
    % (input, axis)))


ValueError: Not enough dimensions on Elemwise{neg,no_inplace}.0 to reduce on axis 5000

有一个名为 ,'min' 的内置函数正在被覆盖,因为您已经从张量中导入了所有内容。在第 339 行,尝试使用 __ builtin__ .min 作为函数调用。