單隱藏層神經網路(mnist手寫數字識別

2021-09-19 01:25:46 字數 4568 閱讀 9897

# 1、載入資料

import numpy as np

import tensorflow as tf

import tensorflow.examples.tutorials.mnist.input_data as input_data

# 讀取mnist資料

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

# 2.建立模型

# 2.1 構建輸入層

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

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

# 2.2 構建隱藏層

# 隱藏層神經元數量(隨意設定)

h1_nn = 256

# 權重

w1 = tf.variable(tf.random_normal([784, h1_nn]))

# 偏置項

b1 = tf.variable(tf.zeros([h1_nn]))

y1 = tf.nn.relu(tf.matmul(x, w1) + b1)

# 2.3 構建輸出層

w2 = tf.variable(tf.random_normal([h1_nn, 10]))

b2 = tf.variable(tf.zeros([10]))

forward = tf.matmul(y1, w2) + b2

pred = tf.nn.softmax(forward)

# 3.訓練模型

# 3.1 定義損失函式

# tensorflow提供了下面的函式,用於避免log(0)值為nan造成資料不穩定

loss_function = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=forward, labels=y))

# # 交叉熵損失函式

# loss_function = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))

# 3.2 設定訓練引數

train_epochs = 40 #訓練輪數

batch_size = 50 #單次訓練樣本數(批次大小)

# 一輪訓練的批次數

total_batch = int(mnist.train.num_examples/batch_size)

display_step = 1 #顯示粒數

learning_rate = 0.01 #學習率

# 3.2 選擇優化器

optimizer = tf.train.adamoptimizer(learning_rate).minimize(loss_function)

# 3.3定義準確率

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(pred, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# 3.4 模型的訓練

# 記錄訓練開始的時間

from time import time

starttime = time()

sess = tf.session()

sess.run(tf.global_variables_initializer())

for epoch in range(train_epochs):

for batch in range(total_batch):

# 讀取批次訓練資料

xs, ys = mnist.train.next_batch(batch_size)

# 執行批次訓練

sess.run(optimizer,feed_dict=)

# 在total_batch批次資料訓練完成後,使用驗證資料計算誤差和準確率,驗證集不分批

loss, acc = sess.run([loss_function,accuracy],feed_dict=)

# 列印訓練過程中的詳細資訊

if (epoch+1) % display_step == 0:

print('訓練輪次:','%02d' % (epoch+1),

'損失:',''.format(loss),

'準確率:',''.format(acc))

print('訓練結束')

# 顯示總執行時間

duration = time() - starttime

print("總執行時間為:", "".format(duration))

# 4.評估模型

accu_test = sess.run(accuracy,

feed_dict=)

print('測試集準確率:', accu_test)

# 5.應用模型

prediction_result = sess.run(tf.argmax(pred, 1), feed_dict=)

# 檢視**結果的前10項

print("前10項的結果:", prediction_result[0:10])

# 5.1找出**錯誤的樣本

compare_lists = prediction_result==np.argmax(mnist.test.labels,1)

print(compare_lists)

err_lists = [i for i in range(len(compare_lists)) if compare_lists[i]==false]

print('**錯誤的:', err_lists)

# 定義乙個輸出錯誤分類的函式

import numpy as np

def print_predict_errs(labels,#標籤列表

prediction):#**值列表

count = 0

compare_lists = (prediction == np.argmax(labels, 1))

err_lists = [i for i in range(len(compare_lists)) if compare_lists[i] == false]

for x in err_lists:

print('index='+str(x)+'標籤值=',np.argmax(labels[x]), '**值=', prediction[x])

count = count + 1

print("總計:"+str(count))

print_predict_errs(labels=mnist.test.labels, prediction=prediction_result)

# 視覺化

import matplotlib.pyplot as plt

def plot_images_labels_prediction(images, #影象列表

labels, #標籤列表

predication, #**值列表

index, #從第index個開始顯示

num=10): # 預設一次顯示10幅

fig = plt.gcf() #獲取當前圖表,get current figure

fig.set_size_inches(10,12) #設為英吋,1英吋=2.53厘公尺

if num > 25:

num = 25 #最多顯示25個子圖

for i in range(0,num):

ax = plt.subplot(5,5, i+1) #獲取當前要處理的子圖

# 顯示第index影象

ax.imshow(np.reshape(images[index],(28,28)),cmap='binary')

# 構建該圖上顯示的title

title = 'label=' + str(np.argmax(labels[index]))

if len(predication) > 0:

title += ",predict=" + str(predication[index])

# 顯示圖上的title資訊

ax.set_title(title,fontsize=10)

ax.set_xticks() # 不顯示座標軸

ax.set_yticks()

index += 1

plt.show()

plot_images_labels_prediction(mnist.test.images,

mnist.test.labels,

prediction_result, 10,25)

plot_images_labels_prediction(mnist.test.images,

mnist.test.labels,

prediction_result,610, 20)

神經網路的隱藏層

通常,卷積神經網路除了輸入和輸出層之外還有四個基本的神經元層,在三層神經網路中,這基層被稱為隱藏層 卷積層 convolution 啟用層 activation 池化層 pooling 完全連線層 fully connected 卷積層在最初的卷積層中,成千上萬的神經元充當第一組過濾器,搜尋影象中的...

mnist手寫體識別 卷積神經網路

coding utf 8 通過卷積神經網路進行 author elijah 引入資料集 from tensorflow.examples.tutorials.mnist import input data import tensorflow as tf mnist input data.read d...

用Kersa搭建神經網路 MNIST手寫資料集

nist手寫資料集的識別算得上是深度學習的 hello world 了,所以想要入門必須得掌握。新手入門可以考慮使用keras框架達到快速實現的目的。完整 如下 1.導入庫和模組 from keras.models import sequential from keras.layers import...