Keras - One Class CNN - Два входа по одному на каждом шаге - PullRequest
1 голос
/ 09 мая 2020

Я пытаюсь обучить CNN одного класса, но хочу тренироваться только в одном классе. Итак, чтобы решить проблему отсутствия отрицательного класса вместо добавления случайных изображений к метке «без класса», я хочу тренироваться с шумом для этих входных данных. Но я хочу ввести шум no как случайное сгенерированное изображение, а как вектор признаков перед классификатором NN, как это объясняется в этой статье: https://arxiv.org/pdf/1901.08688.pdf

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

enter image description here

Я используя tf.keras и функциональный API, пытаясь добавить дополнительный ввод в VGG16. Я пробовал свой собственный генератор ввода, но не уверен, смогу ли я добиться этого с помощью кода и с помощью Keras, так как я не знаю, могу ли я активировать разные входы на каждом этапе. Один из подходов состоит в том, чтобы извлечь все векторы признаков из сверточных слоев, сгенерировать аналогичное количество векторов шума, а затем обучить классификатор как сгенерированным шумом, так и с реальными характеристиками.

* 1014 Я все это делаю в одной модели?

Пожалуйста, любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

1 голос
/ 09 мая 2020

Если вы думаете немного творчески, вам вообще не нужен слой ввода шума.

Мы можем использовать GaussianNoise() из tf.keras, но для этого нужен входной тензор, технически мы должны передать ему ones вектор. Мы можем заставить промежуточные выходные функции VGG умножаться на нулевые ядра плотного слоя, затем мы можем добавить к нему ones смещение, так что мы получим наш вектор-заполнитель ones, который будет передан в GaussianNoise.

Теперь вы можете забыть о любом сложном генераторе данных, просто используйте свои обычные генераторы данных или напрямую numpy массив с fit.

from tensorflow.keras.applications import VGG16
from tensorflow.keras.layers import *
from tensorflow.keras.models import *
import tensorflow as tf

ip = Input((224,224,3))

base = VGG16((224,224,3))(ip)

# passing vgg features to a zero vector, making everything zero and then adding bias ones to make the output is always 1

dense_ones = Dense(1000, activation='linear', kernel_initializer = tf.keras.initializers.Zeros(), bias_initializer = tf.keras.initializers.Ones())(base)
gaussian = GaussianNoise(0.4)(dense_ones)

concat = Concatenate()([base, gaussian])

learn_feature = Dense(128, activation = 'relu')(concat) # change this part based on your needs
classification = Dense(2, activation = 'sigmoid')(learn_feature)

model = Model(ip, classification)
Model: "model_5"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_19 (InputLayer)           [(None, 224, 224, 3) 0                                            
__________________________________________________________________________________________________
vgg16 (Model)                   (None, 1000)         138357544   input_19[0][0]                   
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 1000)         1001000     vgg16[1][0]                      
__________________________________________________________________________________________________
gaussian_noise_5 (GaussianNoise (None, 1000)         0           dense_2[0][0]                    
__________________________________________________________________________________________________
concatenate_4 (Concatenate)     (None, 2000)         0           vgg16[1][0]                      
                                                                 gaussian_noise_5[0][0]           
==================================================================================================
Total params: 139,358,544
Trainable params: 139,358,544
Non-trainable params: 0
___________________________________
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...