我在进行电力负荷预测,需要初始化权重和偏置。我已经使用不同的算法计算并保存了权重和偏置到一个文件中。我希望使用这个文件来启动我的训练,使用这些权重和偏置。
以下是我想要更新的代码。
#RNN设计
tf.reset_default_graph()
inputs = 1 #输入向量大小
hidden = 100
output = 1 #输出向量大小
X = tf.placeholder(tf.float32, [None, num_periods, inputs])
y = tf.placeholder(tf.float32, [None, num_periods, output])
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=hidden, activation=tf.nn.relu)
rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
learning_rate = 0.001 #小的学习率以避免超过最小值
stacked_rnn_output = tf.reshape(rnn_output, [-1, hidden]) #将形式改为张量
stacked_outputs = tf.layers.dense(stacked_rnn_output, output) #指定层的类型(密集层)
outputs = tf.reshape(stacked_outputs, [-1, num_periods, output]) #结果的形状
loss = tf.reduce_mean(tf.square(outputs - y)) #定义评估模型质量的成本函数
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) #梯度下降方法
training_op = optimizer.minimize(loss) #训练应用成本函数的结果
init = tf.global_variables_initializer() #初始化所有变量
epochs = 1000 #迭代或训练周期的数量,包括前馈和反向传播
mape = []
def mean_absolute_percentage_error(y_true, y_pred):
y_true, y_pred = np.array(y_true), np.array(y_pred)
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
y_pred = {'NSW': [], 'QLD': [], 'SA': [], 'TAS': [], 'VIC': []}
for st in state.values():
print("State: ", st, end='\n')
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
init.run()
for ep in range(epochs):
sess.run(training_op, feed_dict={X: x_batches[st], y: y_batches[st]})
if ep % 100 == 0:
mse = loss.eval(feed_dict={X: x_batches[st], y: y_batches[st]})
print(ep, "MSE:", mse)
y_pred[st] = sess.run(outputs, feed_dict={X: x_batches_test[st]})
print("\n")
我使用以下算法找到权重和偏置,并将其保存为weights
和biases
的列表形式。
class network:
def set_weight_bias(self, a):
lIt = 0
rIt = 0
self.weights = []
self.biases = []
for x,y in zip(self.sizes[1:], self.sizes[:-1]):
rIt += x*y
self.weights.append(a[lIt:rIt].reshape((x,y)))
lIt = rIt
for x in self.sizes[1:]:
rIt += x
self.biases.append(a[lIt:rIt].reshape((x,1)))
lIt = rIt
...
"""
布谷鸟搜索优化
"""
def objectiveFunction(self,x):
self.set_weight_bias(x)
y_prime = self.feedforward(self.input)
return sum(abs(u-v) for u,v in zip(y_prime, self.output))/x.shape[0]
def cso(self, n, x, y, function, lb, ub, dimension, iteration, pa=0.25,
nest=100):
"""
:param n: 代理数量
:param function: 测试函数
:param lb: 绘图轴的下限
:param ub: 绘图轴的上限
:param dimension: 空间维度
:param iteration: 迭代次数
:param pa: 布谷鸟蛋被发现的概率(默认值为0.25)
:param nest: 巢的数量(默认值为100)
"""
...
我希望使用自定义的权重和偏置来开始我的训练,而不是使用TensorFlow随机分配的权重和偏置。如何在TensorFlow中实现这一点?
回答:
您是想要为RNN单元还是为Dense层设置权重?如果是为RNN单元,您应该可以使用set_weights方法来设置权重。
如果是为Dense层,您应该可以分配一个Variable
,并使用initializer
参数传递您的权重(以及另一个用于偏置)。然后,当您调用layers.dense
时,您可以将这两个变量张量分别传递给kernel_initializer
和bias_initializer
,用于权重和偏置。