Керас: как тренировать входной слой - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь получить идеальный вход для определенного класса данных imagenet. Я использую keras inceptionv3, инициализированный с весами imagenet. Я также установил пользовательский тензор, который случайным образом инициализируется в качестве входных данных. Я установил все слои как не обучаемые, кроме входных. Вот код:

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 голосов
/ 12 марта 2019

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]
0 голосов
/ 13 марта 2019

Я думаю, что вы ищете что-то вроде DeepDream реализации. Вы можете найти исходный код здесь в блокноте Jupyter. Когда вы хотите сделать это, вы должны использовать tenorflow вместо API высокого уровня keras. Затем вы можете рассчитать градиенты относительно вашего изображения и обновлять его, пока не получите желаемый результат. Как правило, вы должны позаботиться о масштабировании и так далее. Я думаю, что это может быть объяснено в блокноте Jupyter!

0 голосов
/ 09 января 2019

Насколько я знаю, слой Input в керасе не обучаем. оно проходит только через то значение, которое вы ему передаете. Поскольку вы установили для всех остальных слоев значение trainable = False (следовательно, веса не обновляются), я думаю, именно поэтому ваша потеря остается постоянной.

...