我正在尝试为特定类别的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。知道我在做什么错吗?
答案 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笔记本中得到解释!