Keras: результат model.evaluate () остается высоким со всеми весами и уклонами, равными 0 - PullRequest
0 голосов
/ 01 марта 2019

Я создал модель VGG16 с помощью приложения Keras (серверная часть TensorFlow).Затем я хотел изменить часть этих весов, а затем проверить точность этой модифицированной модели.Чтобы быть прямым и интуитивно понятным, я изменил ВСЕ веса и смещения во ВСЕХ слоях на 0 следующим образом:

model = VGG16(weights='imagenet', include_top=True)

# here is the test data and label containing 10 pictures I created.
data = np.load('./10_random_samples_array.npz')
data, label = data["X"], data["Y"]

# Modify the weights to zero
for z in [1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17]:     # Conv layers
    weight_bias = model.layers[z].get_weights()
    shape_weight = np.shape(weight_bias[0])
    shape_bias = np.shape(weight_bias[1])
    weight_bias[0] = np.zeros(shape=(shape_weight[0],shape_weight[1],shape_weight[2],shape_weight[3]))
    weight_bias[1] = np.zeros(shape=(shape_bias[0],))
    model.layers[z].set_weights(weight_bias)

for z in [20,21,22]:    # FC layers
    weight_bias = model.layers[z].get_weights()
    shape_weight = np.shape(weight_bias[0])
    print(z, shape_weight)
    shape_bias = np.shape(weight_bias[1])
    weight_bias[0] = np.zeros(shape=(shape_weight[0],shape_weight[1],))
    weight_bias[1] = np.zeros(shape=(shape_bias[0],))
    model.layers[z].set_weights(weight_bias)

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
              metrics=['accuracy'])

# To check if the weights have been modified.
print(model.layers[1].get_weights())

loss, acc = model.evaluate(data, label, verbose=1)
print(acc)

Затем я получил такой результат:

[array([[[[0., 0., 0., ..., 0., 0., 0.],
         [0., 0., 0., ..., 0., 0., 0.],
         [0., 0., 0., ..., 0., 0., 0.]],

        ...(All zero, I omit them)

        [[0., 0., 0., ..., 0., 0., 0.],
         [0., 0., 0., ..., 0., 0., 0.],
         [0., 0., 0., ..., 0., 0., 0.]]]], dtype=float32), 
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)]

10/10 [==============================] - 2s 196ms/step
0.9989999532699585

Во-первых, вы можетескажем, что все веса и смещения уже были изменены на 0, но точность все еще остается очень высокой.Это неразумно. (Исходный результат, возвращаемый model.evaluate(), равен 0.9993000030517578)

Во-вторых, я использовал только 10 изображений в качестве моего тестового набора данных.Результат должен быть десятичным и иметь только одну цифру после точки.Но я получил 0.9989999532699585.

Я также пытался изменить все веса только в Conv1-1 до нуля, и результат также равен 0.9989999532699585.Кажется, это минимальный результат.Что-то не так с моей моделью?Или веса не могут быть изменены таким образом?Или model.evaluate() не работает, как я полагаю?

...