为什么tf.keras.layers.Conv2D每次运行都会给出不同的结果



我正试图将我的代码从在线Jupyter笔记本(COURSERA(复制到我自己的本地环境(安装了CUDA的Anaconda 3 Jupyter(所有代码都完全相同,并且在上运行良好

我像往常一样导入了Conv2D:

import tensorflow as tf
import numpy as np
import scipy.misc
from tensorflow.keras.applications.resnet_v2 import ResNet50V2
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.resnet_v2 import preprocess_input, decode_predictions
from tensorflow.keras import layers
from tensorflow.keras.layers import Input, Add, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D, AveragePooling2D, MaxPooling2D, GlobalMaxPooling2D
from tensorflow.keras.models import Model, load_model
from tensorflow.keras.initializers import random_uniform, glorot_uniform, constant, identity
from tensorflow.python.framework.ops import EagerTensor
from matplotlib.pyplot import imshow

%matplotlib inline

并馈送

X1 = np.ones((1, 4, 4, 3)) * -1
X2 = np.ones((1, 4, 4, 3)) * 1
X3 = np.ones((1, 4, 4, 3)) * 3
X = np.concatenate((X1, X2, X3), axis = 0).astype(np.float32)
print(X.shape)
y = Conv2D(filters = 2, kernel_size = 1, strides = (2,2), padding = 'valid')(X)
print(y.numpy())

输出形状始终为(3,2,2,2(,但该值每次运行都会更改。

环境:Ubuntu 21.10TensorFlow:2.8.0NVIDIA-SMI 510.54CUDA版本:11.6

这是因为kernel每次都是随机初始化的。尝试设置一个随机种子,你应该会得到确定的结果:

X1 = np.ones((1, 4, 4, 3)) 
X2 = np.ones((1, 4, 4, 3)) 
X3 = np.ones((1, 4, 4, 3))
X = np.concatenate((X1, X2, X3), axis = 0).astype(np.float32)
results = []
for _ in range(10):
tf.random.set_seed(111)
results.append(Conv2D(filters = 2, kernel_size = 1, strides = (2,2), padding = 'valid', kernel_initializer = glorot_uniform(seed=0))(X))
np.all(results == results[0])
# True ==> all the same

还要注意文档对glorot_uniform(seed=0):的描述

请注意,种子初始值设定项不会产生相同的随机值跨多个调用,但多个初始化程序将生成相同的当用相同的种子值构建时的序列。

最新更新