Python 构造tensorflow模型类时遇到问题

Python 构造tensorflow模型类时遇到问题,python,machine-learning,tensorflow,Python,Machine Learning,Tensorflow,我在弄清楚如何构造Tensorflow模型代码时遇到了一些困难。我一直遵循此网站上的指导原则: 然而,使用这种结构,我意识到我无法以这样的方式声明我的模型,即我可以在模型类的train()方法中传递训练数据 训练()方法: def train(self, data_x, data_y): seq_length, longest_seq, data_x = Utils.padding(data_x) n_inputs = np.array(data_x).shape[0]

我在弄清楚如何构造Tensorflow模型代码时遇到了一些困难。我一直遵循此网站上的指导原则:

然而,使用这种结构,我意识到我无法以这样的方式声明我的模型,即我可以在模型类的
train()
方法中传递训练数据

训练()方法

def train(self, data_x, data_y):
    seq_length, longest_seq, data_x = Utils.padding(data_x)
    n_inputs = np.array(data_x).shape[0]

    self.x_placeholder_input = tf.placeholder(tf.float32, shape=[None, longest_seq, n_inputs])
    self.y_placeholder_label = tf.placeholder(tf.int32, shape=[None, self.num_of_classes])
    self.sq_placeholder_seq_length = tf.placeholder(tf.int32, shape=[None])

    num_of_epoch = 100
    with tf.Session() as sess:
        for epoch in range(num_of_epoch):
            # initialise all variables
            sess.run(tf.global_variables_initializer())
            sess.run(self.optimize(),
                     feed_dict={self.x_placeholder_input: data_x,
                                self.y_placeholder_label: data_y,
                                self.sq_placeholder_seq_length: seq_length})

            if num_of_epoch % 10 == 0:
                # Create Saver to save model
                print "Cycle " + str(epoch) + " out of " + str(num_of_epoch) + " done"
                saver = tf.train.Saver()
                location = saver.save(sess, "saved_models/model")
                print "Model saved to : " + str(location)
def __init__(self, num_of_classes):
    # placeholders
    self.x_placeholder_input
    self.y_placeholder_label
    self.sq_placeholder_seq_length

    self.num_of_classes = num_of_classes
模型类的uuu init_uuuu()方法

def train(self, data_x, data_y):
    seq_length, longest_seq, data_x = Utils.padding(data_x)
    n_inputs = np.array(data_x).shape[0]

    self.x_placeholder_input = tf.placeholder(tf.float32, shape=[None, longest_seq, n_inputs])
    self.y_placeholder_label = tf.placeholder(tf.int32, shape=[None, self.num_of_classes])
    self.sq_placeholder_seq_length = tf.placeholder(tf.int32, shape=[None])

    num_of_epoch = 100
    with tf.Session() as sess:
        for epoch in range(num_of_epoch):
            # initialise all variables
            sess.run(tf.global_variables_initializer())
            sess.run(self.optimize(),
                     feed_dict={self.x_placeholder_input: data_x,
                                self.y_placeholder_label: data_y,
                                self.sq_placeholder_seq_length: seq_length})

            if num_of_epoch % 10 == 0:
                # Create Saver to save model
                print "Cycle " + str(epoch) + " out of " + str(num_of_epoch) + " done"
                saver = tf.train.Saver()
                location = saver.save(sess, "saved_models/model")
                print "Model saved to : " + str(location)
def __init__(self, num_of_classes):
    # placeholders
    self.x_placeholder_input
    self.y_placeholder_label
    self.sq_placeholder_seq_length

    self.num_of_classes = num_of_classes
我最初的执行计划是在单独的main.py脚本中创建模型类的实例。之后,取决于模式(预测/训练)。只有这样,我才会通过
train()
将训练数据传递给模型

由于training_数据包含不同步骤的数据(文本文件),因此我需要这些数据才能确定占位符的形状。(类似于本例的序列长度设置部分:)

因此,在我当前的实现中,我只能在选择模式(预测/训练)后创建模型实例,我发现从“训练-->预测”切换到“预测-->训练”将创建多个模型实例时效率低下

那么,我的代码结构是否错误,或者我的原始执行计划是否不正常/常规


当前模型类的完整代码(如果有帮助,如果需要更多,请告诉我):

为什么不能将输入占位符从train移动到init,并让train和predict都使用它?@vijaym,因为由于输入的步骤不同,我无法确定输入占位符的大小。因此,我需要先等待数据,然后初始化占位符。您为什么无法确定输入占位符的大小?。在RNN中,即使序列可能有不同的长度,我们也需要将其填充到固定大小,然后使用它。@vijaym。你说得对。但是,根据我目前对RNN的了解,我需要将其填充到最长长度,因此,我需要获取整个数据集以获得最大长度。但是,您可以脱机处理数据集并计算最大长度。你在训练期间不这样做。为什么你不能将输入占位符从训练移动到初始化,让训练和预测都使用它?@vijaym因为输入的步骤不同,我无法确定输入占位符的大小。因此,我需要先等待数据,然后初始化占位符。您为什么无法确定输入占位符的大小?。在RNN中,即使序列可能有不同的长度,我们也需要将其填充到固定大小,然后使用它。@vijaym。你说得对。但是,根据我目前对RNN的了解,我需要将其填充到最长长度,因此,我需要获取整个数据集以获得最大长度。但是,您可以脱机处理数据集并计算最大长度。你在训练时不这样做。