美文网首页深度学习
神经网络入门 (8)

神经网络入门 (8)

作者: zidea | 来源:发表于2020-08-01 19:52 被阅读0次
MachineLearninginMarketing
hello_world.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 ,然后通过使用优化器来根据差值进行优化从而实现了训练的过程

相关文章

网友评论

    本文标题:神经网络入门 (8)

    本文链接:https://www.haomeiwen.com/subject/nfgqkctx.html