用簡單卷積神經網路實現MNIST資料集識別

2021-09-28 20:05:42 字數 3048 閱讀 4591

第一次寫部落格,記錄一下最近的學習經歷吧,最近在學卷積神經網路,自己就寫了乙個比較簡單的卷積神經網路實現了mnist資料集的識別,本來是想用lenet5來實現的,感覺lenet5太老了,所以就寫了乙個差不多的卷積神經網路來實現mnist資料集的識別。希望可以幫助一些剛學習卷積神經網路的朋友,也可以根據我的框架也寫出來自己的神經網路。

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

mnist=input_data.read_data_sets('../datas/mnist',one_hot=true)

#設定超引數

learn_rate=1e-3

train_epoch=15000

batch_size=50

#設定佔位符

x=tf.placeholder(tf.float32,shape=[none,784],name='x')

y=tf.placeholder(tf.float32,shape=[none,10],name='y')

#定義接收變數的函式

def get_variable(name,shape=none,dtype=tf.float32,initializer=tf.random_normal_initializer(mean=0,stddev=0.1)):

return tf.get_variable(name,shape,dtype,initializer)

#開始寫網路層,第一層是輸入層

with tf.variable_scope('input1'):

net=tf.reshape(x,[-1,28,28,1])

#第二層是卷積層

with tf.variable_scope('conv2'):

net=tf.nn.conv2d(input=net,filter=get_variable('w',[5,5,1,20]),strides=[1,1,1,1],padding='same')

net=tf.nn.bias_add(net,get_variable('b',[20]))

net=tf.nn.relu(net)

#第三次是池化層

with tf.variable_scope('pool3'):

net=tf.nn.max_pool(value=net,ksize=[1,2,2,1],strides=[1,2,2,1],padding='same')

#第四層是卷積層

with tf.variable_scope('conv4'):

net=tf.nn.conv2d(input=net,filter=get_variable('w',[5,5,20,50]),strides=[1,1,1,1],padding='same')

net=tf.nn.bias_add(net,get_variable('b',[50]))

net=tf.nn.relu(net)

#第五層是池化層

with tf.variable_scope('pool5'):

net=tf.nn.max_pool(value=net,ksize=[1,2,2,1],strides=[1,2,2,1],padding='same')

#第六層是全連線層

with tf.variable_scope('fc6'):

net=tf.reshape(net,[-1,7*7*50])

net=tf.add(tf.matmul(net,get_variable('w',[7*7*50,1024])),get_variable('b',[1024]))

net=tf.nn.relu(net)

#第七次是dropout層,丟棄一些權重,防止過擬合

with tf.variable_scope('dropout7'):

net=tf.nn.dropout(net,keep_prob=0.5)

#最後一層在做乙個全連線和softmax

with tf.variable_scope('fc8'):

net=tf.add(tf.matmul(net,get_variable('w',[1024,10])),get_variable('b',[10]))

act=tf.nn.softmax(net)

#接下來定義損失函式

loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=act,labels=y))

#接下來定義訓練方式

train=tf.train.gradientdescentoptimizer(learning_rate=learn_rate).minimize(loss)

#接下來產生乙個**值

y_pred=tf.equal(tf.argmax(act,axis=1),tf.argmax(y,axis=1))

#用**值來計算正確率

acc=tf.reduce_mean(tf.cast(y_pred,tf.float32))

#定義隨機變數

init=tf.global_variables_initializer()

#開啟會話,開始訓練過程

with tf.session() as sess:

sess.run(init)

#得到批次的大小

batch_xs,batch_ys=mnist.train.next_batch(batch_size)

#得到餵入字典的大小

feeds=

#開啟訓練過程

for i in range(train_epoch+1):

sess.run(train,feed_dict=feeds)

#每隔20輪輸出一下準確率

if i%20==0:

print('第%d輪準確率為%.3f'%(i,sess.run(acc,feed_dict=feeds)))

這次寫的神經網路結構還是比較簡單的,最後準確率大概有98%左右,感覺識別效果還是不太好,大家可以自行更改一些引數和迭代方式可能準確率會有一些提公升。

python深度學習 卷積神經網路(mnist)

import numpy as np import pandas as pd import matplotlib.pyplot as plt import pylab from pandas import dataframe,series from keras import models,layer...

卷積神經網路 簡單實現案例

隨機產生乙個輸入資料 輸入資料 1,32,32,1 輸入一張圖,高度32,寬度32,通道數為1 input data np.random.randn 32,32 reshape 1,32,32,1 第一層卷積 卷積核,5,5,1,8 高度5,寬度5,通道數1,輸出卷積核個數8 filter np.r...

神經網路 卷積神經網路

這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了...