Ejemplo n.º 1
0
        const tensor_t& model_t::output(const vector_t& input) const
        {
                assert(static_cast<size_t>(input.size()) == isize());

                tensor_t xinput(idims(), irows(), icols());
                xinput.vector() = input;

                return output(xinput);
        }
Ejemplo n.º 2
0
        const tensor_t& pool_layer_t::output(const tensor_t& input)
        {
                assert(idims() == input.dims());
                assert(irows() <= input.rows());
                assert(icols() <= input.cols());

                m_idata = input;

                for (size_t o = 0; o < odims(); o ++)
                {
                        pooling::output(
                                m_idata.matrix(o), m_alpha,
                                m_wdata.matrix(o),
                                m_sdata.matrix(o),
                                m_cdata.matrix(o),
                                m_odata.matrix(o));
                }

                return m_odata;
        }
Ejemplo n.º 3
0
        tensor_t model_t::generate(const vector_t& target) const
        {
                const square_loss_t loss;

                // construct the optimization problem
                const timer_t timer;

                auto fn_size = [&] ()
                {
                        return isize();
                };

                auto fn_fval = [&] (const vector_t& x)
                {
                        const tensor_t output = this->output(x);

                        return loss.value(target, output.vector());
                };

                auto fn_grad = [&] (const vector_t& x, vector_t& gx)
                {
                        const tensor_t output = this->output(x);
                        const vector_t ograd = loss.vgrad(target, output.vector());

                        gx = this->ginput(ograd).vector();

                        return loss.value(target, output.vector());
                };

                auto fn_wlog = [] (const string_t& message)
                {
                        log_warning() << message;
                };
                auto fn_elog = [] (const string_t& message)
                {
                        log_error() << message;
                };
                auto fn_ulog = [&] (const opt_state_t& /*result*/)
                {
//                        log_info() << "[loss = " << result.f
//                                   << ", grad = " << result.g.lpNorm<Eigen::Infinity>()
//                                   << ", funs = " << result.n_fval_calls() << "/" << result.n_grad_calls()
//                                   << "] done in " << timer.elapsed() << ".";

                        return true;
                };

                // assembly optimization problem & optimize the input
                const optim::batch_optimizer optimizer = optim::batch_optimizer::LBFGS;
                const size_t iterations = 256;
                const scalar_t epsilon = 1e-6;

                tensor_t input(idims(), irows(), icols());
                input.setRandom(random_t<scalar_t>(0.0, 1.0));

                const opt_state_t result = ncv::minimize(
                        fn_size, fn_fval, fn_grad, fn_wlog, fn_elog, fn_ulog,
                        input.vector(), optimizer, iterations, epsilon);

                input.vector() = result.x;

                log_info() << "[loss = " << result.f
                           << ", grad = " << result.g.lpNorm<Eigen::Infinity>()
                           << ", funs = " << result.n_fval_calls() << "/" << result.n_grad_calls()
                           << "] done in " << timer.elapsed() << ".";

                // OK
                return input;
        }
Ejemplo n.º 4
0
Array<T> join(const int dim, const std::vector<Array<T>> &inputs)
{
    for (unsigned i=0; i<inputs.size(); ++i)
        inputs[i].eval();
    // All dimensions except join dimension must be equal
    // Compute output dims
    af::dim4 odims;
    const dim_t n_arrays = inputs.size();
    std::vector<af::dim4> idims(n_arrays);

    dim_t dim_size = 0;
    for(unsigned i = 0; i < idims.size(); i++) {
        idims[i] = inputs[i].dims();
        dim_size += idims[i][dim];
    }

    for(int i = 0; i < 4; i++) {
        if(i == dim) {
            odims[i] = dim_size;
        } else {
            odims[i] = idims[0][i];
        }
    }

    Array<T> out = createEmptyArray<T>(odims);

    switch(n_arrays) {
        case 1:
            getQueue().enqueue(kernel::join<T, 1>, dim, out, inputs);
            break;
        case 2:
            getQueue().enqueue(kernel::join<T, 2>, dim, out, inputs);
            break;
        case 3:
            getQueue().enqueue(kernel::join<T, 3>, dim, out, inputs);
            break;
        case 4:
            getQueue().enqueue(kernel::join<T, 4>, dim, out, inputs);
            break;
        case 5:
            getQueue().enqueue(kernel::join<T, 5>, dim, out, inputs);
            break;
        case 6:
            getQueue().enqueue(kernel::join<T, 6>, dim, out, inputs);
            break;
        case 7:
            getQueue().enqueue(kernel::join<T, 7>, dim, out, inputs);
            break;
        case 8:
            getQueue().enqueue(kernel::join<T, 8>, dim, out, inputs);
            break;
        case 9:
            getQueue().enqueue(kernel::join<T, 9>, dim, out, inputs);
            break;
        case 10:
            getQueue().enqueue(kernel::join<T,10>, dim, out, inputs);
            break;
    }

    return out;
}