[TensorFlow入门] 线性分类器
2018-04-06 09:56
232 查看
在编写线性分类器之前,我们先来了解一下什么是线性函数。线性函数
当我们想把输入x转化为标签y的时候,比如,把图像分类成数字,我们会推导出一个函数 y=Wx+b。x将是我们的像素值列表,y将是对数,对应每一个数字。让我们来看看y = Wx,其中权重W确定x在预测每个y时的影响。
y = Wx允许我们绘出一条直线将数据对应到各自的标签。 然而,这条线必须通过原点,因为当x等于0,y也等于0。
我们希望能够将线从
4000
原点移开以适应更复杂的数据。最简单的解决方案是给函数添加一个数字,我们称之为“bias”(偏差)。
我们的新函数变为Wx + b,允许我们对线性可分离数据创建预测。让我们使用一个具体的例子并计算结果。
矩阵乘法
a和b分别等于多少呢?转置我们一直使用y = Wx + b函数作为线性函数。 但是有另一个函数做同样的事情,y = xW + b。 这些函数做同样的事情,可以互换,除了涉及的矩阵的维度。
要从一个函数转换到另一个函数,您只需要交换每个矩阵的行和列维度。这称为转置。 TensorFlow使用的是xW + b。
这个例子与之前的是相同的,除了矩阵被转置。 x现在具有尺寸1x3,现在W具有尺寸3x2,并且b现在具有尺寸1x2。 计算结果将产生一个尺寸为1x2的矩阵。 此1x2矩阵中的元素与测验的2x1矩阵中的元素相同。 同样,这些矩阵被简单地转置。
现在,你明白线性函数了吗?下面让我们通过tensorflow来训练这个函数。TensorFlow中的Weights(权重)和Bias(偏差)训练神经网络的目的是修改权重和偏差以最好地预测标签。 为了使用权重和偏差,你需要一个可以修改的Tensor。也就是说不能使用tf.placeholder()和tf.constant(),因为那些Tensors不能被修改。所以这里应该使用tf.Variable。tf.Variable()
用正态分布的随机数初始化权重是一个好的做法。而使权重随机化则有助于避免模型在每次训练时都卡在相同的位置。
类似地,从正态分布选择权重可以防止任何一个权重压倒其他权重。TensorFlow提供了一个tf.truncated_normal()函数从正态分布生成随机数。
tf.truncated_normal()
线性分类器下面让我们使用tenosrflow构建一个线性分类器。
我们将使用TensorFlow的MNIST数据集对手写数字0,1和2进行分类。 以上是您将接受培训的数据的一个小样本。 注意一些1是如何用顶部和不同角度的衬线写的。 相似性和差异将在塑造模型的权重中起到作用。上面的图像是数字0,1和2的训练权重。权重显示他们找到的每个数字的唯一属性。
当我们想把输入x转化为标签y的时候,比如,把图像分类成数字,我们会推导出一个函数 y=Wx+b。x将是我们的像素值列表,y将是对数,对应每一个数字。让我们来看看y = Wx,其中权重W确定x在预测每个y时的影响。
y = Wx允许我们绘出一条直线将数据对应到各自的标签。 然而,这条线必须通过原点,因为当x等于0,y也等于0。
我们希望能够将线从
4000
原点移开以适应更复杂的数据。最简单的解决方案是给函数添加一个数字,我们称之为“bias”(偏差)。
我们的新函数变为Wx + b,允许我们对线性可分离数据创建预测。让我们使用一个具体的例子并计算结果。
矩阵乘法
a和b分别等于多少呢?转置我们一直使用y = Wx + b函数作为线性函数。 但是有另一个函数做同样的事情,y = xW + b。 这些函数做同样的事情,可以互换,除了涉及的矩阵的维度。
要从一个函数转换到另一个函数,您只需要交换每个矩阵的行和列维度。这称为转置。 TensorFlow使用的是xW + b。
这个例子与之前的是相同的,除了矩阵被转置。 x现在具有尺寸1x3,现在W具有尺寸3x2,并且b现在具有尺寸1x2。 计算结果将产生一个尺寸为1x2的矩阵。 此1x2矩阵中的元素与测验的2x1矩阵中的元素相同。 同样,这些矩阵被简单地转置。
现在,你明白线性函数了吗?下面让我们通过tensorflow来训练这个函数。TensorFlow中的Weights(权重)和Bias(偏差)训练神经网络的目的是修改权重和偏差以最好地预测标签。 为了使用权重和偏差,你需要一个可以修改的Tensor。也就是说不能使用tf.placeholder()和tf.constant(),因为那些Tensors不能被修改。所以这里应该使用tf.Variable。tf.Variable()
x = tf.Variable(5)tf.Variable类创建了一个具有可以修改的初始值的张量,很像一个普通的Python变量。 该张量在会话中存储其状态,因此您必须手动初始化张量的状态。使用tf.global_variables_initializer()函数初始化所有可变张量的状态。
init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init)使用tf.Variable类允许我们改变权重和偏差,但是需要选择一个初始值。如上所示,使用session(会话)调用tf.global_variables_initializer()操作。tf.global_variables_initializer()会返回一个操作,从计算图中初始化所有TensorFlow变量。
用正态分布的随机数初始化权重是一个好的做法。而使权重随机化则有助于避免模型在每次训练时都卡在相同的位置。
类似地,从正态分布选择权重可以防止任何一个权重压倒其他权重。TensorFlow提供了一个tf.truncated_normal()函数从正态分布生成随机数。
tf.truncated_normal()
n_features = 120 n_labels = 5 weights = tf.Variable(tf.truncated_normal((n_features, n_labels)))tf.truncated_normal()函数返回具有来自正态分布的随机值的张量,该正态分布的幅度与平均值相差不超过2个标准偏差。由于权重已经帮助防止模型卡住,你不需要再随机化偏差。 在这里最简单的解决方案,将偏差设置为0。tf.zeros()
_labels = 5 bias = tf.Variable(tf.zeros(n_labels))tf.zeros()函数返回具有全零的张量。
线性分类器下面让我们使用tenosrflow构建一个线性分类器。
我们将使用TensorFlow的MNIST数据集对手写数字0,1和2进行分类。 以上是您将接受培训的数据的一个小样本。 注意一些1是如何用顶部和不同角度的衬线写的。 相似性和差异将在塑造模型的权重中起到作用。上面的图像是数字0,1和2的训练权重。权重显示他们找到的每个数字的唯一属性。
# quiz.py # Note: You can't run code in this tab import tensorflow as tf def weights(n_features, n_labels): """ Return TensorFlow weights :param n_features: Number of features :param n_labels: Number of labels :return: TensorFlow weights """ # TODO: Return weights return tf.Variable(tf.truncated_normal((n_features, n_labels))) def biases(n_labels): """ Return TensorFlow bias :param n_labels: Number of labels :return: TensorFlow bias """ # TODO: Return biases return tf.Variable(tf.zeros(n_labels)) def linear(input, w, b): """ Return linear function in TensorFlow :param input: TensorFlow input :param w: TensorFlow weights :param b: TensorFlow biases :return: TensorFlow linear function """ # TODO: Linear Function (xW + b) return tf.add(tf.matmul(input, w), b)
import tensorflow as tf # Sandbox # Note: You can't run code in this tab from tensorflow.examples.tutorials.mnist import input_data from quiz import weights, biases, linear def mnist_features_labels(n_labels): """ Gets the first <n> labels from the MNIST dataset :param n_labels: Number of labels to use :return: Tuple of feature list and label list """ mnist_features = [] mnist_labels = [] mnist = input_data.read_data_sets('/datasets/ud730/mnist', one_hot=True) # In order to make quizzes run faster, we're only looking at 10000 images for mnist_feature, mnist_label in zip(*mnist.train.next_batch(10000)): # Add features and labels if it's for the first <n>th labels if mnist_label[:n_labels].any(): mnist_features.append(mnist_feature) mnist_labels.append(mnist_label[:n_labels]) return mnist_features, mnist_labels # Number of features (28*28 image is 784 features) n_features = 784 # Number of labels n_labels = 3 # Features and Labels features = tf.placeholder(tf.float32) labels = tf.placeholder(tf.float32) # Weights and Biases w = weights(n_features, n_labels) b = biases(n_labels) # Linear Function xW + b logits = linear(features, w, b) # Training data train_features, train_labels = mnist_features_labels(n_labels) with tf.Session() as session: session.run(tf.global_variables_initializer()) # Softmax prediction = tf.nn.softmax(logits) # Cross entropy # This quantifies how far off the predictions were. # You'll learn more about this in future lessons. cross_entropy = -tf.reduce_sum(labels * tf.log(prediction), reduction_indices=1) # Training loss # You'll learn more about this in future lessons. loss = tf.reduce_mean(cross_entropy) # Rate at which the weights are changed # You'll learn more about this in future lessons. learning_rate = 0.08 # Gradient Descent # This is the method used to train the model # You'll learn more about this in future lessons. optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) # Run optimizer and get loss _, l = session.run( [optimizer, loss], feed_dict={features: train_features, labels: train_labels}) # Print loss print('Loss: {}'.format(l))
相关文章推荐
- SVM入门(六)线性分类器的求解――问题的转化,直观角度
- SVM入门(五)线性分类器的求解——问题的描述Part2
- SVM入门(五)线性分类器的求解——问题的描述Part2
- SVM入门(五)线性分类器的求解——问题的描述Part2
- SVM入门(二)线性分类器Part 1
- SVM入门(五)线性分类器的求解——问题的描述Part2
- SVM入门(二)线性分类器Part 1
- SVM入门(二)线性分类器Part 1
- SVM入门(四)线性分类器的求解——问题的描述Part1
- SVM入门(四)线性分类器的求解——问题的描述Part1
- SVM入门(六)线性分类器的求解——问题的转化,直观角度
- SVM入门(四五六)线性分类器的求解
- SVM入门(六)线性分类器的求解——问题的转化,直观角度
- SVM入门(六)线性分类器的求解——问题的转化,直观角度
- SVM入门(三)线性分类器Part 2
- SVM入门(五)线性分类器的求解——问题的描述Part2
- 使用tensorflow自定义线性分类器预测 良/恶性肿瘤
- TensorFlow入门教程:19:线性关系挖掘准备
- SVM入门(三)线性分类器Part 2
- SVM入门(六)线性分类器的求解——问题的转化,直观角度