У меня есть следующий код, представляющий состязательную модель. В качестве входных данных требуется изображение размером 150x150x3 и модель для рекламы. Основная идея c состоит в том, чтобы добавить некоторый шум к изображению и затем прогнозировать, используя заданное значение classifier_model
.
def build_adversarial_model(img, classifier_model):
get_custom_objects().update({'clip': layers.Activation(clip)})
for layer in classifier_model.layers:
layer.trainable = False
image = layers.Input(name='original_image',
shape=img.shape)
one = layers.Input(shape=(1,), name='unity')
noise = layers.Dense(units=150,
activation=None,
use_bias=False,
kernel_initializer='random_normal',
kernel_regularizer=l2(.1),
name='adversarial_noise'
)(one)
res = layers.Reshape(img.shape, name='reshape')(noise)
x = layers.Add(name='add')([image, res])
# Clip values to be within 0 and 1
x = layers.Activation('clip')(x)
output = classifier_model.predict(x)
adversarial_model = Model(inputs=[image, one],
outputs=[output])
adversarial_model.compile(optimizer=Adam(learning_rate=0.01), loss='categorical_crossentropy', metrics='accuracy')
return adversarial_model
def clip(x):
'''Custom activation function for clipping adversarial pixel values.'''
return K.clip(x, 0., 1.)
. Сбой при output = classifier_model.predict(x)
, говоря:
Аргумент TypeError: int () должен быть строкой, байтовоподобным объектом или числом, а не NoneType
В чем причина этой ошибки и как ее избежать в будущем? Ни img
, ни classifier_model
не равны, размеры кажутся хорошо масштабированными.