tf.nn.nce_loss 函数应用案例

tf.nn.nce_loss(
    weights,
    biases,
    labels,
    inputs,
    num_sampled,
    num_classes,
    num_true=1,
    sampled_values=None,
    remove_accidental_hits=False,
    partition_strategy='mod',
    name='nce_loss'
)

 对于 nce_loss 的了解源于 word2vec,主要是通过 负采样的方式减少 softmax 函数的计算,具体函数值讲解,可以字节看疼我tensorflow,这里提供一个简单的案例,说明怎么使用 nce_loss。

import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import math

train_loss_lst = []
train_accuracy_lst = []
test_accuracy_lst = []

def deepn(x):
    """
    Args:
        x: an input tensor with the dimensions (N_examples, 784), where 784 is the
        number of pixels in a standard MNIST image.
    Returns:
        y: (N_examples, 64)
    X(N_examples, 784) x w1(784, 64) + b1(64,) = y(N_examples, 64)
    """
    w1 = tf.Variable(initial_value=tf.truncated_normal(shape=[784, 64]),name="w1")
    b1 = tf.Variable(initial_value=tf.random_uniform(shape=[64,], minval=0, maxval=1))

    fc1 = tf.matmul(x, w1) + b1
    keep_prob = tf.placeholder(tf.float32)
    fc1_drop = tf.nn.dropout(fc1, keep_prob)
    return fc1_drop, keep_prob


def main():
    # Import data
    mnist = input_data.read_data_sets("/mnist_data", one_hot=True)
    X = tf.placeholder(tf.float32, [None, 784])
    y_ = tf.placeholder(tf.float32, [None, 10])
    y_idx = tf.placeholder(tf.float32, [None, 1])

    fc1_drop, keep_prob = deepn(X)

    num_sampled = 1
    vocabulary_size = 10
    embedding_size = 64

    nce_weights = tf.Variable(tf.truncated_normal([vocabulary_size, embedding_size],
                                            stddev=1.0/math.sqrt(embedding_size)),
                        name="embed"
                        )
    nce_biases = tf.Variable(tf.zeros([vocabulary_size]))
    loss = tf.reduce_mean(
        tf.nn.nce_loss(weights=nce_weights,
                       biases=nce_biases,
                       labels=y_idx,
                       inputs=fc1_drop,
                       num_sampled=num_sampled,
                       num_classes=vocabulary_size),
    )
    train_step = tf.train.AdamOptimizer(1e-4).minimize(loss)

    output = tf.matmul(fc1_drop, tf.transpose(nce_weights)) + nce_biases
    correct_prediction = tf.equal(tf.argmax(output, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for i in range(20000):
            print("num: %d"%i)
            batch = mnist.train.next_batch(20)
            idx_ = np.argmax(batch[1], axis=1)[:, np.newaxis].astype("float32")
            train_accuracy, train_loss, _ = sess.run([accuracy, loss, train_step],
                                                     feed_dict={X: batch[0],
                                                                y_: batch[1],
                                                                y_idx: idx_,
                                                                keep_prob: 1.0})
            print("loss: ", train_loss)
            print("train accuracy: ", train_accuracy)

            idx_ = np.argmax(mnist.test.labels, axis=1)[:, np.newaxis].astype("float32")
            test_accuracy = sess.run(accuracy,
                                     feed_dict={X: mnist.test.images,
                                                y_: mnist.test.labels,
                                                y_idx: idx_,
                                                keep_prob: 1.0})
            print("test accuracy: ", test_accuracy)
            train_loss_lst.append(train_loss)
            train_accuracy_lst.append(train_accuracy)
            test_accuracy_lst.append(test_accuracy)

def test():
    mnist = input_data.read_data_sets("./mnist_data", one_hot=True)
    X = tf.placeholder(tf.float32, [None, 784])
    fc1_drop, keep_prob = deepn(X)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for i in range(2):
            batch = mnist.train.next_batch(20)
            idx_ = np.argmax(batch[1], axis=1)[:, np.newaxis].astype("float32")
            fc1 = sess.run([fc1_drop], feed_dict={X: batch[0], keep_prob:1.0})
            print(np.array(fc1).shape)

main()
def summary(x, tag, path):
    """
    根据提供的 x 列表绘制曲线
    """
    print(x)
    loss = 0.0
    # tf.summary模块的定义位于summary.py文件中,该文件中主要定义了在进行可视化将要用到的各种函数
    loss_summary = tf.Summary()
    # 调用tf.summary.Summary.Value子类
    loss_summary.value.add(tag=tag, simple_value=loss)  # tag就是待会产生的图标名称

    with tf.Session() as sess:
    # 生成一个写日志的writer,将当前tensorflow计算图写入日志。
        summary_writer1 = tf.summary.FileWriter(path, sess.graph)
        tf.global_variables_initializer().run()
        for i in range(len(x)):
            # 固定用法,具体为什么我也不懂
            loss_summary.value[0].simple_value = x[i]
            summary_writer1.add_summary(loss_summary, i)

summary(train_loss_lst, tag="loss", path="./train_loss")
summary(train_accuracy_lst, tag="accuracy", path="./train_accuracy")
summary(test_accuracy_lst, tag="accuracy", path="./test_accuracy")

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值