![](https://img.haomeiwen.com/i8207483/730a42a46c0e9013.jpg)
![](https://img.haomeiwen.com/i8207483/8bcbf67a3ff4cb6f.png)
这里用的 MNIST 就是一个手写数字图片的数据集,也是经典数据集,可以是神经网络的 helloworld 的数据集了,数据集里面一共有 60,000 个训练样本和10,000个测试样本,每个样本是28x28像素的黑白图片。
import os
from six.moves.urllib.request import urlretrieve
SOURCE_URL = 'https://storage.googleapis.com/cvdf-datasets/mnist/'
#SOURCE_URL = 'http://yann.lecun.com/exdb/mnist/'
# for those who have no access to google storage, use lecun's repo please
WORK_DIRECTORY = "/tmp/mnist-data"
def maybe_download(filename):
"""A helper to download the data files if not present."""
if not os.path.exists(WORK_DIRECTORY):
os.mkdir(WORK_DIRECTORY)
filepath = os.path.join(WORK_DIRECTORY, filename)
if not os.path.exists(filepath):
filepath, _ = urlretrieve(SOURCE_URL + filename, filepath)
statinfo = os.stat(filepath)
print('Successfully downloaded', filename, statinfo.st_size, 'bytes.')
else:
print('Already downloaded', filename)
return filepath
train_data_filename = maybe_download('train-images-idx3-ubyte.gz')
train_labels_filename = maybe_download('train-labels-idx1-ubyte.gz')
test_data_filename = maybe_download('t10k-images-idx3-ubyte.gz')
test_labels_filename = maybe_download('t10k-labels-idx1-ubyte.gz')
图片只有一个通道, 28 x 28 = 784 点输出编码是 one-hot,
我们知道线性方程会得到一个负无穷到正无穷,而经过激活函数的压缩我们会得到一个 0 到 1 之间取值,0 到 1 可以看做概率,也可以理解 0 表示这个神经元不被激活,而 1 表示神经元被激活。
def add_layer(input_data,input_num,output_num,activation_function=None):
# ouptut = input_data * weight + bias
w = tf.Variable(initial_value=tf.random_normal(shape=[input_num,output_num]),trainable=True)
# activation? output = activation_function(output):output
# return output
- input_data 输入数据也就是我们图片像素点所组成一维数组
- input_num 和 output_num 分别代码这一层输入神经元和输出神经元的数量
- activation_function 表示激励函数默认给 None 表示不使用激励函数
定义为 Weight 权重变量
- initial_value=tf.random_normal(shape=[input_num,output_num]) 初始值给一个正态分布的矩阵,矩阵行和列数量是由输入神经元和输出神经元数量来确定的。
- trainable=True 表示我们是否需要优化这个参数
def add_layer(input_data,input_num,output_num,activation_function=None):
# ouptut = input_data * weight + bias
w = tf.Variable(initial_value=tf.random_normal(shape=[input_num,output_num]))
b = tf.Variable(initial_value=tf.random_normal(shape=[1,output_num]))
output = tf.add(tf.matmul(input_data,w),b)
if activation_function:
output = activation_function(output)
return output
然后依旧是创建我们的占位符变量,类型给 float32 形状给shape=[None,784],None 表示我们还不知道有多少样本,784 表示每张图片的像素点数量。
x = tf.placeholder(dtype=tf.float32,shape=[None,784],name='x')
y = tf.placeholder(dtype=tf.float32,shape=[None,10],name='y')
定义神经网络结构
def build_nn(data):
hidden_layer1 = add_layer(data,784,100,activation_function=tf.nn.sigmoid)
hidden_layer2 = add_layer(hidden_layer1, 100,50,activation_function=tf.nn.sigmoid)
output_layer = add_layer(hidden_layer2,50,10)
return output_layer
- 第一个隐藏层,输入为 784 的 tensor,输出 100 ,激活函数指定为 sigmoid
- 第二隐藏层,将第一层的结果作为第二层输入,然后输出为 50 ,激活函数使用的也是 sigmoid
- 输出为 10 的原因是每张图片可能出现数值是从 0 到 9 中的一个数字,所以输出 10 每一个维度表示该图片属于某一个数字的概率
定义训练方法
def train_nn(data):
output = build_nn(data)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=output))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1).minimize(loss)
其实训练也就是这种有监视的训练,是不断对比返回值和期望值的差值 loss ,然后通过使用优化器来根据差值进行优化从而实现了训练的过程
网友评论