從零開始神經網絡:keras框架實現數字圖像識別詳解!

接口實現可參考:keras框架實現手寫數字識別

思路:

我們的代碼要導出三個接口,分別完成以下功能:

  1. 初始化initialisation,設置輸入層,中間層,和輸出層的節點數。
  2. 訓練train:根據訓練數據不斷的更新權重值
  3. 查詢query,把新的數據輸入給神經網絡,網絡計算后輸出答案。(推理)

keras框架初始化解析:

[1]
'''
我們先給出如下代碼框架:
'''
class  NeuralNetWork:def __init__(self):#初始化網絡,設置輸入層,中間層,和輸出層節點數passdef  train(self):#根據輸入的訓練數據更新節點鏈路權重passdef  query(self):#根據輸入數據計算并輸出答案pass[2]
'''
我們先完成初始化函數,我們需要在這里設置輸入層,中間層和輸出層的節點數,這樣就能決定網絡的形狀和大小。
當然我們不能把這些設置都寫死,而是根據輸入參數來動態設置網絡的形態。
由此我們把初始化函數修正如下:
'''
class  NeuralNetWork:def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):#初始化網絡,設置輸入層,中間層,和輸出層節點數self.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes#設置學習率self.lr = learningrate#passdef  train(self):#根據輸入的訓練數據更新節點鏈路權重passdef  query(self):#根據輸入數據計算并輸出答案pass[3]
'''
此處舉例說明:
如此我們就可以初始化一個3層網絡,輸入層,中間層和輸出層都有3個節點
'''
input_nodes = 3
hidden_nodes = 3
output_nodes = 3learning_rate = 0.3
n = NeuralNetWork(input_nodes, hidden_nodes, output_nodes, learning_rate)[4]
'''
初始化權重矩陣。
由于權重不一定都是正的,它完全可以是負數,因此我們在初始化時,把所有權重初始化為-0.5到0.5之間
'''
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):#初始化網絡,設置輸入層,中間層,和輸出層節點數self.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes#設置學習率self.lr = learningrate'''初始化權重矩陣,我們有兩個權重矩陣,一個是wih表示輸入層和中間層節點間鏈路權重形成的矩陣一個是who,表示中間層和輸出層間鏈路權重形成的矩陣'''self.wih = numpy.random.rand(self.hnodes, self.inodes) - 0.5self.who = numpy.random.rand(self.onodes, self.inodes) - 0.5pass[5]
'''
接著我們先看query函數的實現,它接收輸入數據,通過神經網絡的層層計算后,在輸出層輸出最終結果。
輸入數據要依次經過輸入層,中間層,和輸出層,并且在每層的節點中還得執行激活函數以便形成對下一層節點的輸出信號。
我們知道可以通過矩陣運算把這一系列復雜的運算流程給統一起來。
'''
import numpy
def  query(self, inputs):#根據輸入數據計算并輸出答案hidden_inputs = numpy.dot(self.wih, inputs)pass[6]
'''
hidden是個一維向量,每個元素對應著中間層某個節點從上一層神經元傳過來后的信號量總和.
于是每個節點就得執行激活函數,得到的結果將作為信號輸出到下一層.
sigmod函數在Python中可以直接調用,我們要做的就是準備好參數。
我們先把這個函數在初始化函數中設定好,
'''
import scipy.specialclass  NeuralNetWork:def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):#初始化網絡,設置輸入層,中間層,和輸出層節點數self.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes#設置學習率self.lr = learningrate'''初始化權重矩陣,我們有兩個權重矩陣,一個是wih表示輸入層和中間層節點間鏈路權重形成的矩陣一個是who,表示中間層和輸出層間鏈路權重形成的矩陣'''self.wih = numpy.random.rand(self.hnodes, self.inodes) - 0.5self.who = numpy.random.rand(self.onodes, self.inodes) - 0.5'''scipy.special.expit對應的是sigmod函數.lambda是Python關鍵字,類似C語言中的宏定義.我們調用self.activation_function(x)時,編譯器會把其轉換為spicy.special_expit(x)。'''self.activation_function = lambda x:scipy.special.expit(x)pass'''
由此我們就可以分別調用激活函數計算中間層的輸出信號,以及輸出層經過激活函數后形成的輸出信號,
'''
def  query(self, inputs):#根據輸入數據計算并輸出答案#計算中間層從輸入層接收到的信號量hidden_inputs = numpy.dot(self.wih, inputs)#計算中間層經過激活函數后形成的輸出信號量hidden_outputs = self.activation_function(hidden_inputs)#計算最外層接收到的信號量final_inputs = numpy.dot(self.who, hidden_outputs)#計算最外層神經元經過激活函數后輸出的信號量final_outputs = self.activation_function(final_inputs)print(final_outputs)return final_outputs

keras框架訓練解析:

import numpy
[1]
'''
自我訓練過程分兩步:
第一步是計算輸入訓練數據,給出網絡的計算結果,這點跟我們前面實現的query()功能很像。
第二步是將計算結果與正確結果相比對,獲取誤差,采用誤差反向傳播法更新網絡里的每條鏈路權重。我們先用代碼完成第一步.inputs_list:輸入的訓練數據;
targets_list:訓練數據對應的正確結果。
'''
def  train(self, inputs_list, targets_list):#根據輸入的訓練數據更新節點鏈路權重'''把inputs_list, targets_list轉換成numpy支持的二維矩陣.T表示做矩陣的轉置'''inputs = numpy.array(inputs_list, ndmin=2).Ttargets = numpy.array(targets_list, nmin=2).T#計算信號經過輸入層后產生的信號量hidden_inputs = numpy.dot(self.wih, inputs)#中間層神經元對輸入的信號做激活函數后得到輸出信號hidden_outputs = self.activation_function(hidden_inputs)#輸出層接收來自中間層的信號量final_inputs = numpy.dot(self.who, hidden_outputs)#輸出層對信號量進行激活函數后得到最終輸出信號final_outputs = self.activation_function(final_inputs)[2]
'''
上面代碼根據輸入數據計算出結果后,我們先要獲得計算誤差.
誤差就是用正確結果減去網絡的計算結果。
在代碼中對應的就是(targets - final_outputs).
'''
def  train(self, inputs_list, targets_list):#根據輸入的訓練數據更新節點鏈路權重'''把inputs_list, targets_list轉換成numpy支持的二維矩陣.T表示做矩陣的轉置'''inputs = numpy.array(inputs_list, ndmin=2).Ttargets = numpy.array(targets_list, nmin=2).T#計算信號經過輸入層后產生的信號量hidden_inputs = numpy.dot(self.wih, inputs)#中間層神經元對輸入的信號做激活函數后得到輸出信號hidden_outputs = self.activation_function(hidden_inputs)#輸出層接收來自中間層的信號量final_inputs = numpy.dot(self.who, hidden_outputs)#輸出層對信號量進行激活函數后得到最終輸出信號final_outputs = self.activation_function(final_inputs)#計算誤差output_errors = targets - final_outputshidden_errors = numpy.dot(self.who.T, output_errors)#根據誤差計算鏈路權重的更新量,然后把更新加到原來鏈路權重上self.who += self.lr * numpy.dot((output_errors * final_outputs *(1 - final_outputs)),numpy.transpose(hidden_outputs))self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1 - hidden_outputs)),numpy.transpose(inputs))pass[3]
'''
使用實際數據來訓練我們的神經網絡
'''
#open函數里的路徑根據數據存儲的路徑來設定
data_file = open("dataset/mnist_test.csv")
data_list = data_file.readlines()
data_file.close()
len(data_list)
data_list[0]
'''
這里我們可以利用畫圖.py將輸入繪制出來
'''[4]
'''
從繪制的結果看,數據代表的確實是一個黑白圖片的手寫數字。
數據讀取完畢后,我們再對數據格式做些調整,以便輸入到神經網絡中進行分析。
我們需要做的是將數據“歸一化”,也就是把所有數值全部轉換到0.01到1.0之間。
由于表示圖片的二維數組中,每個數大小不超過255,由此我們只要把所有數組除以255,就能讓數據全部落入到0和1之間。
有些數值很小,除以255后會變為0,這樣會導致鏈路權重更新出問題。
所以我們需要把除以255后的結果先乘以0.99,然后再加上0.01,這樣所有數據就處于0.01到1之間。
'''
scaled_input = image_array / 255.0 * 0.99 + 0.01

keras框架運行解析:

import numpy
import matplotlib.pyplot as plt[1]
#open函數里的路徑根據數據存儲的路徑來設定
data_file = open("dataset/mnist_test.csv")
data_list = data_file.readlines()
data_file.close()
print(len(data_list))
print(data_list[0])#把數據依靠','區分,并分別讀入
all_values = data_list[0].split(',')
#第一個值對應的是圖片的表示的數字,所以我們讀取圖片數據時要去掉第一個數值
image_array = numpy.asfarray(all_values[1:]).reshape((28, 28))#最外層有10個輸出節點
onodes = 10
targets = numpy.zeros(onodes) + 0.01
targets[int(all_values[0])] = 0.99
print(targets)  #targets第8個元素的值是0.99,這表示圖片對應的數字是7(數組是從編號0開始的).[2]
'''
根據上述做法,我們就能把輸入圖片給對應的正確數字建立聯系,這種聯系就可以用于輸入到網絡中,進行訓練。
由于一張圖片總共有28*28 = 784個數值,因此我們需要讓網絡的輸入層具備784個輸入節點。
這里需要注意的是,中間層的節點我們選擇了100個神經元,這個選擇是經驗值。
中間層的節點數沒有專門的辦法去規定,其數量會根據不同的問題而變化。
確定中間層神經元節點數最好的辦法是實驗,不停的選取各種數量,看看那種數量能使得網絡的表現最好。
'''
#初始化網絡
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
learning_rate = 0.3
n = NeuralNetWork(input_nodes, hidden_nodes, output_nodes, learning_rate)
#讀入訓練數據
#open函數里的路徑根據數據存儲的路徑來設定
training_data_file = open("dataset/mnist_train.csv")
trainning_data_list = training_data_file.readlines()
training_data_file.close()
#把數據依靠','區分,并分別讀入
for record in trainning_data_list:all_values = record.split(',')inputs = (numpy.asfarray(all_values[1:]))/255.0 * 0.99 + 0.01#設置圖片與數值的對應關系targets = numpy.zeros(output_nodes) + 0.01targets[int(all_values[0])] = 0.99n.train(inputs, targets)[3]
'''
最后我們把所有測試圖片都輸入網絡,看看它檢測的效果如何
'''
scores = []
for record in test_data_list:all_values = record.split(',')correct_number = int(all_values[0])print("該圖片對應的數字為:",correct_number)#預處理數字圖片inputs = (numpy.asfarray(all_values[1:])) / 255.0 * 0.99 + 0.01#讓網絡判斷圖片對應的數字outputs = n.query(inputs)#找到數值最大的神經元對應的編號label = numpy.argmax(outputs)print("out put reslut is : ", label)#print("網絡認為圖片的數字是:", label)if label == correct_number:scores.append(1)else:scores.append(0)
print(scores)#計算圖片判斷的成功率
scores_array = numpy.asarray(scores)
print("perfermance = ", scores_array.sum() / scores_array.size)[4]
'''
在原來網絡訓練的基礎上再加上一層外循環
但是對于普通電腦而言執行的時間會很長。
epochs 的數值越大,網絡被訓練的就越精準,但如果超過一個閾值,網絡就會引發一個過擬合的問題.
'''
#加入epocs,設定網絡的訓練循環次數
epochs = 10for e in range(epochs):#把數據依靠','區分,并分別讀入for record in trainning_data_list:all_values = record.split(',')inputs = (numpy.asfarray(all_values[1:]))/255.0 * 0.99 + 0.01#設置圖片與數值的對應關系targets = numpy.zeros(output_nodes) + 0.01targets[int(all_values[0])] = 0.99n.train(inputs, targets)

畫圖部分實現:

import numpy
import matplotlib.pyplot as plt
#%matplotlib inline#open函數里的路徑根據數據存儲的路徑來設定
data_file = open("dataset/mnist_test.csv")
data_list = data_file.readlines()
data_file.close()
print(len(data_list))
print(data_list[0])#把數據依靠','區分,并分別讀入
all_values = data_list[0].split(',')
#第一個值對應的是圖片的表示的數字,所以我們讀取圖片數據時要去掉第一個數值
image_array = numpy.asfarray(all_values[1:]).reshape((28, 28))
plt.imshow(image_array, cmap='Greys', interpolation='None')
plt.show()#數據預處理(歸一化)
scaled_input = image_array / 255.0 * 0.99 + 0.01
print(scaled_input)

綜合起來:數字圖像識別代碼:

數據集來自于mnist
可采用from tensorflow.keras.datasets import mnist方法下載

import numpy
import scipy.specialclass  NeuralNetWork:def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):#初始化網絡,設置輸入層,中間層,和輸出層節點數self.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes#設置學習率self.lr = learningrate'''初始化權重矩陣,我們有兩個權重矩陣,一個是wih表示輸入層和中間層節點間鏈路權重形成的矩陣一個是who,表示中間層和輸出層間鏈路權重形成的矩陣'''#self.wih = numpy.random.rand(self.hnodes, self.inodes) - 0.5#self.who = numpy.random.rand(self.onodes, self.hnodes) - 0.5self.wih = (numpy.random.normal(0.0, pow(self.hnodes,-0.5), (self.hnodes,self.inodes) )  )self.who = (numpy.random.normal(0.0, pow(self.onodes,-0.5), (self.onodes,self.hnodes) )  )'''每個節點執行激活函數,得到的結果將作為信號輸出到下一層,我們用sigmoid作為激活函數'''self.activation_function = lambda x:scipy.special.expit(x)passdef  train(self,inputs_list, targets_list):#根據輸入的訓練數據更新節點鏈路權重'''把inputs_list, targets_list轉換成numpy支持的二維矩陣.T表示做矩陣的轉置'''inputs = numpy.array(inputs_list, ndmin=2).Ttargets = numpy.array(targets_list, ndmin=2).T#計算信號經過輸入層后產生的信號量hidden_inputs = numpy.dot(self.wih, inputs)#中間層神經元對輸入的信號做激活函數后得到輸出信號hidden_outputs = self.activation_function(hidden_inputs)#輸出層接收來自中間層的信號量final_inputs = numpy.dot(self.who, hidden_outputs)#輸出層對信號量進行激活函數后得到最終輸出信號final_outputs = self.activation_function(final_inputs)#計算誤差output_errors = targets - final_outputshidden_errors = numpy.dot(self.who.T, output_errors)#根據誤差計算鏈路權重的更新量,然后把更新加到原來鏈路權重上self.who += self.lr * numpy.dot((output_errors * final_outputs *(1 - final_outputs)),numpy.transpose(hidden_outputs))self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1 - hidden_outputs)),numpy.transpose(inputs))passdef  query(self,inputs):#根據輸入數據計算并輸出答案#計算中間層從輸入層接收到的信號量hidden_inputs = numpy.dot(self.wih, inputs)#計算中間層經過激活函數后形成的輸出信號量hidden_outputs = self.activation_function(hidden_inputs)#計算最外層接收到的信號量final_inputs = numpy.dot(self.who, hidden_outputs)#計算最外層神經元經過激活函數后輸出的信號量final_outputs = self.activation_function(final_inputs)print(final_outputs)return final_outputs#初始化網絡
'''
由于一張圖片總共有28*28 = 784個數值,因此我們需要讓網絡的輸入層具備784個輸入節點
'''
input_nodes = 784
hidden_nodes = 200
output_nodes = 10
learning_rate = 0.1
n = NeuralNetWork(input_nodes, hidden_nodes, output_nodes, learning_rate)#讀入訓練數據
#open函數里的路徑根據數據存儲的路徑來設定
training_data_file = open("dataset/mnist_train.csv",'r')
training_data_list = training_data_file.readlines()
training_data_file.close()#加入epocs,設定網絡的訓練循環次數
epochs = 5
for e in range(epochs):#把數據依靠','區分,并分別讀入for record in training_data_list:all_values = record.split(',')inputs = (numpy.asfarray(all_values[1:]))/255.0 * 0.99 + 0.01#設置圖片與數值的對應關系targets = numpy.zeros(output_nodes) + 0.01targets[int(all_values[0])] = 0.99n.train(inputs, targets)test_data_file = open("dataset/mnist_test.csv")
test_data_list = test_data_file.readlines()
test_data_file.close()
scores = []
for record in test_data_list:all_values = record.split(',')correct_number = int(all_values[0])print("該圖片對應的數字為:",correct_number)#預處理數字圖片inputs = (numpy.asfarray(all_values[1:])) / 255.0 * 0.99 + 0.01#讓網絡判斷圖片對應的數字outputs = n.query(inputs)#找到數值最大的神經元對應的編號label = numpy.argmax(outputs)print("網絡認為圖片的數字是:", label)if label == correct_number:scores.append(1)else:scores.append(0)
print(scores)#計算圖片判斷的成功率
scores_array = numpy.asarray(scores)
print("perfermance = ", scores_array.sum() / scores_array.size)

實現結果:

在這里插入圖片描述
可以發現有部分數據預測錯誤有部分數據預測正確,正確率在60%

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389496.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據學習第一貼

搞了這么久的開發,一直沒有養成發博客的習慣,今天開始對大數據所需內容進行總結性記錄,并對以后遇到的問題形成一個自己的知識庫。就這些!轉載于:https://blog.51cto.com/13921538/2299765

推薦算法的先驗算法的連接_數據挖掘專注于先驗算法

推薦算法的先驗算法的連接So here we are diving into the world of data mining this time, let’s begin with a small but informative definition;因此,這一次我們將進入數據挖掘的世界,讓我們從一個小的但內容豐富的定義開始; 什么是數…

Android 頁面多狀態布局管理

一、現狀 頁面多狀態布局是開發中常見的需求,即頁面在不同狀態需要顯示不同的布局,實現的方式也比較多,最簡單粗暴的方式就是在 XML 中先將不同狀態對應的布局隱藏起來,根據需要改變其可見狀態,如果多個界面公用相同的…

Tensorflow入門神經網絡代碼框架

Tensorflow—基本用法 使用圖 (graph) 來表示計算任務.在被稱之為 會話 (Session) 的上下文 (context) 中執行圖.使用 tensor 表示數據.通過 變量 (Variable) 維護狀態.使用 feed 和 fetch 可以為任意的操作(arbitrary operation)賦值或者從其中獲取數據。 ? TensorFlow 是一…

手把手教你把代碼丟入github 中

手把手教你把代碼丟入github 中 作為一個小運維一步步教你們怎么把代碼放入到github 中 首先呢我們下載一個git的客戶端 https://git-scm.com/downloads/ 下載一個最新版的2.16.2 下載后那就安裝吧。如果看不懂英文就選擇默認安裝的方式吧。但是你得記住你的軟件安裝的位置 小…

時間序列模式識別_空氣質量傳感器數據的時間序列模式識別

時間序列模式識別 1. Introduction 2. Exploratory Data Analysis ° 2.1 Pattern Changes ° 2.2 Correlation Between Features 3. Anomaly Detection and Pattern Recognition ° 3.1 Point Anomaly Detection (System Fault) ° 3.2 Collective Anomaly Detection (Externa…

oracle 性能優化 07_診斷事件

2019獨角獸企業重金招聘Python工程師標準>>> 一、診斷事件 診斷事件無官方技術文檔支持,使用存在風險,慎用。使用診斷事件可以獲取問題更多的信息,調整系統運行 特性,啟用某些內部功能。用于系統故障的診斷。跟蹤應…

Tensorflow框架:卷積神經網絡實戰--Cifar訓練集

Cifar-10數據集包含10類共60000張32*32的彩色圖片,每類6000張圖。包括50000張訓練圖片和 10000張測試圖片 代碼分為數據處理部分和卷積網絡訓練部分: 數據處理部分: #該文件負責讀取Cifar-10數據并對其進行數據增強預處理 import os impo…

計算機科學速成課36:自然語言處理

詞性 短語結構規則 分析樹 語音識別 譜圖 快速傅里葉變換 音素 語音合成 轉載于:https://www.cnblogs.com/davidliu2018/p/9149252.html

linux內存初始化初期內存分配器——memblock

2019獨角獸企業重金招聘Python工程師標準>>> 1.1.1 memblock 系統初始化的時候buddy系統,slab分配器等并沒有被初始化好,當需要執行一些內存管理、內存分配的任務,就引入了一種內存管理器bootmem分配器。 當buddy系統和slab分配器初始化好后&…

數據科學學習心得_學習數據科學

數據科學學習心得蘋果 | GOOGLE | 現貨 | 其他 (APPLE | GOOGLE | SPOTIFY | OTHERS) Editor’s note: The Towards Data Science podcast’s “Climbing the Data Science Ladder” series is hosted by Jeremie Harris. Jeremie helps run a data science mentorship startup…

Keras框架:Alexnet網絡代碼實現

網絡思想: 1、一張原始圖片被resize到(224,224,3); 2、使用步長為4x4,大小為11的卷積核對圖像進行卷積,輸出的特征層為96層, 輸出的shape為(55,55,96); 3、使用步長為2的最大池化層進行池化,此時…

PHP對象傳遞方式

<?phpheader(content-type:text/html;charsetutf-8);class Person{public $name;public $age;}$p1 new Person;$p1->name 金角大王;$p1->age 400;//這個地方&#xff0c;到底怎樣?$p2 $p1;$p2->name 銀角大王;echo <pre>;echo p1 name . $p1->n…

微軟Azure CDN現已普遍可用

微軟宣布Azure CDN一般可用&#xff08;GA&#xff09;&#xff0c;客戶現在可以從微軟的全球CDN網絡提供內容。最新版本是對去年五月份發布的公眾預覽版的跟進。\\今年5月&#xff0c;微軟與Verizon和Akamai一起推出了原生CDN產品。現在推出了GA版本&#xff0c;根據發布博文所…

數據科學生命周期_數據科學項目生命周期第1部分

數據科學生命周期This is series of how to developed data science project.這是如何開發數據科學項目的系列。 This is part 1.這是第1部分。 All the Life-cycle In A Data Science Projects-1. Data Analysis and visualization.2. Feature Engineering.3. Feature Selec…

Keras框架:VGG網絡代碼實現

VGG概念&#xff1a; VGG之所以經典&#xff0c;在于它首次將深度學習做得非常“深”&#xff0c;達 到了16-19層&#xff0c;同時&#xff0c;它用了非常“小”的卷積核&#xff08;3X3&#xff09;。 網絡框架&#xff1a; VGG的結構&#xff1a; 1、一張原始圖片被resize…

Django筆記1

內容整理1.創建django工程django-admin startproject 工程名2.創建APPcd 工程名python manage.py startapp cmdb3.靜態文件project.settings.pySTATICFILES_dirs {os.path.join(BASE_DIR, static),}4.模板路徑DIRS > [os.path.join(BASE_DIR, templates),]5.settings中mid…

BZOJ 2003 [Hnoi2010]Matrix 矩陣

題目鏈接 https://www.lydsy.com/JudgeOnline/problem.php?id2003 題解 考慮搜索。 確定了第一行和第一列&#xff0c;那么就確定了整個矩陣&#xff0c;因此搜索的范圍可以降到399個位置。 首先搜索第一行&#xff0c;顯然每個不是第一行第一列的位置都可以由三個位置唯一確定…

Keras框架:resent50代碼實現

Residual net概念 概念&#xff1a; Residual net(殘差網絡)&#xff1a;將靠前若干層的某一層數據輸出直接跳過多層引入到后面數據層的輸入 部分。 殘差神經單元&#xff1a;假定某段神經網絡的輸入是x&#xff0c;期望輸出是H(x)&#xff0c;如果我們直接將輸入x傳到輸出作…

MySQL數據庫的回滾失敗(JAVA)

這幾天在學習MySQL數據的知識&#xff0c;有一個小測試&#xff0c;用來測試數據庫的提交和回滾。 剛開始的時候真的沒把這個當回事&#xff0c;按照正常的步驟來講的話&#xff0c;如下所示&#xff0c;加載驅動&#xff0c;獲取數據庫的連接&#xff0c;并且把數據庫的自動提…