Tensorflow:搭建全连接神经网络(完整代码)

最近在学图像分类识别,而说到图像的分类识别就不得不提起神经网络,而tensorflow则是搭建神经网络的神器,故本人近段时间在一直学tensorflow,写这篇博客目的就是为了记录和总结自己学习tensorflow搭建简单全连接神经网络的心得和方法

首先是基本步骤

第一步:导入各种包和数据

第二步:定义训练参数

第三步:定义网络参数

第四步:定义网络结构

第五步:创建网络及定义损失函数和优化器

第六步:创建会话,启动计算图

 

然后是分步介绍

第一步:导入各种包和数据

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./data/", one_hot=True)

     第一行是导入tensorflow包,第二和第三行是导入MNIST数据集  

 

第二步:定义训练参数

step = 5000
learning_rate = 0.001
batch = 128

step:网络迭代次数,5000代表网络迭代训练5000次

learning_rate:学习率,具体可以搜索梯度下降算法

batch:每次迭代输入网络的数据大小,128表示每次训练输入128张图片

 

第三步:定义网络参数

x = tf.placeholder(tf.float32,shape=[None,784])
y = tf.placeholder(tf.float32,shape=[None,10])

w1 = tf.Variable(tf.random_normal([784,256]))
w2 = tf.Variable(tf.random_normal([256,256]))
w_out = tf.Variable(tf.random_normal([256,10]))

b1 = tf.Variable(tf.random_normal([256]))
b2 = tf.Variable(tf.random_normal([256]))
b_out = tf.Variable(tf.random_normal([10]))

x,y占位符定义了输入数据的形状,x是图片输入,y是标签输入,后面的变量定义了网络中神经元的形状

 

第四步:定义网络结构

def Fully_neural_network(X):
    
    layer_1 = tf.nn.relu(tf.add(tf.matmul(X,w1),b1))
    layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1,w2),b2))
    layer_out = tf.matmul(layer_2,w_out)+b_out
    
    return layer_out

以一个函数来定义网络结构

 

第五步:创建网络及定义损失函数和优化器

net_out = Fully_neural_network(x) 

pre = tf.nn.softmax(net_out)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=net_out,labels = y )) 
 
optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate)

train_op = optimizer.minimize(loss)


correct_pre = tf.equal(tf.argmax(pre,1),tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pre,tf.float32))

net_out: 网络输出

pre: 网络预测

loss: 损失函数

optimizer: 优化器

correct_pre: 对网络预测与真实标签对比

accuracy:网络预测的正确率

 

第六步:创建会话,启动计算图

 #定义全部变量初始化的节点
init = tf.global_variables_initializer()

 #创建会话
with tf.Session() as sess:      
        
    #全局变量初始化
    sess.run(init)                       
    
    #开始训练
    for i in range(1,step+1):      
        #读入数据      
        batch_x, batch_y = mnist.train.next_batch(batch)
        #启动计算图,喂入数据
        sess.run(train_op, feed_dict={x: batch_x, y: batch_y})
        #没训练100次打印loss和accuracy
        if i % 100 == 0 or i == 1:
            l, acc = sess.run([loss, accuracy], feed_dict={x: batch_x,
                                                                 y: batch_y})
            print("Step " + str(i) + ", Minibatch Loss= " + "{:.4f}".format(l) + ", Training Accuracy= " + "{:.3f}".format(acc))
            
    print("Optimization Finished!")

    # Calculate accuracy for MNIST test images
    print("Testing Accuracy:", \
        sess.run(accuracy, feed_dict={x: mnist.test.images,
                                      y: mnist.test.labels}))

完整代码

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 27 10:46:42 2019

@author: wcx
"""

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./data/", one_hot=True)

step = 5000
learning_rate = 0.001
batch = 128

x = tf.placeholder(tf.float32,shape=[None,784])
y = tf.placeholder(tf.float32,shape=[None,10])

w1 = tf.Variable(tf.random_normal([784,256]))
w2 = tf.Variable(tf.random_normal([256,256]))
w_out = tf.Variable(tf.random_normal([256,10]))

b1 = tf.Variable(tf.random_normal([256]))
b2 = tf.Variable(tf.random_normal([256]))
b_out = tf.Variable(tf.random_normal([10]))

def Fully_neural_network(X):
    
    layer_1 = tf.nn.relu(tf.add(tf.matmul(X,w1),b1))
    layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1,w2),b2))
    layer_out = tf.matmul(layer_2,w_out)+b_out
    
    return layer_out

    
net_out = Fully_neural_network(x)

pre = tf.nn.softmax(net_out)



loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=net_out,labels = y )) 
 
optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate)

train_op = optimizer.minimize(loss)


correct_pre = tf.equal(tf.argmax(pre,1),tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pre,tf.float32))

init = tf.global_variables_initializer()


with tf.Session() as sess:
    
    sess.run(init)
    
    for i in range(1,step+1):
        batch_x, batch_y = mnist.train.next_batch(batch)
        sess.run(train_op, feed_dict={x: batch_x, y: batch_y})
        if i % 100 == 0 or i == 1:
            l, acc = sess.run([loss, accuracy], feed_dict={x: batch_x,
                                                                 y: batch_y})
            print("Step " + str(i) + ", Minibatch Loss= " + "{:.4f}".format(l) + ", Training Accuracy= " + "{:.3f}".format(acc))
            
    print("Optimization Finished!")

    # Calculate accuracy for MNIST test images
    print("Testing Accuracy:", \
        sess.run(accuracy, feed_dict={x: mnist.test.images,
                                      y: mnist.test.labels}))

结果

 

TensorFlow 2.0中,搭建神经网络的一个简单实例通常涉及以下几个步骤: 首先,你需要安装TensorFlow库,如果还没有的话,可以使用以下命令: ```bash pip install tensorflow ``` 然后,你可以开始创建一个基本的全连接层(Dense Layer)神经网络模型。这里是一个简单的多层感知机(Multilayer Perceptron, MLP)的示例: ```python import tensorflow as tf from tensorflow.keras import layers # 定义超参数 input_dim = 784 # 输入维度,例如对于MNIST数据集,每个像素为1 hidden_units = [512, 256] # 隐藏层神经元的数量 output_dim = 10 # 输出类别数,如MNIST有10个数字 # 创建模型 model = tf.keras.Sequential([ layers.Dense(hidden_units[0], activation='relu', input_shape=(input_dim,)), # 第一层隐藏层 layers.Dense(hidden_units[1], activation='relu'), # 后续隐藏层 layers.Dense(output_dim, activation='softmax') # 输出层,用于分类 ]) # 编译模型 model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) # 示例输入数据 example_input = tf.random.uniform((1, input_dim)) # 打印模型概况 model.summary() ``` 在这个例子中,我们使用了ReLU激活函数和Adam优化器,并设置了交叉熵损失。`summary()`方法展示了模型的结构。 如果你想训练这个模型,还需要准备训练数据,比如加载MNIST数据集: ```python (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() # 归一化 x_train, x_test = x_train / 255.0, x_test / 255.0 # 将图像数据调整为适合神经网络的形状 x_train = x_train.reshape(-1, input_dim) x_test = x_test.reshape(-1, input_dim) # 训练模型 model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test)) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值