首页 > 解决方案 > 可重现的权重矩阵张量流

问题描述

我想在权重矩阵方面复制两次相同的训练结果。

我已经修复了我的验证集(在训练期间没有拆分):

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 中运行它,所以第一部分只在第一次运行。希望这可以帮助

标签: pythontensorflowmachine-learningkerasneural-network

解决方案


推荐阅读