array vec2array(double_vec& vec) { npy_intp n = static_cast<npy_intp>( vec.size() ); PYCPPAD_ASSERT( n >= 0 , ""); object obj(handle<>( PyArray_SimpleNew(1, &n, NPY_DOUBLE) )); double *ptr = static_cast<double*> ( PyArray_DATA ( reinterpret_cast<PyArrayObject*> ( obj.ptr() ) )); for(size_t i = 0; i < vec.size(); i++){ ptr[i] = vec[i]; } return static_cast<array>( obj ); }
bool ann::get_output(double_vec& output) { uint output_layer = m_layer_layout.size() - 1; if (output.size() != m_layer_layout[output_layer]) return false; layer_offset& last_layer = m_layer_offsets[output_layer]; uint outpuc_off = last_layer.second; for (size_t i = 0; i < output.size(); i++) { output[i] = m_outputs[outpuc_off]; outpuc_off++; } return true; }
// net output error double ann::e_error(double_vec tk, double_vec ok) { double err = 0; for (size_t i = 0; i < tk.size(); i++) err += pow(tk[i] - ok[i], 2); return err / 2; }
bool ann::calculate(const double_vec& input) { if (input.size() != m_layer_layout[0]) return false; for (size_t i = 0; i < input.size(); i++) m_outputs[i] = sigma(input[i]); for (size_t curr_layer = 1; curr_layer < m_layer_layout.size(); curr_layer++) { layer_offset& p_off = m_layer_offsets[curr_layer - 1]; layer_offset& c_off = m_layer_offsets[curr_layer]; uint t_weighc_off = c_off.first; uint t_outpuc_off = c_off.second; for (uint t_node = 0; t_node < m_layer_layout[curr_layer]; t_node++) { uint p_outpuc_off = p_off.second; double sum = 0; uint node_num = m_layer_layout[curr_layer - 1] + m_bias; for (uint p_node = 0; p_node < node_num; p_node++) { sum += m_outputs[p_outpuc_off] * m_weights[t_weighc_off]; p_outpuc_off++; t_weighc_off++; } m_outputs[t_outpuc_off] = sigma(sum); t_outpuc_off++; } } return true; }