如何在TensorFlow中更改符号变量(tf.Variable)?

我自己编写了一个TensorFlow类,如下所示,但在尝试在refine_init_weight函数中手动将一些权重设置为零时遇到了问题。在这个函数中,我尝试将所有低于某个值的数字设置为零,并观察准确率的变化。问题是,当我重新运行self.sess.run(self.accuracy, feed_dict={self.var_X: self.X_test, self.var_Y: self.y_test})时,似乎其值并未相应改变。我只是在想,在这种情况下,我应该在哪里更改符号变量(准确率取决于我更改的权重)?

import tensorflow as tffrom nncomponents import * from helpers import * from sda import StackedDenoisingAutoencoderclass DeepFeatureSelection:    def __init__(self, X_train, X_test, y_train, y_test, weight_init='sda', hidden_dims=[100, 100, 100], epochs=1000,                 lambda1=0.001, lambda2=1.0, alpha1=0.001, alpha2=0.0, learning_rate=0.1, optimizer='FTRL'):        # 初始化输入层        # 获取输入X的维度        n_sample, n_feat = X_train.shape        n_classes = len(np.unique(y_train))        self.epochs = epochs        # 存储原始值        self.X_train = X_train        self.y_train = one_hot(y_train)        self.X_test = X_test        self.y_test = one_hot(y_test)        # 创建长度未定的两个变量        self.var_X = tf.placeholder(dtype=tf.float32, shape=[None, n_feat], name='x')        self.var_Y = tf.placeholder(dtype=tf.float32, shape=[None, n_classes], name='y')        self.input_layer = One2OneInputLayer(self.var_X)        self.hidden_layers = []        layer_input = self.input_layer.output        # 初始化网络权重        weights, biases = init_layer_weight(hidden_dims, X_train, weight_init)        print(type(weights[0]))        # 创建隐藏层        for init_w,init_b in zip(weights, biases):            self.hidden_layers.append(DenseLayer(layer_input, init_w, init_b))            layer_input = self.hidden_layers[-1].output        # 最终分类层,传递变量Y        self.softmax_layer = SoftmaxLayer(self.hidden_layers[-1].output, n_classes, self.var_Y)        n_hidden = len(hidden_dims)        # 输入层的系数正则化项         self.L1_input = tf.reduce_sum(tf.abs(self.input_layer.w))        self.L2_input = tf.nn.l2_loss(self.input_layer.w)        # 隐藏层的权重正则化项                L1s = []        L2_sqrs = []        for i in xrange(n_hidden):            L1s.append(tf.reduce_sum(tf.abs(self.hidden_layers[i].w)))            L2_sqrs.append(tf.nn.l2_loss(self.hidden_layers[i].w))        L1s.append(tf.reduce_sum(tf.abs(self.softmax_layer.w)))        L2_sqrs.append(tf.nn.l2_loss(self.softmax_layer.w))        self.L1 = tf.add_n(L1s)        self.L2_sqr = tf.add_n(L2_sqrs)        # 包含两个正则化项的成本        self.cost = self.softmax_layer.cost \                    + lambda1*(1.0-lambda2)*0.5*self.L2_input + lambda1*lambda2*self.L1_input \                    + alpha1*(1.0-alpha2)*0.5 * self.L2_sqr + alpha1*alpha2*self.L1        # 使用FTRL优化器以产生更多的零#         self.optimizer = tf.train.FtrlOptimizer(learning_rate=learning_rate).minimize(self.cost)        self.optimizer = optimize(self.cost, learning_rate, optimizer)        self.accuracy = self.softmax_layer.accuracy        self.y = self.softmax_layer.y    def train(self, batch_size=100):        sess = tf.Session()        self.sess = sess        sess.run(tf.initialize_all_variables())        for i in xrange(self.epochs):            x_batch, y_batch = get_batch(self.X_train, self.y_train, batch_size)            sess.run(self.optimizer, feed_dict={self.var_X: x_batch, self.var_Y: y_batch})            if i % 2 == 0:                l = sess.run(self.cost, feed_dict={self.var_X: x_batch, self.var_Y: y_batch})                print('epoch {0}: global loss = {1}'.format(i, l))                self.selected_w = sess.run(self.input_layer.w)                print("训练准确率:",sess.run(self.accuracy, feed_dict={self.var_X: self.X_train, self.var_Y: self.y_train}))                print("测试准确率:",sess.run(self.accuracy, feed_dict={self.var_X: self.X_test, self.var_Y: self.y_test}))                print(self.selected_w)                print(len(self.selected_w[self.selected_w==0]))        print("最终测试准确率:",sess.run(self.accuracy, feed_dict={self.var_X: self.X_test, self.var_Y: self.y_test}))    def refine_init_weight(self, threshold=0.001):        refined_w = np.copy(self.selected_w)        refined_w[refined_w < threshold] = 0        self.input_layer.w.assign(refined_w)        print("测试准确率(优化后):",self.sess.run(self.accuracy, feed_dict={self.var_X: self.X_test, self.var_Y: self.y_test}))

回答:

(我只是重新发布我的评论作为答案)

你需要运行你创建的赋值操作,否则它只是被添加到图中而从未执行。

assign_op = self.input_layer.w.assign(refined_w)self.sess.run(assign_op)

如果你想在TensorFlow中这样做,你可以使用tf.greatertf.less创建一个权重变量的布尔掩码,将这个掩码转换为tf.float32,然后与权重数组相乘。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注