【问题标题】:How to convert a tensorflow Graph into using the Estimator API如何将张量流图转换为使用 Estimator API
【发布时间】:2018-10-25 10:12:59
【问题描述】:

我在尝试将我的 tensorflow 代码转换为使用 Estimator API 时有点卡住了

我的图表在下面

batch_size = 1024

embedding_size = 500 # 2^8 Dimension of the embedding vector. Crashed at 158 for Embed size 2656016. So possible values are 154-157. Possible choices 154, 156
num_inputs =5

num_sampled = 128 # Number of negative examples to sample.

graph = tf.Graph()

with graph.as_default(): 

    train_dataset = tf.placeholder(tf.int32, shape=[batch_size, num_inputs ])
    train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])

    epochCount = tf.get_variable( 'epochCount', initializer= 0) #to store epoch count to total # of epochs are known
    update_epoch = tf.assign(epochCount, epochCount + 1)

    embeddings = tf.get_variable( 'embeddings', dtype=tf.float32,
        initializer= tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0, dtype=tf.float32) )

    softmax_weights = tf.get_variable( 'softmax_weights', dtype=tf.float32,
        initializer= tf.truncated_normal([vocabulary_size, embedding_size],
                             stddev=1.0 / math.sqrt(embedding_size), dtype=tf.float32 ) )

    softmax_biases = tf.get_variable('softmax_biases', dtype=tf.float32,
        initializer= tf.zeros([vocabulary_size], dtype=tf.float32),  trainable=False )

    embed = tf.nn.embedding_lookup(embeddings, train_dataset) #train data set is

    embed_reshaped = tf.reshape( embed, [batch_size*num_inputs, embedding_size] )

    segments= np.arange(batch_size).repeat(num_inputs)

    averaged_embeds = tf.segment_mean(embed_reshaped, segments, name=None)

    loss = tf.reduce_mean(
        tf.nn.sampled_softmax_loss(weights=softmax_weights, biases=softmax_biases, inputs=averaged_embeds, 
                                   sampled_values=tf.nn.uniform_candidate_sampler(true_classes=tf.cast(train_labels, tf.int64), num_sampled=num_sampled, num_true=1, unique=True, range_max=vocabulary_size, seed=None),
                                   labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size)) 

    optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss) 

    saver = tf.train.Saver()

我正在阅读官方的 Estimator 指南

https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator

我最好的解释是我必须将我的图表转换成一个函数?并将其设置为model_fn?

'params' 是我的嵌入和 softmax 权重。那么我要在这里明确命名这些变量吗?

编辑:

感谢 Sorin 的回答,这是我尝试将其转换为使用 TF.Estimator

这是我用来生成批量数据的函数。

data_index = 0 epoch_index = 0 recEpoch_indexA = 0 #用于帮助保存模型的 epoch 总数

def generate_batch(batch_size, inputCount): #batch size = number of labels
  #inputCount = number of inputs per label
    global data_index, epoch_index

    batch = np.ndarray(shape=(batch_size, inputCount), dtype=np.int32) 
    labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)

    #Begin New stuff

    n=0
    while n < batch_size:
      if len(    set(my_data[data_index, 1])   ) >= inputCount:
        labels[n,0] = my_data[data_index, 0]
        batch[n] = random.sample( set(my_data[data_index, 1]),  inputCount)
        n = n+1
        data_index = (data_index + 1) % len(my_data) #may have to do something like len my_data[:]
        if data_index == 0:
          epoch_index = epoch_index + 1
          print('Completed %d Epochs' % epoch_index)
      else:
        data_index = (data_index + 1) % len(my_data)
        if data_index == 0:
          epoch_index = epoch_index + 1
          print('Completed %d Epochs' % epoch_index)

    return batch, labels     

这是我定义模型函数的地方。我注释掉了占位符,并输入了火车数据和火车标签作为输入

def my_model( train_dataset, train_labels):

#     train_dataset = tf.placeholder(tf.int32, shape=[batch_size, num_inputs ])
#     train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])

    epochCount = tf.get_variable( 'epochCount', initializer= 0) #to store epoch count to total # of epochs are known
    update_epoch = tf.assign(epochCount, epochCount + 1)

    embeddings = tf.get_variable( 'embeddings', dtype=tf.float32,
        initializer= tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0, dtype=tf.float32) )

    softmax_weights = tf.get_variable( 'softmax_weights', dtype=tf.float32,
        initializer= tf.truncated_normal([vocabulary_size, embedding_size],
                             stddev=1.0 / math.sqrt(embedding_size), dtype=tf.float32 ) )

    softmax_biases = tf.get_variable('softmax_biases', dtype=tf.float32,
        initializer= tf.zeros([vocabulary_size], dtype=tf.float32),  trainable=False )

    embed = tf.nn.embedding_lookup(embeddings, train_dataset) #train data set is

    embed_reshaped = tf.reshape( embed, [batch_size*num_inputs, embedding_size] )

    segments= np.arange(batch_size).repeat(num_inputs)

    averaged_embeds = tf.segment_mean(embed_reshaped, segments, name=None)

    loss = tf.reduce_mean(
        tf.nn.sampled_softmax_loss(weights=softmax_weights, biases=softmax_biases, inputs=averaged_embeds, 
                                   sampled_values=tf.nn.uniform_candidate_sampler(true_classes=tf.cast(train_labels, tf.int64), num_sampled=num_sampled, num_true=1, unique=True, range_max=vocabulary_size, seed=None),
                                   labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size)) 

    optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss) 

    saver = tf.train.Saver()

这是我定义估算器的地方

#Define the estimator
word2vecEstimator = tf.estimator.Estimator(
        model_fn=my_model,
        params={
            'batch_size': 1024,
            'embedding_size': 50,
            'num_inputs': 5,
            'num_sampled':128
        })

这是我告诉 Estimator 训练的地方

#Train with Estimator
word2vecEstimator.train(
    input_fn=lambda:iris_data.generate_batch(batch_size, num_inputs),
    steps=1000)

这看起来对吗?

另外,经过一定的步骤后,我想保存检查点并将其上传到我的谷歌驱动器。我想知道如何/在哪里放置代码来做到这一点。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    你是对的,model_fn 是要走的路。

    Params 更多的是关于超参数。您拥有的任何变量都应该保留在模型中(原样)。

    您的新函数中不应包含任何占位符。它们来自特征和标签。

    需要注意的一点是,为预测、训练和评估调用了相同的函数。使用mode参数来区分。这也意味着当您进行预测时 label 为 None,因此请确保代码在这种情况下正常工作。

    【讨论】:

    • 感谢您的建议。我试图实现它,我尝试编辑了上面的答案。另外,经过一定的步骤后,我想保存检查点并将其上传到我的谷歌驱动器。我想知道如何/在哪里放置代码来做到这一点。
    • @SantoshGupta7 这是最简单的部分。在您完成word2vecEstimator.train(...) 之后,您致电word2vecEstimator.export_saved_model(...)。您需要提供另一个输入函数来匹配您计划使用模型的方式(不解析标签,不洗牌,诸如此类)。
    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2016-09-12
    • 2021-11-25
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多