Skip to content

Commit 80404b6

Browse files
committed
add resnet test
1 parent 39a3e1d commit 80404b6

3 files changed

Lines changed: 87 additions & 33 deletions

File tree

include/layers/Shape.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class Shape {
5050
bool operator!=(const Shape& other) const noexcept {
5151
return !(*this == other);
5252
}
53+
5354
private:
5455
std::vector<size_t> dims_;
5556
};

src/layers/MulLayer.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,14 +172,18 @@ size_t MulLayer::get_broadcasted_index(size_t flat_index,
172172

173173
for (size_t i = 0; i < output_dims; ++i) {
174174
size_t output_dim = output_shape[i];
175-
size_t input_dim =
176-
(i < input_dims) ? input_shape[input_dims - output_dims + i] : 1;
175+
size_t input_dim = (i >= output_dims - input_dims)
176+
? input_shape[i - (output_dims - input_dims)]
177+
: 1;
177178

178179
if (input_dim == 1) continue;
179180

180181
size_t pos_in_dim =
181182
(flat_index / get_strides(output_shape)[i]) % output_dim;
182-
index += pos_in_dim * strides[input_dims - output_dims + i];
183+
if (i >= output_dims - input_dims) {
184+
size_t input_pos = i - (output_dims - input_dims);
185+
index += pos_in_dim * strides[input_pos];
186+
}
183187
}
184188
return index;
185189
}

test/single_layer/test_mullayer.cpp

Lines changed: 79 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#include <vector>
22

3-
#include "layers/Tensor.hpp"
43
#include "gtest/gtest.h"
54
#include "layers/MulLayer.hpp"
5+
#include "layers/Tensor.hpp"
66

77
using namespace itlab_2023;
88

@@ -23,7 +23,6 @@ class MulLayerTests : public ::testing::Test {
2323
Tensor scalar_int;
2424
};
2525

26-
// Тест умножения тензоров одинаковой формы (float)
2726
TEST_F(MulLayerTests, MulSameShapeFloat) {
2827
MulLayer layer;
2928
Tensor input1 = make_tensor<float>(data1, {2, 2});
@@ -33,13 +32,12 @@ TEST_F(MulLayerTests, MulSameShapeFloat) {
3332
layer.run(input1, input2, output);
3433

3534
auto* result = output.as<float>();
36-
EXPECT_FLOAT_EQ((*result)[0], 2.0f); // 1*2
37-
EXPECT_FLOAT_EQ((*result)[1], 6.0f); // 2*3
38-
EXPECT_FLOAT_EQ((*result)[2], 12.0f); // 3*4
39-
EXPECT_FLOAT_EQ((*result)[3], 20.0f); // 4*5
35+
EXPECT_FLOAT_EQ((*result)[0], 2.0f);
36+
EXPECT_FLOAT_EQ((*result)[1], 6.0f);
37+
EXPECT_FLOAT_EQ((*result)[2], 12.0f);
38+
EXPECT_FLOAT_EQ((*result)[3], 20.0f);
4039
}
4140

42-
// Тест умножения тензоров одинаковой формы (int)
4341
TEST_F(MulLayerTests, MulSameShapeInt) {
4442
MulLayer layer;
4543
Tensor input1 = make_tensor<int>(data_int, {2, 2});
@@ -49,13 +47,28 @@ TEST_F(MulLayerTests, MulSameShapeInt) {
4947
layer.run(input1, input2, output);
5048

5149
auto* result = output.as<int>();
52-
EXPECT_EQ((*result)[0], 1); // 1*1
53-
EXPECT_EQ((*result)[1], 4); // 2*2
54-
EXPECT_EQ((*result)[2], 9); // 3*3
55-
EXPECT_EQ((*result)[3], 16); // 4*4
50+
EXPECT_EQ((*result)[0], 1);
51+
EXPECT_EQ((*result)[1], 4);
52+
EXPECT_EQ((*result)[2], 9);
53+
EXPECT_EQ((*result)[3], 16);
54+
}
55+
56+
TEST_F(MulLayerTests, MulSameShapeIntResNet1) {
57+
MulLayer layer;
58+
Tensor input1 = make_tensor<int>({1, 2, 64, 64, 64}, {5});
59+
Tensor input2 = make_tensor<int>({1, 2, 64, 1, 1}, {5});
60+
Tensor output;
61+
62+
layer.run(input1, input2, output);
63+
64+
auto* result = output.as<int>();
65+
EXPECT_EQ((*result)[0], 1);
66+
EXPECT_EQ((*result)[1], 4);
67+
EXPECT_EQ((*result)[2], 4096);
68+
EXPECT_EQ((*result)[3], 64);
69+
EXPECT_EQ((*result)[4], 64);
5670
}
5771

58-
// Тест умножения тензора на скаляр (float)
5972
TEST_F(MulLayerTests, MulWithScalarFloat) {
6073
MulLayer layer;
6174
Tensor input = make_tensor<float>(data1, {2, 2});
@@ -64,13 +77,12 @@ TEST_F(MulLayerTests, MulWithScalarFloat) {
6477
layer.run(input, scalar, output);
6578

6679
auto* result = output.as<float>();
67-
EXPECT_FLOAT_EQ((*result)[0], 2.0f); // 1*2
68-
EXPECT_FLOAT_EQ((*result)[1], 4.0f); // 2*2
69-
EXPECT_FLOAT_EQ((*result)[2], 6.0f); // 3*2
70-
EXPECT_FLOAT_EQ((*result)[3], 8.0f); // 4*2
80+
EXPECT_FLOAT_EQ((*result)[0], 2.0f);
81+
EXPECT_FLOAT_EQ((*result)[1], 4.0f);
82+
EXPECT_FLOAT_EQ((*result)[2], 6.0f);
83+
EXPECT_FLOAT_EQ((*result)[3], 8.0f);
7184
}
7285

73-
// Тест умножения тензора на скаляр (int)
7486
TEST_F(MulLayerTests, MulWithScalarInt) {
7587
MulLayer layer;
7688
Tensor input = make_tensor<int>(data_int, {2, 2});
@@ -79,31 +91,70 @@ TEST_F(MulLayerTests, MulWithScalarInt) {
7991
layer.run(input, scalar_int, output);
8092

8193
auto* result = output.as<int>();
82-
EXPECT_EQ((*result)[0], 2); // 1*2
83-
EXPECT_EQ((*result)[1], 4); // 2*2
84-
EXPECT_EQ((*result)[2], 6); // 3*2
85-
EXPECT_EQ((*result)[3], 8); // 4*2
94+
EXPECT_EQ((*result)[0], 2);
95+
EXPECT_EQ((*result)[1], 4);
96+
EXPECT_EQ((*result)[2], 6);
97+
EXPECT_EQ((*result)[3], 8);
8698
}
8799

88-
// Тест broadcasting (расширения размерностей)
89-
TEST_F(MulLayerTests, BroadcastingTest) {
100+
TEST_F(MulLayerTests, BroadcastingTest1) {
90101
MulLayer layer;
91-
Tensor input1 = make_tensor<float>({1.0f, 2.0f}, {2, 1}); // shape [2,1]
92-
Tensor input2 = make_tensor<float>({3.0f, 4.0f}, {1, 2}); // shape [1,2]
102+
Tensor input1 = make_tensor<float>({1.0f, 2.0f}, {2, 1});
103+
Tensor input2 = make_tensor<float>({3.0f, 4.0f}, {1, 2});
93104
Tensor output;
94105

95106
layer.run(input1, input2, output);
96107

97-
// Ожидаемый результат после broadcasting:
98-
// [[1*3, 1*4], [2*3, 2*4]] = [[3,4], [6,8]]
99108
auto* result = output.as<float>();
100109
EXPECT_FLOAT_EQ((*result)[0], 3.0f);
101110
EXPECT_FLOAT_EQ((*result)[1], 4.0f);
102111
EXPECT_FLOAT_EQ((*result)[2], 6.0f);
103112
EXPECT_FLOAT_EQ((*result)[3], 8.0f);
104113
}
105114

106-
// Тест на несовместимые формы
115+
TEST_F(MulLayerTests, Broadcasting3D) {
116+
MulLayer layer;
117+
Tensor input1 =
118+
make_tensor<float>({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}, {2, 1, 3});
119+
Tensor input2 =
120+
make_tensor<float>({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}, {2, 3, 1});
121+
Tensor output;
122+
123+
layer.run(input1, input2, output);
124+
125+
ASSERT_EQ(output.get_shape(), Shape({2, 3, 3}));
126+
auto* result = output.as<float>();
127+
EXPECT_FLOAT_EQ((*result)[0], 1.0f);
128+
EXPECT_FLOAT_EQ((*result)[1], 2.0f);
129+
EXPECT_FLOAT_EQ((*result)[2], 3.0f);
130+
EXPECT_FLOAT_EQ((*result)[3], 2.0f);
131+
EXPECT_FLOAT_EQ((*result)[4], 4.0f);
132+
EXPECT_FLOAT_EQ((*result)[5], 6.0f);
133+
EXPECT_FLOAT_EQ((*result)[12], 20.0f);
134+
EXPECT_FLOAT_EQ((*result)[13], 25.0f);
135+
EXPECT_FLOAT_EQ((*result)[14], 30.0f);
136+
EXPECT_FLOAT_EQ((*result)[15], 24.0f);
137+
EXPECT_FLOAT_EQ((*result)[16], 30.0f);
138+
EXPECT_FLOAT_EQ((*result)[17], 36.0f);
139+
}
140+
141+
TEST_F(MulLayerTests, BroadcastingDifferentRanks) {
142+
MulLayer layer;
143+
Tensor input1 = make_tensor<float>({1.0f, 2.0f, 3.0f}, {3});
144+
Tensor input2 =
145+
make_tensor<float>({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}, {2, 1, 3});
146+
Tensor output;
147+
148+
layer.run(input1, input2, output);
149+
150+
ASSERT_EQ(output.get_shape(), Shape({2, 1, 3}));
151+
auto* result = output.as<float>();
152+
EXPECT_FLOAT_EQ((*result)[0], 1.0f);
153+
EXPECT_FLOAT_EQ((*result)[1], 4.0f);
154+
EXPECT_FLOAT_EQ((*result)[2], 9.0f);
155+
EXPECT_FLOAT_EQ((*result)[3], 4.0f);
156+
}
157+
107158
TEST_F(MulLayerTests, IncompatibleShapes) {
108159
MulLayer layer;
109160
Tensor input1 = make_tensor<float>(data1, {4});
@@ -113,12 +164,10 @@ TEST_F(MulLayerTests, IncompatibleShapes) {
113164
EXPECT_THROW(layer.run(input1, input2, output), std::runtime_error);
114165
}
115166

116-
// Тест имени слоя
117167
TEST_F(MulLayerTests, LayerName) {
118168
EXPECT_EQ(MulLayer::get_name(), "Element-wise Multiplication Layer");
119169
}
120170

121-
// Тест умножения пустых тензоров
122171
TEST_F(MulLayerTests, EmptyTensors) {
123172
MulLayer layer;
124173
Tensor empty1({}, Type::kFloat);

0 commit comments

Comments
 (0)