利用全连接网络将图片分类

一 实例描述
构建一个简单的多层神经网络,以拟合MNIST样本特征完成分类任务。

二 代码
import tensorflow as tf
# 导入 MINST 数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/data/", one_hot=True)
#定义网络参数
'''
在输入层和输出层之间使用两个隐藏层,每层256个节点,学习率使用0.001。
'''
learning_rate = 0.001
training_epochs = 25
batch_size = 100
display_step = 1
# Network Parameters
n_hidden_1 = 256 # 1st layer number of features
n_hidden_2 = 256 # 2nd layer number of features
n_input = 784 # MNIST data 输入 (img shape: 28*28)
n_classes = 10  # MNIST 列别 (0-9 ,一共10类)
'''
定义网络结构
'''
# tf Graph input
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes])
# Create model
#multilayer_perceptron函数封装好网络模型函数,第一层与第二层均使用Relu激活函数,loss使用交叉熵
def multilayer_perceptron(x, weights, biases):
    # Hidden layer with RELU activation
    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])
    layer_1 = tf.nn.relu(layer_1)
    # Hidden layer with RELU activation
    layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])
    layer_2 = tf.nn.relu(layer_2)
    # Output layer with linear activation
    out_layer = tf.matmul(layer_2, weights['out']) + biases['out']
    return out_layer
    
# Store layers weight & bias
weights = {
    'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
    'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes]))
}
biases = {
    'b1': tf.Variable(tf.random_normal([n_hidden_1])),
    'b2': tf.Variable(tf.random_normal([n_hidden_2])),
    'out': tf.Variable(tf.random_normal([n_classes]))
}
# 构建模型
pred = multilayer_perceptron(x, weights, biases)
# Define loss and optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
# 初始化变量
init = tf.global_variables_initializer()
# 启动session
with tf.Session() as sess:
    sess.run(init)
    # 启动循环开始训练
    for epoch in range(training_epochs):
        avg_cost = 0.
        total_batch = int(mnist.train.num_examples/batch_size)
        # 遍历全部数据集
        for i in range(total_batch):
            batch_x, batch_y = mnist.train.next_batch(batch_size)
            # Run optimization op (backprop) and cost op (to get loss value)
            _, c = sess.run([optimizer, cost], feed_dict={x: batch_x,
                                                          y: batch_y})
            # Compute average loss
            avg_cost += c / total_batch
        # 显示训练中的详细信息
        if epoch % display_step == 0:
            print ("Epoch:", '%04d' % (epoch+1), "cost=", \
                "{:.9f}".format(avg_cost))
    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}))
三 运行结果
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting /data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting /data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting /data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting /data/t10k-labels-idx1-ubyte.gz
Epoch: 0001 cost= 167.503109946
Epoch: 0002 cost= 42.023845719
Epoch: 0003 cost= 26.434357550
Epoch: 0004 cost= 18.450763896
Epoch: 0005 cost= 13.571702020
Epoch: 0006 cost= 10.169877889
Epoch: 0007 cost= 7.683901399
Epoch: 0008 cost= 5.580870980
Epoch: 0009 cost= 4.258601876
Epoch: 0010 cost= 3.213997342
Epoch: 0011 cost= 2.429289338
Epoch: 0012 cost= 1.821290299
Epoch: 0013 cost= 1.474814914
Epoch: 0014 cost= 1.091195856
Epoch: 0015 cost= 0.901945515
Epoch: 0016 cost= 0.752033565
Epoch: 0017 cost= 0.625414731
Epoch: 0018 cost= 0.596724849
Epoch: 0019 cost= 0.513915204
Epoch: 0020 cost= 0.432392413
Epoch: 0021 cost= 0.511673744
Epoch: 0022 cost= 0.384512378
Epoch: 0023 cost= 0.323022437
Epoch: 0024 cost= 0.367242469
Epoch: 0025 cost= 0.299307836
Finished!
Accuracy: 0.9534

四 说明
全连接网络可以成功将图片进行分类,并且随着层数的增加和节点的增多,还能够得到更好的拟合效果。

五 注意
由于神经网络学习算法限制,在实际情况中并不是层数越多,节点越多,效果就越好,因为在训练过程中使用BP算法,会随着层数的逐渐增大其算出来的调整值会逐渐变小,直到其他层都感觉不到变化,即梯度消失的情况。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用! 2.主要针对各个计算机相关专业,包括计科、信息安、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时私信沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于ResNet50和Cifar10数据集的卷积图像识别分类源码+项目说明(Jupyter Notebook运行).zip **卷积模型**:本项目将**CNN**模式后面的**连接层换成卷积层**,所以整个网络都是**卷积层**。其最后输出的是一张已经标记好的**热图**,而**不是一个概率值**。 通常的CNN网络中,在最后都会有几层连接网络来融合特征信息,然后再对融合后的特征信息进行softmax分类,如下图所示: 假设最后一层的**feature_map**的大小是**7x7x512**,那么**连接层**做的事就是用**4096个7x7x512**的滤波器去卷积这个最后的**feature_map**。所以可想而知这个参数量是很大的!! 但是**卷积网络**就简单多了。**FCN**的做法是将最后的连接层替换为**4096个1x1x512**的**卷积核**,所以最后得出来的就是一个二维的图像,然后再对这个二维图像进行**上采样**(反卷积),然后再对最后反卷积的图像的每个像素点进行softmax分类。 我们都知道卷积层后的**连接目的**是将 卷积输出的二维特征图(feature map)转化成($N\times 1$)**一维的一个向量**因为传统的卷积神经网络的输出都是分类(一般都是**一个概率值**),也就是几个类别的概率甚至就是一个类别号,那么连接层就是高度提纯的特征了,方便交给最后的分类器或者回归。 根据连接的目的,我们完可以利用卷积层代替连接层,在输入端使用 $M\times M$ 大小的卷积核将数据“扁平化处理”,在使用 $1\times 1$ 卷积核对数据进行降维操作,最终卷积核的通道数即是我们预测数据的维度。这样在输入端不将数据进行扁平化处理,还可以使得图片保留其空间信息: 使用卷积层的优点: * 卷积层能够兼容不同大小的尺寸输入。 * 与global avg pooling类似,可以大大减少网络参数量 **CIFAR-10**是一个更接近**普适物体**的彩色图像数据集。CIFAR-10 是由Hinton 的学生Alex Krizhevsky 和Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含**10 个类别**的**RGB**彩色图片:**飞机**(airplane)、**汽车**(automobile)、**鸟类**(bird)、**猫**(cat)、**鹿**(deer)、**狗**(dog)、**蛙类**(frog)、**马**(horse)、**船**(ship)和**卡车**(truck). 每个图片的尺寸为$32\times 32$,每个类别有**6000**个图像,数据集中一共有**50000**张训练图片和**10000**张测试图片

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值