我在Google Colab中运行了一个顺序模型。我尝试了所有可以找到的关于设置种子的建议,这样我就可以得到可重复的结果,但没有任何效果。训练和验证准确性每次都不同,训练和验证损失也是如此。
有关我的项目的更多信息:
- tensorflow 版本:2.9.2
- 我已经支付了ColabPro版本,如果这件事。
因为我正在预处理文本数据,所以我执行以下操作:
# Pad tokens (X var)
tokens = data_sent['word_idx'].tolist()
maxlen = config.MAX_LEN #max([len(s) for s in tokens])
pad_tokens = pad_sequences(tokens, maxlen=maxlen, dtype='int32', padding='post')
下面是我用来分割数据的函数:
def data_split(features, labels, train_frac, random_state=config.SEED):
assert train_frac >= 0 and train_frac <= 1, "Invalid training set fraction"
X_train, X_test, Y_train, Y_test = train_test_split(
features, labels, train_size=train_frac, random_state=random_state)
print(
'train_tokens length:', len(X_train),
'\ntest_tokens length:', len(X_test),
'\ntrain_tags:', len(Y_train),
'\ntest_tags:', len(Y_test),
)
return X_train, X_test, Y_train, Y_test
产品型号:
model = tf.keras.models.Sequential([
tf.keras.layers.Embedding(input_dim=config.MAX_TOKENS, output_dim=config.EMBEDDING_DIM, input_length=config.MAX_LEN, mask_zero=True),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=config.EMBEDDING_DIM, activation='tanh', return_sequences=True, dropout=0.2, kernel_regularizer=regularizers.L2(l2_regularizer_start), kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED))),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=config.EMBEDDING_DIM, activation='tanh', return_sequences=True, dropout=0.2, kernel_regularizer=regularizers.L2(l2_regularizer_start), kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED))),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=config.EMBEDDING_DIM, activation='tanh', return_sequences=True, dropout=0.2, kernel_regularizer=regularizers.L2(l2_regularizer_start), kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED))),
tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(n_tags, activation='softmax', kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED))),
])
我尝试过的方法:1.为每一层中的初始化程序设置种子:
kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED)
2.在代码v0的开头
np.random.seed(config.SEED)
random.seed(config.SEED)
tf.random.set_seed(config.SEED)
3.在代码v1的开头
random.seed(SEED)
np.random.seed(SEED)
tf.random.set_seed(SEED)
os.environ['PYTHONHASHSEED']=str(SEED)
os.environ['TF_DETERMINISTIC_OPS'] = '1'
4.在代码v2的开头
tf.keras.utils.set_random_seed(config.SEED)
tf.config.experimental.enable_op_determinism()
5.在代码v3的开头
def set_seeds(seed=config.SEED):
os.environ['PYTHONHASHSEED'] = str(seed)
random.seed(seed)
tf.random.set_seed(seed)
np.random.seed(seed)
def set_global_determinism(seed=config.SEED):
set_seeds(seed=seed)
os.environ['TF_DETERMINISTIC_OPS'] = '1'
os.environ['TF_CUDNN_DETERMINISTIC'] = '1'
tf.config.threading.set_inter_op_parallelism_threads(1)
tf.config.threading.set_intra_op_parallelism_threads(1)
# Call the above function with seed value
set_global_determinism(seed=config.SEED)
更新:
如果我多次运行笔记本而不重新启动运行时,我会得到相同的结果。
如果我重启Colab运行时,结果(准确度和损失)总是不同,尽管设置了随机种子,并且每次都相同。
更新1
使用!nvidia-smi
显示每次我在Colab中重新启动会话时,我连接的GPU都在发生变化。
因此,似乎是Colab造成了这个问题,但我不知道如何解决它。
1条答案
按热度按时间mccptt671#
从问题中,你可以使用随机数发生器。
样本:随机的统一值。预期没有来自测定输入的序列输出,准确度不同,没有测定成分。
输出量: