深度学习

神经网络入门 (8)

2020-08-01  本文已影响0人  zidea
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
    

定义为 Weight 权重变量

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
    

定义训练方法

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 ,然后通过使用优化器来根据差值进行优化从而实现了训练的过程

上一篇 下一篇

猜你喜欢

热点阅读