【问题标题】:Keras - One Class CNN - Two inputs one at each stepKeras - 一类 CNN - 每一步都有两个输入
【发布时间】:2020-08-24 16:12:40
【问题描述】:

我正在尝试训练一类 CNN,但只想训练一类。因此,为了解决没有负类而不是将随机图像添加到“无类”标签的问题,我想对这些输入进行噪声训练。但我想输入噪声 no 作为随机生成的图像,但作为分类器 NN 之前的特征向量,正如本文所解释的那样: https://arxiv.org/pdf/1901.08688.pdf

所以一步将来自 VGG16 卷积层的特征向量,下一步我想使用随机生成的特征向量进行训练。

我正在使用 tf.keras 和功能 API 尝试向 VGG16 添加额外的输入。 我已经尝试过自己的输入生成器,但我不确定是否可以通过代码和使用 Keras 来实现它,因为我不知道是否可以在每个步骤中激活不同的输入。 一种方法是从卷积层中提取所有特征向量,生成相似数量的噪声向量,然后使用生成的噪声和真实特征训练分类器。

我想这会起作用,但我可以在同一个模型中完成这一切吗?

请,任何帮助将不胜感激。

谢谢

【问题讨论】:

标签: python keras deep-learning tf.keras conv-neural-network


【解决方案1】:

如果您稍微有创意地思考,则根本不需要噪声输入层。

我们可以使用来自 tf.keras 的 GaussianNoise(),但它需要一个输入张量,从技术上讲,我们应该传递一个 ones 向量。我们可以让中间 VGG 输出特征乘以密集层的零核,然后我们可以向它添加 ones 偏差,这样我们就得到了占位符 ones 向量,它将被传递给 GaussianNoise

现在,您可以忘记任何复杂的数据生成器,只需使用常规数据生成器或直接使用带有 fit 的 numpy 数组。

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
___________________________________

【讨论】:

  • 感谢 Zabir,添加噪声的好方法。但是仍然要解决如何将连接输入设置为两个不同的输入。我从我试图实现的论文中了解到,输入噪声应该被标记为另一个类,以便分类器的输出有两个单位
  • learn_featureclassification层,我猜你可以改变,最后一层可以有2个单位和一个softmax。
猜你喜欢
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2018-01-14
相关资源
最近更新 更多