156 lines
5 KiB
Python
156 lines
5 KiB
Python
|
# Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
import tensorflow as tf
|
||
|
import numpy as np
|
||
|
import os,sys
|
||
|
sys.path.append(os.getcwd())
|
||
|
from utils.sampling import Sampling
|
||
|
|
||
|
sample_number = 100000
|
||
|
|
||
|
np.random.seed(1)
|
||
|
tf.set_random_seed(1)
|
||
|
|
||
|
def top_k_sampling_unit_test():
|
||
|
top_k_sampling = Sampling("top_k")
|
||
|
|
||
|
probs_1 = np.asarray([ [4.0, 3.0, 2.0, 1.0] ])
|
||
|
np_result_1 = [0]
|
||
|
k_1 = 1
|
||
|
tf_result_1 = top_k_sampling.sample(tf.convert_to_tensor(probs_1), k_1)
|
||
|
|
||
|
probs_2 = np.asarray(np.log([ [0.6, 0.4, 0.3, 0.1] ]))
|
||
|
np_result_2 = [0.6, 0.4, 0.0, 0.0]
|
||
|
k_2 = 2
|
||
|
tf_result_2 = top_k_sampling.sample(tf.convert_to_tensor(probs_2), k_2, sample_number)
|
||
|
|
||
|
np_probs_3 = [0.3, 0.4, 0.25, 0.01, 0.05]
|
||
|
probs_3 = np.asarray(np.log([np_probs_3]))
|
||
|
np_result_3 = [0.3, 0.4, 0.25, 0.0, 0.05]
|
||
|
k_3 = 4
|
||
|
tf_result_3 = top_k_sampling.sample(tf.convert_to_tensor(probs_3), k_3, sample_number)
|
||
|
|
||
|
np_probs_4 = [0.3, 0.4, 0.25, 0.01, 0.05]
|
||
|
probs_4 = np.asarray(np.log([np_probs_4]))
|
||
|
np_result_4 = [0.3/0.7, 0.4/0.7, 0.0, 0.00, 0.00]
|
||
|
k_4 = 2
|
||
|
tf_result_4 = top_k_sampling.sample(tf.convert_to_tensor(probs_4), k_4, sample_number)
|
||
|
|
||
|
np_probs_5 = np.random.randn(1, 10000) * 1
|
||
|
np_probs_5 = np.abs(np_probs_5)
|
||
|
np_probs_5[0][0] *= 5
|
||
|
np_result_5 = np_probs_5
|
||
|
k_5 = 10
|
||
|
np_sorted_result_5 = np.sort(np_probs_5)
|
||
|
threshold = np_sorted_result_5[:,-k_5]
|
||
|
mask = np_probs_5 >= threshold
|
||
|
np_result_5 = np_probs_5 * mask
|
||
|
np_result_5[0] = np_result_5[0] / np.sum(np_result_5[0])
|
||
|
tf_result_5 = top_k_sampling.sample(tf.convert_to_tensor(np.log(np_probs_5)), k_5, sample_number)
|
||
|
|
||
|
config = tf.ConfigProto()
|
||
|
config.gpu_options.allow_growth = True
|
||
|
print("[INFO] start the top k sampling unit test.")
|
||
|
with tf.Session(config=config) as sess:
|
||
|
tf_result_1 = sess.run(tf_result_1)
|
||
|
tf_result_1 = np.asarray(tf_result_1).astype(np.int32)
|
||
|
print("[INFO] case_1.")
|
||
|
for i, j in zip(tf_result_1, np_result_1):
|
||
|
assert(i == j)
|
||
|
|
||
|
print("[INFO] case_2.")
|
||
|
tf_result_2 = sess.run(tf_result_2)
|
||
|
p0 = 0
|
||
|
p1 = 0
|
||
|
for i in tf_result_2:
|
||
|
if i == 0:
|
||
|
p0 += 1
|
||
|
elif i == 1:
|
||
|
p1 += 1
|
||
|
print(p0/sample_number, p1/sample_number)
|
||
|
print(np_result_2)
|
||
|
|
||
|
print("[INFO] case_3.")
|
||
|
tf_result_3 = sess.run(tf_result_3)
|
||
|
p = np.zeros_like(np_result_3)
|
||
|
for i in tf_result_3:
|
||
|
p[i] += 1
|
||
|
print(p * 1.0 / sample_number)
|
||
|
print(np_result_3)
|
||
|
|
||
|
print("[INFO] case_4.")
|
||
|
tf_result_4 = sess.run(tf_result_4)
|
||
|
p = np.zeros_like(np_result_4)
|
||
|
for i in tf_result_4:
|
||
|
p[i] += 1
|
||
|
print(p * 1.0 / sample_number)
|
||
|
print(np_result_4)
|
||
|
|
||
|
print("[INFO] case_5.")
|
||
|
tf_result_5 = sess.run(tf_result_5)
|
||
|
p = np.zeros_like(np_result_5)
|
||
|
print(tf_result_5)
|
||
|
for i in tf_result_5:
|
||
|
p[0][i] += 1
|
||
|
for i, j in zip(p[0]/sample_number, np_result_5[0]):
|
||
|
if i != 0 or j != 0:
|
||
|
print(i, j)
|
||
|
|
||
|
|
||
|
|
||
|
def top_p_sampling_unit_test():
|
||
|
top_p_sampling = Sampling("top_p")
|
||
|
|
||
|
np_probs_1 = [0.3, 0.01, 0.4, 0.25, 0.05]
|
||
|
np_result_1 = [0, 0, 1, 0, 0]
|
||
|
p_1 = 0.3
|
||
|
tf_result_1 = top_p_sampling.sample(tf.convert_to_tensor(np.log([np_probs_1])), p_1, sample_number)
|
||
|
|
||
|
np_probs_2 = [0.3, 0.01, 0.4, 0.25, 0.05]
|
||
|
np_result_2 = [3./7, 0, 4./7, 0, 0]
|
||
|
p_2 = 0.5
|
||
|
tf_result_2 = top_p_sampling.sample(tf.convert_to_tensor(np.log([np_probs_2])), p_2, sample_number)
|
||
|
|
||
|
config = tf.ConfigProto()
|
||
|
config.gpu_options.allow_growth = True
|
||
|
print("[INFO] start the top p sampling unit test.")
|
||
|
with tf.Session(config=config) as sess:
|
||
|
|
||
|
print("[INFO] case_1.")
|
||
|
tf_result_1 = sess.run(tf_result_1)
|
||
|
p = np.zeros_like(np_result_1)
|
||
|
for i in tf_result_1:
|
||
|
for j in range(len(p)):
|
||
|
if i == j:
|
||
|
p[j] += 1
|
||
|
print(p * 1.0 / sample_number)
|
||
|
print(np_result_1)
|
||
|
|
||
|
print("[INFO] case_2.")
|
||
|
tf_result_2 = sess.run(tf_result_2)
|
||
|
p = np.zeros_like(np_result_2)
|
||
|
for i in tf_result_2:
|
||
|
for j in range(len(p)):
|
||
|
if i == j:
|
||
|
p[j] += 1
|
||
|
print(p * 1.0 / sample_number)
|
||
|
print(np_result_2)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
top_k_sampling_unit_test()
|
||
|
top_p_sampling_unit_test()
|
||
|
|
||
|
|