gosha20777 / keras2cpp

it's a small library for running trained Keras 2 models from a native C++ code.
MIT License
183 stars 54 forks source link

Не понимаю где косячу) or assert on BatchNormalization #17

Open pikot opened 4 years ago

pikot commented 4 years ago

Привет. Пытаюсь адаптировать keras модель в сишном коде с помощью данной библиотеки. Есть простая модель, на вход подаю картинку 100 на 100.

модель начинается так.

input_shape = (100, 100, 3)
model.add(Conv2D(32, (3, 3), padding="same", input_shape=input_shape))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Dropout(0.25))

гружу картинку из opencv в модель приблизительно таким кодом

        keras2cpp::Tensor in{mat.cols , mat.rows , 3};
        float *fptr = mat.ptr<float>(0);
        in.data_.insert( in.data_.begin() , fptr, fptr + mat.total()  );
        keras2cpp::Stream mfile("my.model");
        keras2cpp::Model _model( mfile );
        keras2cpp::Tensor out = _model(in);
        out.print();

и получаю

keras2cpp/src/tensor.cc:56] 'dims_ == scale.dims_' failed

на строчке 56 ассерт -- kassert(dims_ == scale.dims_)

print_shape -- (98, 98, 32) для dims_  
scale.print_shape -- (32)
bias.print_shape -- (32)

Смотрел в python код пакера модели, там шейпы для тензоров scale и bias должны быть 1d, получается я даю на вход чтото не правильное, но судя по коду Tensor с dim_ = (98, 98, 32) появляется в Conv2D и далее проваливается через Activation без каких либо ошибок. И вот тут происходит непонимание, почему ассерт ясно, а как починить, не очень.

С керасом работаю первую неделю, так что осознаю что оч многого не знаю, прошу подсказки в какую сторону посмотреть

gosha20777 commented 4 years ago

Я думаю что данные не в правильном формате. Возможно из за этого. Стоит попробовать иначе перевезти их в тензор.