python - 可重现的权重矩阵张量流
问题描述
我想在权重矩阵方面复制两次相同的训练结果。
我已经修复了我的验证集(在训练期间没有拆分):
normed_x_train, normed_x_test, y_train, y_test =
train_test_split(x, y, test_size=0.2, random_state=1)
normed_x_train, x_val, y_train, y_val =
train_test_split(normed_x_train, y_train, test_size=0.25, random_state=1)
此外,我设置了全局和操作种子:
tf.random.set_seed(42)
np.random.seed(24)
现在我以最愚蠢的方式定义模型并设置权重
a,b = model.layers[0].get_weights()[0].shape
weights = [np.ones((a,b)), np.zeros(model.layers[0].get_weights()[1].shape)]
model.layers[0].set_weights(weights)
这对于我拥有的所有图层
然后我运行我的model.fit
函数:
model.fit(normed_x_train, y_train, epochs=1,
validation_data=(x_val, y_val), verbose=1)
然后,我看看我的体重
model.layers[0].get_weights()
对于每一层。
因此,我删除了模型,构建了一个新模型,然后重复此处报告的操作,从以上述方式设置权重开始。但是,在 1 轮训练之后,我去查看权重值时,它们与第一次运行不一样。
这是为什么?
编辑:我注意到从导入中重新运行代码,它在权重方面给出了相同的结果。因此,我尝试在代码中删除模型后,再次添加种子的设置,然后重新创建模型。现在权重与之前的运行相同。有什么解释吗?
这里是整个代码:
from __future__ import absolute_import, division, print_function, unicode_literals
import scipy
import scipy.io as sio
import tensorflow as tf
import numpy as np
from sklearn.model_selection import train_test_split
from tensorflow import keras
from tensorflow.keras import layers
from numpy import random
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from numpy.random import seed
tf.random.set_seed(42)
np.random.seed(24)
def norm(x):
std = np.std(x,0)
mean = np.mean(x,0)
return (x - mean) / std
def build_model():
model = keras.Sequential([
layers.Dense(2, activation=tf.nn.relu, input_shape=([normed_x_train.shape[1]])),
layers.Dense(1, activation=tf.nn.relu)
])
return model
x = random.randint(1000, size=(500,4))
y = np.mean(x,axis = 1)
y = np.resize(y,(y.shape[0],1))
# This is just for shuffle the dataset
a = np.concatenate((x,y), axis=1)
np.random.shuffle(a)
a = np.hsplit(a, (4,4))
x = a[0]
y = a[2]
x = norm(x)
normed_x_train, normed_x_test, y_train, y_test =
train_test_split(x, y, test_size=0.2, random_state=1)
normed_x_train, x_val, y_train, y_val =
train_test_split(normed_x_train, y_train, test_size=0.25, random_state=1)
del model
model = build_model()
model.summary()
model.layers[0].get_weights()
a,b = model.layers[0].get_weights()[0].shape
weights = [np.ones((a,b)), np.zeros(model.layers[0].get_weights()[1].shape)]
model.layers[0].set_weights(weights)
model.layers[0].get_weights()
model.layers[1].get_weights()
a,b = model.layers[1].get_weights()[0].shape
weights = [np.ones((a,b)), np.zeros(model.layers[1].get_weights()[1].shape)]
model.layers[1].set_weights(weights)
model.layers[1].get_weights()
optimizer = tf.keras.optimizers.Adam(0.001)
model.compile(loss='mean_squared_error',
optimizer=optimizer,
metrics=['mean_absolute_error', 'mean_squared_error'],
experimental_run_tf_function=False)
history = model.fit(normed_x_train, y_train, epochs=1,
validation_data=(x_val, y_val), verbose=1)
model.layers[0].get_weights()
model.layers[1].get_weights()
我在 Jupiter 中运行它,所以第一部分只在第一次运行。希望这可以帮助
解决方案
推荐阅读
- java - return 语句后方法不退出
- cuda - 用 CUDA “预热” GPU 的最佳方法是什么?
- stata - 如果在面板数据中观察到 1,则生成一个等于 1 的变量
- wysiwyg - 在所见即所得编辑器中管理图像删除
- javascript - 在 React 中调用制表符表函数
- android - Update some values of a column in android sqlite when releasing new app version
- html - Adding to the Windows Registry
- android - Unable to find image 'gcr.io/fullstackgcp/gradle:latest' locally on Google Cloud Build
- json - 如何将 JSON 与 Test::Deep 进行比较?
- python - Confusion about dimension of 1D CNN input