赞
踩
假如是人脸识别,神经网络模型应该怎么建立呢?为了简单起见,输入层的每个节点代表图片的某个像素,难道和前面一样直接通过输入到大输出神经元吗?当物体特征比较复杂时,我们可以对物体特征进行拆分识别。试着将这个问题分解为一些列的子问题,比如
不管是单层感知机还是多个感知器,只要不带激活函数,都只能解决线性可分的问题。解决不了我们的线性不可分问题。不信,那我们就在平面中画几条直线试试,结果发现这几条直线无论在平面中如何旋转,都不能完全正确的分开三角形和圆点。
tanh是双曲函数中的一个,tanh()为双曲正切,值域:(-1,1) 之间
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
x = np.arange(-5.0, 5.0, 0.1)
# y = np.tanh(x)
y = tf.nn.tanh(x)
with tf.Session() as sess:
plt.plot(x, sess.run(y))
plt.show()
当学习率为0.05时,100次学习可以得到70%正确率, 1000次学习可以得到85%正确率, 2000次学习可以得到94%正确率
import tensorflow as tf # 别名一般tf # 深度学习目前最大的制约就是学习的数据样本 from tensorflow.examples.tutorials.mnist import input_data # 获取手写数字图片素材 mnist = input_data.read_data_sets("../data/input_data", one_hot=True) # 查看训练集的图片信息 images.shape = (55000, 784) # (55000, 784) 55000个图(样本),每个样本有784个特征(因为图片尺寸28*28大小) print(mnist.test.images.shape) # (55000,10) : 每次预测时候输出不是1个值,而是0-9的概率 print(mnist.test.labels.shape) # 获取手写数字图片素材 mnist = input_data.read_data_sets("../data/input_data", one_hot=True) # (55000,784) ==> (100,784) 通过占位符构建特征值 X = tf.placeholder(dtype=tf.float32, shape=(None, 784)) # (55000,10) 通过占位符构建目标值 y = tf.placeholder(dtype=tf.int8, shape=(None, 10)) # 输入层 784,第一个隐藏层500个神经元,则权重为 [784,500] 偏置为[500] W1 = tf.Variable(initial_value=tf.random_normal(shape=(784, 500), mean=0)) b1 = tf.Variable(initial_value=tf.zeros([500])) # 隐藏层输出结果为 [None,784] ~ [784,500] ===> [None,500] # tanh为激活函数 L1 = tf.nn.tanh(tf.matmul(X, W1) + b1) # 第二层隐藏层, 接受500个特征值, 输出300个特征值,因此 W2 = tf.Variable(initial_value=tf.random_normal(shape=(500, 300), mean=0)) b2 = tf.Variable(initial_value=tf.zeros([300])) # 隐藏层输出结果为 [None,500] ~ [500,300] ===> [None,300] L2 = tf.nn.tanh(tf.matmul(L1, W2) + b2) W3 = tf.Variable(initial_value=tf.random_normal(shape=(300, 10))) b3 = tf.Variable(initial_value=tf.zeros([10])) # 预测值 = 权重 * X + 偏置 y_predict = tf.matmul(L2, W3) + b3 # 获取误差值(损失) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_predict)) # 梯度下降减少损失 train_op = tf.train.GradientDescentOptimizer(0.05).minimize(loss) # 计算命中率 equal_list = tf.equal(tf.argmax(y, axis=1), tf.argmax(y_predict, axis=1)) accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32)) # 获取sess开启会话 with tf.Session() as sess: # 初始化变量 sess.run(tf.global_variables_initializer()) for i in range(2000): # 100 70% # 1000 -> 85% # 2000 -> 94% # 5000 --> 94% # 获取图片的特征值(55,784), 目标值(55,10) mnist_image, mnist_label = mnist.train.next_batch(55) d = {X: mnist_image, y: mnist_label} sess.run(train_op, feed_dict=d) print(f'第{i + 1}次训练时正确率为:{sess.run(accuracy, feed_dict=d)}')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。