keras:如何训练输入层

时间:2019-01-09 13:09:22

标签: keras keras-layer

我正在尝试为特定类别的imagenet数据获取理想的输入。我正在使用以imagenet权重初始化的keras inceptionv3。我还设置了一个自定义张量,将其随机初始化为输入。我已将除输入外的所有图层设置为不可训练。这是代码:

from keras.applications.inception_v3 import InceptionV3
from keras.layers import Input
import keras
import keras.backend as K

# this could also be the output a different Keras model or layer
inp = K.random_uniform_variable(shape=(1, 224, 224, 3), low=0, high=1) # Uniform distribution
# input_tensor = Input(shape=(1, 224, 224, 3), tensor=inp)  # this assumes K.image_data_format() == 'channels_last'

model = InceptionV3(input_tensor=inp, weights='imagenet', include_top=True)
for layer in model.layers:
    layer.trainable = False
input_layer = model.layers[0]
input_layer.trainable = True
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy')
history = model.fit(y=[0], batch_size=1, epochs=50, verbose=1)

运行上述脚本后,损失始终保持不变6.901。知道我在做什么错吗?

3 个答案:

答案 0 :(得分:0)

据我所知,keras中的Input层是不可训练的。它只会传递您传递给它的任何值。由于您将所有其他层都设置为trainable = False(因此没有权重在更新),我想这就是您的损失保持恒定的原因。

答案 1 :(得分:0)

inputLayer只是一个占位符或张量包装器,此层中没有可训练的参数。如果使用model.summary(),它将显示#parameters为0。

    Layer (type)                    Output Shape         Param #     Connected to                     
=========================================================================================
input_1 (InputLayer)            (None, 299, 299, 3)  0                                            
_________________________________________________________________________________________
conv2d_1 (Conv2D)               (None, 149, 149, 32) 864         input_1[0][0]

答案 2 :(得分:0)

我认为您正在寻找的是类似DeepDream的实现。您可以在jupyter笔记本中找到源代码here。当您想执行此操作时,必须使用tensorflow而不是高级keras API。然后,您可以计算图像的梯度并对其进行更新,直到获得所需的结果为止。通常,您必须注意缩放等。我认为这可能会在jupyter笔记本中得到解释!