我感觉我陷入了一些非常微不足道的事情,或者可能有一些关于VGG16实施的细节我不知道,但我运行相同的输入和相同重量的网络,当我在第一个卷积层之后检查时,我得到了不同的结果。关键在于运行global_variable_initializers。哪些全局变量不同,以致网络结果发生变化?在常规卷积中,仅涉及滤波器和输入的权重。
我还检查了在Keras实现这一层的特定行,没有什么奇怪的,也很难理解:
x = Conv2D(64, (3, 3), activation='relu', padding='same',name='block1_conv1')(img_input)
这是我写的一个虚拟代码,用于检查输出是否总是不同,而其他参数是相同的。
import tensorflow as tf
import numpy as np
from tensorflow.python.keras._impl.keras.applications.vgg16 import VGG16
input_tensor = tf.Variable(tf.ones((1,32,32,3)))
model = VGG16(input_tensor=input_tensor, include_top=False, weights="imagenet")
layers = dict([(layer.name,layer.output) for layer in model.layers])
loss = tf.reduce_sum(layers["block1_conv1"])
sess = tf.Session()
sess.run(tf.global_variables_initializer())
myloss = sess.run(loss)
# Always same input
print(np.sum(input_tensor.eval(session=sess)))
# Always same weights
print(np.sum(model.get_weights()[1]))
# Different value every time I run it
print(myloss)
sess.run(tf.global_variables_initializer())
myloss = sess.run(loss)
print(myloss)
sess.run(tf.global_variables_initializer())
myloss = sess.run(loss)
print(myloss)
答案 0 :(得分:1)
似乎我们必须使用Keras加载会话。如果我们自己创建一个,那么变量将被重新初始化。
添加以下行解决了它:
from tensorflow.python.keras._impl.keras import backend as K
sess = K.get_session()