受 Fran?ois Chollet 的書“Python 深度學習”(第 1 版)的啟發,我試圖生成一張圖片,最大限度地預測 VGG16 模型。
此處描述了中間層的原始程式(從單元格 12 開始):
https://github.com/fchollet/deep-learning-with-python-notebooks/blob/master/first_edition/5.4-visualizing-what-c??onvnets-learn.ipynb
本質上,這涉及輸入影像的梯度下降:
import keras, matplotlib.pyplot as plt, numpy as np
from keras import backend as K, models
from keras.applications.vgg16 import decode_predictions, preprocess_input, VGG16
from keras.models import load_model
from keras.preprocessing import image
model = VGG16(weights='imagenet')
layer_name = 'block3_conv1'
filter_index = 0
layer_output = model.get_layer(layer_name).output
loss = K.mean(layer_output[:, :, :, filter_index])
grads = K.gradients(loss, model.input)[0]
grads /= (K.sqrt(K.mean(K.square(grads))) 1e-5)
iterate = K.function([model.input], [loss, grads])
loss_value, grads_value = iterate([np.zeros((1, 150, 150, 3))])
為了在最終預測中重現這一點,我認為最后一層渲染了一個千維向量(對應于 VGG16 案例中的 1000 個類),但其中只有一個索引需要最大化,比如“貓”的 285。
因此,我稍微修改了代碼:
layer_pred_name = 'predictions'
pred_index = 285
layer_pred_output = model.get_layer(layer_pred_name).output
loss_pred = K.mean(layer_pred_output[:, pred_index])
grads_pred = K.gradients(loss_pred, model.input)[0]
grads_pred /= (K.sqrt(K.mean(K.square(grads_pred))) 1e-5)
iterate_pred = K.function([model.input], [loss_pred, grads_pred])
loss_pred_value, grads_pred_value = iterate_pred([np.zeros((1, 150, 150, 3))])
但是,不幸的是,我收到以下錯誤:
InvalidArgumentError: Matrix size-incompatible: In[0]: [1,8192], In[1]: [25088,4096]
[[{{node fc1/MatMul}} = MatMul[T=DT_FLOAT, _class=["loc:@gradients_1/fc1/MatMul_grad/MatMul"], transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/device:GPU:0"](flatten/Reshape, fc1/kernel/read)]]
實際上,尺寸似乎合適,這就是我無法理解錯誤的原因。任何有關如何解決此問題的想法將不勝感激。
uj5u.com熱心網友回復:
最后,我通過撰寫自己的隨機搜索函式找到了解決此問題的方法,該函式將預測差異最小化到給定預測:
def prediction_leastquares(input1, input2):
leastsquare = 0
for idx in range(len(input1)):
leastsquare = leastsquare (input1[idx] - input2[idx])**2
leastsquare = leastsquare**(1/2)
return leastsquare
opt_pred = np.zeros(1000)
opt_pred[285] = 1
x2 = np.zeros(x.shape) 100
x2 = np.array(x2)
predsdiff2 = 2
for i in range(10000):
preds2 = model.predict(x2)
x1 = x2.copy()
x1 = x1 np.random.normal(loc=0.0, scale=1, size=[1, x1.shape[1], x1.shape[2], 3])
preds1 = model.predict(x1)
predsdiff1 = prediction_leastquares(preds1[0], opt_pred)
if (predsdiff1 < predsdiff2):
predsdiff2 = predsdiff1
x2 = x1.copy()
最終輸出是一個隨機的影像,它以非常高的置信度被歸類為“貓”——一種動手對抗性攻擊。
VGG16分類為貓的優化圖片
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/401995.html
標籤:张量流 凯拉斯 卷积神经网络 keras文件 keras层
