我正在使用TensorFlow来举办一些Kaggle比赛。由于我没有太多的训练数据,我使用TF常量将我的所有训练和测试数据预先加载到Graph中以提高效率。我的代码看起来像这样
... lots of stuff ... with tf.Graph().as_default(): train_images = tf.constant(train_data[:36000,1:], dtype=tf.float32) ... more stuff ... train_set = tf.train.slice_input_producer([train_images, train_labels]) images, labels = tf.train.batch(train_set, batch_size=100) # this is where my model graph is built model = MLP(hidden=[512, 512]) logits = model._create_model(images) loss = model._create_loss_op(logits, labels) train = model._create_train_op(loss) # I know I am not supposed to call _something() methods # from outside of the class. I used to call these internally # but refactoring is still in progress
现在,当我使用Feed字典来提供数据时,我只能构建一次模型,但可以轻松切换输入,例如我的训练数据和验证数据(以及我的测试数据)。但是通过预加载,似乎我必须为我拥有的每组输入构建一个单独的图形副本。目前,我正是这样做,我使用变量重用来确保图表使用相同的权重和偏差。但我无法帮助,但觉得这是一种奇怪的做事方式。所以,例如,这里有我的MLP类和我的验证代码
的一些部分class MLP(object): ... lots of stuff happens here ... def _create_dense_layer(self, name, inputs, n_in, n_out, reuse=None, activation=True): with tf.variable_scope(name, reuse=reuse): weights = self._weights([n_in, n_out]) self.graph.add_to_collection('weights', weights) layer = tf.matmul(inputs, weights) if self.biases: biases = self._biases([n_out]) layer = layer + biases if activation: layer = self.activation(layer) return layer ... and back to the training code ... valid_images = tf.constant(train_data[36000:,1:], dtype=tf.float32) valid_logits = model._create_model(valid_images, reuse=True) valid_accuracy = model._create_accuracy_op(valid_logits, valid_labels)
那么,我是否真的需要为我想要使用它的每组数据创建我的模型的完整副本,或者我在TF中缺少某些内容并且有更简单的方法吗?