Почему этот dynamic_cast auto_ptr перестал работать?

Если вы не понимаете правильно, вы хотите устранить первый блок и последний.

Мой совет - использовать resnet.summary (), чтобы иметь возможность визуализировать все названия модели. Или даже лучше, если у вас есть тензорная доска, чтобы ясно видеть отношения.

Хотя вы можете знать, что завершение блока в Остаточной сети является суммой и только после активации. Активация будет тем слоем, который вы хотите получить.

Названия блоков аналогичны res2a ... Цифра 2 обозначает блок, а буква - «субблок».

На основе архитектуры Resnet50:

enter image description here

Если я хочу удалить первый остаточный блок, я должен искать конец из res2c. В этом случае я нашел это:

activation_57 (Activation) (None, 56, 56, 64) 0 bn2c_branch2a [0] [0]
__________________________________________________________________________________________________
res2c_branch2b (Conv2D) (None, 56, 56, 64) 36928 activation_57 [0] [0]
__________________________________________________________________________________________________
bn2c_branch2b (BatchNormalizati (None, 56, 56, 64) 256 res2c_branch2b [0] [0]
__________________________________________________________________________________________________
activation_58 (Activation) (None, 56, 56, 64) 0 bn2c_branch2b [0] [0]
__________________________________________________________________________________________________
res2c_branch2c (Conv2D) (None, 56, 56, 256) 16640 activation_58 [0] [0]
__________________________________________________________________________________________________
bn2c_branch2c (BatchNormalizati (None, 56, 56, 256) 1024 res2c_branch2c [0] [0]
__________________________________________________________________________________________________
add_19 (Add) (None, 56, 56, 256) 0 bn2c_branch2c [0] [0]
                                                                 activation_56 [0] [0]
__________________________________________________________________________________________________
activation_59 (Activation) (None, 56, 56, 256) 0 add_19 [0] [0]
__________________________________________________________________________________________________
res3a_branch2a (Conv2D) (None, 28, 28, 128) 32896 activation_59 [0] [0]

Входной слой - res3a_branch2a. В этой форме я прыгаю первый блок остатков.

activation_87 (Activation)      (None, 14, 14, 256)  0           bn4f_branch2a[0][0]              
__________________________________________________________________________________________________
res4f_branch2b (Conv2D)         (None, 14, 14, 256)  590080      activation_87[0][0]              
__________________________________________________________________________________________________
bn4f_branch2b (BatchNormalizati (None, 14, 14, 256)  1024        res4f_branch2b[0][0]             
__________________________________________________________________________________________________
activation_88 (Activation)      (None, 14, 14, 256)  0           bn4f_branch2b[0][0]              
__________________________________________________________________________________________________
res4f_branch2c (Conv2D)         (None, 14, 14, 1024) 263168      activation_88[0][0]              
__________________________________________________________________________________________________
bn4f_branch2c (BatchNormalizati (None, 14, 14, 1024) 4096        res4f_branch2c[0][0]             
__________________________________________________________________________________________________
add_29 (Add)                    (None, 14, 14, 1024) 0           bn4f_branch2c[0][0]              
                                                                 activation_86[0][0]              
__________________________________________________________________________________________________
activation_89 (Activation)      (None, 14, 14, 1024) 0           add_29[0][0]   

Если я хочу удалить последний блок остатков, я должен искать конец res4. Это активация_89.

Делая эти сокращения, мы имели бы эту модель:

enter image description here

resnet_cut = Model(inputs=resnet.get_layer('res3a_branch2a'), outputs=resnet.get_layer('activation_89'))

6
задан kal 6 February 2009 в 03:45
поделиться

5 ответов

Ну, std::auto_ptr<B> не получен из std::auto_ptr<A>. Но B получен из A. auto_ptr не знает о том (дело не в этом умный). Похож на Вас, хотят использовать общий указатель владения. boost::shared_ptr идеально, это также обеспечивает dynamic_pointer_cast:

boost::shared_ptr<A> a = new A();
boost::shared_ptr<B> b = dynamic_pointer_cast<B> (a);

Для auto_ptr не может действительно работать такая вещь. Поскольку владение переместится в b. Но если состав исполнителей перестал работать, b не может получить владение. Не ясно, что сделать затем мне. Необходимо было бы, вероятно, сказать, перестал ли состав исполнителей работать, желание продолжают иметь владение - который кажется, что доставит серьезные неприятности. Лучше всего начните использовать shared_ptr. Оба a и b затем указал бы на тот же объект - но B как a shared_ptr<B> и a как a shared_ptr<A>

11
ответ дан 8 December 2019 в 13:50
поделиться

динамический бросок не прокладывает себе путь. A : public B не подразумевает auto_ptr<A> : public auto_ptr<B>. Это то, почему повышение shared_ptr обеспечивает shared_dynamic_cast. Вы могли записать auto_ptr динамический бросок, хотя:

template<typename R, typename T>
std::auto_ptr<R> auto_ptr_dynamic_cast(std::auto_ptr<T>& in) {
  auto_ptr<R> rv;
  R* p;
  if( p = dynamic_cast<R*>( in.get() ) ) {
      in.release();
      rv = p;
  }
  return rv;

}

Просто знайте о том, что происходит здесь. С тех пор auto_ptrs имеют семантику владения, успешное удрученное означает, что оригинал, в более общем плане введенный, auto_ptr больше, не имеет владение.

5
ответ дан 8 December 2019 в 13:50
поделиться

Причина состоит в том, что auto_ptr не является на самом деле указателем. Это - интеллектуальный указатель, который является оберткой указателя, но не на самом деле указателем. Тип, который передается как аргумент стиля шаблонов dynamic_cast, должен быть истинным указателем (или ссылка) тип.

http://msdn.microsoft.com/en-us/library/cby9kycs (По сравнению с 80) .aspx

1
ответ дан 8 December 2019 в 13:50
поделиться

Я думаю, что C++ хранит RTTI (информация о типе выполнения) в vtable. Следовательно для использования dynamic_cast <> с объектом экземпляра объект должен иметь 'vtable'. C++ создает vtable только, когда по крайней мере одна функция объявляется 'виртуальная' в классе.

Класс A и Класс B там не являются никакими виртуальными функциями. Это могло быть причиной dynamic_cast отказа. Попытайтесь объявить виртуальный деструктор в базовом классе.

0
ответ дан 8 December 2019 в 13:50
поделиться

Вы пытаетесь бросить a A* (возвращенный a.get()) к std::auto_ptr<B>, и так как вторым даже не является тип указателя, который это приводит к сбою. Вероятно, Вы просто хотите бросить его к B*:

std::auto_ptr<A> a(new A());
std::auto_ptr<B> b(dynamic_cast<B*>(a.get()));

Это все еще не скомпилирует, потому что A и B не полиморфные типы. A потребности иметь виртуальную функцию для создания типов полиморфными. Это скомпилирует, но бросок просто бросит std::bad_cast, так как это не действительно a B*.

И даже если это был a B*, это перестанет работать ужасающими способами, при попытке использовать его. Оба std::auto_ptrs a и b предположит, что они владеют объектом и освобождают его позже, приводя ко всем видам повреждения памяти. Вы, вероятно, хотите использовать a.release() после того, как бросок был успешен.

0
ответ дан 8 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: