我是靠谱客的博主 知性咖啡豆,最近开发中收集的这篇文章主要介绍Tensorflow(1.15.0)利用全连接网络将图片进行分类,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#-*- codeing = utf-8 -*-
#@Time :2021/5/16 19:02
#@Author :Onion
#@File :MnistByHidden_Layers.py
#@Software :PyCharm

# 利用全连接网络将图片进行分类
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
tf.compat.v1.disable_eager_execution()
# 获取MNIST数据
mnist = input_data.read_data_sets("/data/", one_hot=True)
tf.compat.v1.disable_v2_behavior()
tf.compat.v1.disable_eager_execution()
tf.compat.v1.reset_default_graph()
# 定义参数
learning_rate = 0.001
training_epochs = 200
batch_size = 100
display_step = 1
# 设置网络结构 784维输入-->256隐藏-->256隐藏-->10输出

n_hidden1 = 256
n_hidden2 = 256
n_input = 784
n_labels = 10

# 输入数据x和y,y是图片的标签数据
x = tf.compat.v1.placeholder("float", [None, n_input])
y = tf.compat.v1.placeholder("float", [None, n_labels])


# 定义构建网络的函数,返回结果为pred,输入参数:为了构建网络,要把输入值x,权重weight,偏置bias传进来,因为网络层数不止一层,这里的weight和bias都是字典类型的
def multilayer_perceptron(x, weight, bias):
    # Hidden layer with RELU activation
    layer_1 = tf.add(tf.matmul(x, weight['h1']), bias['b1'])
    layer_1 = tf.nn.relu(layer_1)
    # Hidden layer with RELU activation
    layer_2 = tf.add(tf.matmul(layer_1, weight['h2']), bias['b2'])
    layer_2 = tf.nn.relu(layer_2)
    # Output layer with linear activation
    out_layer = tf.matmul(layer_2, weight['out']) + bias['out']
    return out_layer

# 定义权重和偏置参数
weight = {
    'h1':tf.Variable(tf.compat.v1.random_normal([n_input, n_hidden1])),
    'h2':tf.Variable(tf.compat.v1.random_normal([n_hidden1, n_hidden2])),
    'out': tf.Variable(tf.compat.v1.random_normal([n_hidden2, n_labels]))
}
bias = {
    'b1': tf.Variable(tf.compat.v1.random_normal([n_hidden1])),
    'b2': tf.Variable(tf.compat.v1.random_normal([n_hidden2])),
    'out': tf.Variable(tf.compat.v1.random_normal([n_labels]))
}

# 定义前向传播(构建网络)
# 当层数比较多的时候,可以将构建网络的操作封装在一个函数中,该函数直接返回输出的pred
# 当pred给出之后,使用sotfmax将结果映射到0~1之间,以标准的one-hot格式输出,来间接表示概率
pred = multilayer_perceptron(x,weight,bias)

# 定义损失函数(因为输入的数据是分类标签类数据,使用交叉熵损失函数)
# 使用sotfmax进行映射,这里使用一个tf的Api(tf.nn.softmax_cross_entropy_with_logits),可以直接给输出层做softmax映射并自动计算损失函数
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))

# 定义优化器optimizer
train = tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate)
optimizer = train.minimize(cost)

# 初始化变量
with tf.compat.v1.Session() as sess:
    sess.run(tf.compat.v1.global_variables_initializer())
    for epoch in range(training_epochs):
        # 定义每一轮训练的平均损失(和每一个batch计算出来的损失是有区别的,需要注意,这个是把所有的batch里计算的一个再次取平均)
        avg_loss = 0.
        # 用训练集的总数据量除以每一个batch的数据量得到总共分成了多少各batch
        total_batch = int(mnist.train.num_examples / batch_size)
        for i in range(total_batch):
            # 这里next_batch(batch_size)直接把一个batch里的所有图片数据取出来训练
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            # optimizer不会更新,因此返回的位置为空值,用一个,隔开,每一各batch都会计算出一个平均损失值,返回给变量c
            _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,y: batch_ys})
            avg_loss += c/total_batch
            # 显示训练中的详细信息
        if epoch % display_step == 0:
            print("Epoch:", '%04d' % (epoch + 1), "cost=", 
                "{:.9f}".format(avg_loss))
    print(" Finished!")
    # 测试 model
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    # 计算准确率
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))


在这里插入图片描述
这里顺便说一下过拟合的正则化,在Tensorflow中,L2正则化的函数为tf.nn.l2_loss(t,name=None),L1正则化没有现成的函数,使用tf.reduce_sum(tf.abs(w))来组合即可

例如

reg = 0.01 # λ(reg)是一个可以调节的参数,用来控制正则化对loss的影响
loss = tf.reduce_mean((y_pred-y)**2)+tf.nn.l2_loss(weights['h1'])*reg+tf.nn.l2_loss(weights['h2'])*reg

最后

以上就是知性咖啡豆为你收集整理的Tensorflow(1.15.0)利用全连接网络将图片进行分类的全部内容,希望文章能够帮你解决Tensorflow(1.15.0)利用全连接网络将图片进行分类所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部