void Serializer::visit(ops::FullyConnectedOp& op) {
_curOp->_paramStartOffset = _buffer.size();
- serializeTensor(transposeTensor<1, 0>(op.getWeights()));
+ serializeTensor(op.getWeights());
serializeShape(op.getOutputShape(0));
}
==============================================================================*/
inline void FullyConnected(const float* input_data, const Dims<4>& input_dims,
- const float* weights_data,
- const Dims<4>& weights_dims,
+ const float* weights_data, const Dims<4>& weights_dims,
float* output_data, const Dims<4>& output_dims) {
- const int input_rows = ArraySize(weights_dims, 0);
const auto input_matrix_map =
- MapAsMatrixWithGivenNumberOfRows(input_data, input_dims, input_rows);
+ MapAsMatrixWithFirstDimAsRows(input_data, input_dims);
const auto filter_matrix_map =
MapAsMatrixWithFirstDimAsRows(weights_data, weights_dims);
auto output_matrix_map =
MapAsMatrixWithFirstDimAsRows(output_data, output_dims);
- Gemm(filter_matrix_map.transpose(), input_matrix_map, &output_matrix_map);
+ Gemm(filter_matrix_map, input_matrix_map, &output_matrix_map);
}
}
TEST(cpp_operations_test, fully_connected) {
- vector<int> input_shape_data{1, 13};
- mir::Shape weightsShape{13, 7};
+ vector<int> input_shape_data{3, 13};
+ mir::Shape weights_shape{13, 7};
vector<unique_ptr<mir::TensorVariant>> input_ntensors(1);
Tensor input_atensor;
fillTensors(input_ntensors[0], input_atensor, input_shape_data, 1.0f);
- mir::TensorVariant weights = createNTensor(weightsShape, 1.0f);
+ mir::TensorVariant weights = createNTensor(weights_shape, 1.0f);
auto op_generator = [weights](mir::Graph& g, const std::vector<mir::IODescriptor>& inputs) {
return g.create<mir::ops::FullyConnectedOp>("y", inputs[0], weights);
};