当前位置:   article > 正文

python深度学习stadardscalar fit_transform数据处理、contrib使用、Session多种创建、in_top_k、argmax、equal、cas、extend map_pythonstandardscaler().fit_transform在做什么

pythonstandardscaler().fit_transform在做什么

1、StadardScalar()与fit_transform()

  其StadardScalar是去均值和进行方差归一化,其是对数据的每一个特征维度进行的操作,即对所有最小的元素进行操作,而不是针对一个样本。其要完成这个功能需要配合fit_transform()函数进行。

其实例代码如下:

  1. # coding=utf-8
  2. # 统计训练集的 mean 和 std 信息
  3. from sklearn.preprocessing import StandardScaler
  4. import numpy as np
  5. def test_algorithm():
  6. np.random.seed(123)
  7. print('use sklearn')
  8. # 注:shape of data: [n_samples, n_features]
  9. data = np.random.randn(10, 4)
  10. scaler = StandardScaler()
  11. scaler.fit(data)
  12. trans_data = scaler.transform(data)
  13. print('original data: ')
  14. print data
  15. print('transformed data: ')
  16. print trans_data
  17. print('scaler info: scaler.mean_: {}, scaler.var_: {}'.format(scaler.mean_, scaler.var_))
  18. print('\n')
  19. print('use numpy by self')
  20. mean = np.mean(data, axis=0)
  21. std = np.std(data, axis=0)
  22. var = std * std
  23. print('mean: {}, std: {}, var: {}'.format(mean, std, var))
  24. # numpy 的广播功能
  25. another_trans_data = data - mean
  26. # 注:是除以标准差
  27. another_trans_data = another_trans_data / std
  28. print('another_trans_data: ')
  29. print another_trans_data
  30. if __name__ == '__main__':
  31. test_algorithm()

其输出数据为:

  1. use sklearn
  2. original data:
  3. [[-1.0856306 0.99734545 0.2829785 - 1.50629471]
  4. [-0.57860025 1.65143654 - 2.42667924 - 0.42891263]
  5. [1.26593626 - 0.8667404 - 0.67888615 - 0.09470897]
  6. [1.49138963 - 0.638902 - 0.44398196 - 0.43435128]
  7. [2.20593008
  8. 2.18678609
  9. 1.0040539
  10. 0.3861864]
  11. [0.73736858 1.49073203 - 0.93583387 1.17582904]
  12. [-1.25388067 - 0.6377515
  13. 0.9071052 - 1.4286807]
  14. [-0.14006872 - 0.8617549 - 0.25561937 - 2.79858911]
  15. [-1.7715331 - 0.69987723
  16. 0.92746243 - 0.17363568]
  17. [0.00284592 0.68822271 - 0.87953634 0.28362732]]
  18. transformed
  19. data:
  20. [[-0.94511643 0.58665507 0.5223171 - 0.93064483]
  21. [-0.53659117 1.16247784 - 2.13366794 0.06768082]
  22. [0.9495916 - 1.05437488 - 0.42049501
  23. 0.3773612]
  24. [1.13124423 - 0.85379954 - 0.19024378 0.06264126]
  25. [1.70696485
  26. 1.63376764
  27. 1.22910949
  28. 0.8229693]
  29. [0.52371324 1.02100318 - 0.67235312 1.55466934]
  30. [-1.08067913 - 0.85278672
  31. 1.13408114 - 0.858726]
  32. [-0.18325687 - 1.04998594 - 0.00561227 - 2.1281129]
  33. [-1.49776284 - 0.9074785
  34. 1.15403514
  35. 0.30422599]
  36. [-0.06810748 0.31452186 - 0.61717074 0.72793583]]
  37. scaler info: scaler.mean_: [0.08737571 0.33094968 - 0.24989369 - 0.50195303], scaler.var_: [1.54038781 1.29032409
  38. 1.04082479 1.16464894]
  39. use numpy by self
  40. mean: [0.08737571 0.33094968 - 0.24989369 - 0.50195303], std: [1.24112361 1.13592433 1.02020821
  41. 1.07918902], var: [1.54038781 1.29032409
  42. 1.04082479 1.16464894]
  43. another_trans_data:
  44. [[-0.94511643 0.58665507 0.5223171 - 0.93064483]
  45. [-0.53659117 1.16247784 - 2.13366794 0.06768082]
  46. [0.9495916 - 1.05437488 - 0.42049501
  47. 0.3773612]
  48. [1.13124423 - 0.85379954 - 0.19024378 0.06264126]
  49. [1.70696485
  50. 1.63376764
  51. 1.22910949
  52. 0.8229693]
  53. [0.52371324 1.02100318 - 0.67235312 1.55466934]
  54. [-1.08067913 - 0.85278672
  55. 1.13408114 - 0.858726]
  56. [-0.18325687 - 1.04998594 - 0.00561227 - 2.1281129]
  57. [-1.49776284 - 0.9074785
  58. 1.15403514
  59. 0.30422599]
  60. [-0.06810748 0.31452186 - 0.61717074 0.72793583]]

 

2、tensorflow的第三方库contrib的输入使用方法:

 如果直接通过下面代码使用其里面的函数则会出现无法智能提示的问题:

  1. import tensorflow as tf
  2. initializer = tf.contrib.layers.variance_scaling_initializer()

其解决方法是直接使用下面的代码,则可以智能提示layers里面的函数:

  1. import tensorflow.contrib as contrib
  2. initializer = tf.contrib.layers.variance_scaling_initializer()
  3. initializer=contib.layers.variance_scaling_initializer()

3、Session()会话的多种应用创建方式:

   如果我们想获取网络的过程中的某些tensor变量,则要通过会话来进行获取,然后把tensor转换为我们能处理的array,此时可以使用到的函数是eval()、run().其使用涉及到Session()的创建。下面就是方法:

方法一:

  1. # 改写训练代码
  2. sess = tf.Session()
  3. sess.run(init)
  4. # 要加上这句代码,如果不加的画则下面只能使用run()来运行每一个会话,而不能使用eval()
  5. with sess.as_default():
  6. init.run()
  7. for epoch in range(n_epochs):
  8. n_batches = mnist.train.num_examples // batch_size
  9. for i in range(n_batches):
  10. print("\r{}%".format(100*i//n_batches),end='')
  11. X_train, Y_train = mnist.train.next_batch(batch_size)
  12. sess.run(training_op, feed_dict={X: X_train})
  13. # 通过run获去的变量也是一个array,
  14. # loss_train=sess.run(reconstruction_loss,feed_dict={X:X_train})
  15. # 此时可以不使用run,直接使用eval,把这个tensor变量转换为array,
  16. loss_train = reconstruction_loss.eval(feed_dict={X: X_train})
  17. print("\r{} loss:{}".format(epoch, loss_train))
  18. sess.close()

还有更简洁的代码,方法二:

  1. # 要加上这句代码,如果不加的画则下面只能使用run()来运行每一个会话,而不能使用eval()
  2. with tf.Session() as sess:
  3. init.run()
  4. for epoch in range(n_epochs):
  5. n_batches = mnist.train.num_examples // batch_size
  6. for i in range(n_batches):
  7. print("\r{}%".format(100*i//n_batches),end='')
  8. X_train, Y_train = mnist.train.next_batch(batch_size)
  9. sess.run(training_op, feed_dict={X: X_train})
  10. # 通过run获去的变量也是一个array,
  11. # loss_train=sess.run(reconstruction_loss,feed_dict={X:X_train})
  12. # 此时可以不使用run,直接使用eval,把这个tensor变量转换为array,
  13. loss_train = reconstruction_loss.eval(feed_dict={X: X_train})
  14. print("\r{} loss:{}".format(epoch, loss_train))
  15. # 注释这句,因为使用当Session()离开作用域的时候会自动释放这个Session()
  16. # sess.close()

只能使用run(),而不能使用eval()的方式三:

  1. # 改写训练代码
  2. sess = tf.Session()
  3. sess.run(init)
  4. for epoch in range(n_epochs):
  5. n_batches = mnist.train.num_examples // batch_size
  6. for i in range(n_batches):
  7. print("\r{}%".format(100 * i // n_batches), end='')
  8. X_train, Y_train = mnist.train.next_batch(batch_size)
  9. sess.run(training_op, feed_dict={X: X_train})
  10. # 通过run获去的变量也是一个array,
  11. loss_train=sess.run(reconstruction_loss,feed_dict={X:X_train})
  12. # 不能使用这一句,否者会报错
  13. # loss_train = reconstruction_loss.eval(feed_dict={X: X_train})
  14. print("\r{} loss:{}".format(epoch, loss_train))
  15. # 要不要这句都无所谓,程序运行完会自动释放
  16. sess.close()

  从上面的方式总结得出:使用sess.run()方法是在每一种形势下都适用。而eval只有在一、二模式下才可以使用。第三种模式会报错。

4、在网络输出的时候计算准确度的方法:

   第一种:是使用in_top_k()函数用来计算logits里的最大top_k里的值的index里有没有跟y想等的值,如果有则是返回True,否则返回False。来进行计算平均准确度,下面是以mnist数据集为例子,其代码如下: 

  1. correct = tf.nn.in_top_k(logits, y, 1)
  2. accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

上面的y是就是通过

X_train, Y_train = mnist.train.next_batch(n_batch_size)

Y_train传递进来的数据。其是一个0-9的标签值而不是0、1的标签值。这种情况适用于在加载手写字时没用了one_hot参数,其如下:

mnist = input_data.read_data_sets("MNIST_data/")

第二种:在使用了one_hot参数后则其计算准确度的方式为:

  1. correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
  2. accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

这时是使用了one_hot参数的情况下的:

  1. mnist = input_data.read_data_sets(LOGDIR, one_hot=True)

这时加载的标签值时0、1的。这个时候就需要使用到argmax()函数来进行返回标签的位置,即其输出值跟上面的第一种的y的值一样大小

5、在计算网络准确度的方式使用到的相关函数:

一、tf.argmax()、tf.equal()、tf.cast()

  1. import tensorflow as tf
  2. import numpy as np
  3. A = [[1, 3, 4]]
  4. B = [[4, 3, 1]]
  5. with tf.Session() as sess:
  6. # 其中argmax的是返回最大值的index位置从0开始
  7. print(sess.run(tf.argmax(A, 1)))
  8. print(sess.run(tf.argmax(B, 1)))
  9. print(sess.run(tf.equal(A, B)))
  10. print(sess.run(tf.cast(tf.equal(A, B),dtype=tf.float32)))
  11. print(sess.run(tf.reduce_mean(tf.cast(tf.equal(A, B), tf.float32))))

其输出结果是:

  1. [2]
  2. [0]
  3. [[False True False]]
  4. [[0. 1. 0.]]
  5. 0.33333334

下面是使用argmax()、max()、extend()、map()等的使用:

  1. import copy
  2. import tensorflow as tf
  3. import numpy as np
  4. import numpy as np
  5. import tensorflow as tf
  6. def main(labels):
  7. label = labels
  8. label_list = []
  9. for label in labels:
  10. # extend在label_list后面追加元素,map是对第二个参数的数据使用第一个参数进行对应的操作变化
  11. label_list.extend(map(int, list(label)))
  12. #整个数组进行加1操作
  13. label_list = np.array(label_list) + 1
  14. print(label_list)
  15. # 在[0,1]之间产生一个3*3的矩阵
  16. datas = tf.Variable(tf.random_uniform((3, 3), minval=0, maxval=1))
  17. with tf.Session() as session:
  18. #当有声明的tf.Variable变量时,其都需要使用会话来真正初始化变量,tf.initialize_all_variables(),如果没有这句的话,datas变量是可以通过eval()查看到有值,但是此时看到的值并不是这个变量真正的值。从而就导致tf.argmax(datas, axis=1)输出来的index跟实际看到的结果不一致。
  19. session.run(tf.initialize_all_variables())
  20. print(datas.eval())
  21. # 返回datas变量对应维度的最大值index。其一般被用在
  22. datamax = tf.argmax(datas, axis=1)
  23. print(datamax.eval())
  24. # 在[0,1.2]间隔0.2产生一个2*3的矩阵,当无法产生对应矩阵时会报错
  25. datanp = np.arange(0, 1.2, .2).reshape(2, 3)
  26. print(datanp)
  27. datanpmax = np.max(datanp, axis=1) # 维度不一致回报错,返回对应维度的最大值,不是index
  28. print(datanpmax)
  29. #这里的max跟上面的np.max的效果一样的
  30. print(datanp.max(1))
  31. # print(label_list.type())
  32. # # 这个方法把一个list直接转换成一个tensor
  33. # print(torch.IntTensor([18] * int(32)))
  34. if __name__ == '__main__':
  35. main([[1, 2, 3, 5, 2, 4]])

输出结果为:

  1. [2 3 4 6 3 5]
  2. [[0.6428882 0.3081398 0.5051584 ]
  3. [0.750348 0.9321439 0.9986844 ]
  4. [0.9667671 0.48763072 0.12574685]]
  5. [0 2 0]
  6. [[0. 0.2 0.4]
  7. [0.6 0.8 1. ]]
  8. Backend Qt5Agg is interactive backend. Turning interactive mode on.
  9. [0.4 1. ]
  10. [0.4 1. ]

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/174545?site
推荐阅读
相关标签
  

闽ICP备14008679号