python 神經(jīng)網(wǎng)絡(luò)入門

Python 徒手實(shí)現(xiàn) 卷積神經(jīng)網(wǎng)絡(luò) CNN - 知乎 (zhihu.com)

MNIST 數(shù)據(jù)集的獲取和使用

在python代碼中,通過下面的代碼就可以獲取和使用mnist數(shù)據(jù)集

import mnist
test_images = mnist.test_images()[:1000]

但是這是通過mnist模塊的自動(dòng)下載獲取數(shù)據(jù)集的.如果網(wǎng)絡(luò)不好,往往獲取不到完成的數(shù)據(jù)集,導(dǎo)致后續(xù)報(bào)數(shù)據(jù)集解壓縮出現(xiàn)異常 報(bào)錯(cuò)信息如下During handling of the above exception, another exception occurred
通過單步調(diào)試,可以知道mnist.test_images()內(nèi)部是通過

    fname = download_file(fname, target_dir=target_dir, force=force)
    fopen = gzip.open if os.path.splitext(fname)[1] == '.gz' else open

實(shí)現(xiàn)下載和解壓的, 單步進(jìn)去后查看fname的值,可以知道m(xù)nist默認(rèn)的數(shù)據(jù)集下載地址. 我的環(huán)境下是C:\Users\Administrator\AppData\Local\Temp\t10k-images-idx3-ubyte.gz. 所以對應(yīng)的解決辦法就是從mnist的官網(wǎng)MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges
手動(dòng)下載所有數(shù)據(jù)集之后,覆蓋到這個(gè)目錄下.

交叉熵?fù)p失函數(shù)的理解

(4條消息) 一文讀懂交叉熵?fù)p失函數(shù)霜溪的博客-CSDN博客交叉熵?fù)p失函數(shù)的理解

keras 學(xué)習(xí)總結(jié)

(https://keras.io/getting_started/)

1 神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)表示

張量是矩陣向任意維度的推廣,張量的維度通常叫軸

零維張量

一個(gè)數(shù)字就是一個(gè)標(biāo)量也叫0維張量
在numpy中的表示如下, 通過ndim可以查詢張量的維度.

import numpy as np
x = np.array(12)
x.ndim
0
x
array(12)

一維張量

x = np.array([10,11,12,13])
x.ndim
1
x
array([10, 11, 12, 13])

三維張量示例

x=np.array([[[11,12,13],[14,15,16]],[[1,1,1],[2,2,2]]])
x.ndim
3
x
array([[[11, 12, 13],
        [14, 15, 16]],
       [[ 1,  1,  1],
        [ 2,  2,  2]]])

解讀張量的關(guān)鍵屬性

x.shape
(2, 2, 3)

說明張量x是2個(gè)2行3列組成的形狀. 他的維度有3個(gè).

x.dtype
dtype('int32')

說明張量x的數(shù)據(jù)類型是int32類型

import mnist
train_images = mnist.train_images()
train_images.ndim
3
train_images.shape
(60000, 28, 28)
train_images.dtype
dtype('uint8')

上面的運(yùn)行結(jié)果說明, train_images張量有3個(gè)維度, 形狀是60000個(gè)28行x28行的結(jié)構(gòu). 數(shù)據(jù)類型是uint8, 也就是最大數(shù)值是255

二維張量的顯示示范

借助matplotlib庫進(jìn)行二維張量的繪制

img = train_images[1]
import matplotlib.pyplot as plt
plt.imshow(img, cmap=plt.cm.binary)
plt.show()

張量的裁切操作

張量的操作主要目的是裁剪. 比如如下幾種場景:

  1. 從60000個(gè)28x28的張量中選出前10個(gè)28x28的元素形成一個(gè)新的三維張量,對應(yīng)的代碼如下
first10Imgs = train_images[0:10]
first10Imgs.shape
(10, 28, 28)
  1. 從60000個(gè)28x28的張量中選出前10個(gè)28x28的元素,同時(shí)選出的10個(gè)28x28元素中,只要右下角的2x2數(shù)據(jù)
first10Imgs = train_images[0:10, 26:28,26:28]
first10Imgs.shape
(10, 2, 2)

2 張量的運(yùn)算

張量的四則運(yùn)算

  1. 形狀相同兩個(gè)張量的+-*/表示的的是兩個(gè)張量逐個(gè)對應(yīng)位置元素的運(yùn)算
import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = a+b
c
array([5, 7, 9])
c = a*b
c
array([ 4, 10, 18])
  1. 形狀不同時(shí), 兩個(gè)張量的+-*/運(yùn)算時(shí), 較小的張量會(huì)被廣播,以匹配較大張量的形狀.
a = np.array([1,2,3])
b = np.array(4)
a+b
array([5, 6, 7])

張量的點(diǎn)積

要理解張量的點(diǎn)積要區(qū)分三種情況. 而且要區(qū)分向量和張量的區(qū)別. 當(dāng)我們說向量的時(shí)候,指的是一維張量,指的的一組數(shù)字.
下面的代碼中a成為向量,沒有行或者列的概念,是屬于一維張量
b是一行3列的二維張量
c是3行1列的二維張量

a = np.array([1,2,3])
b = np.array([[1,2,3],])
c = np.array([[1],[2],[3]])
a.shape
(3,)
b.shape
(1, 3)
c.shape
(3, 1)
  1. 如果兩個(gè)向量點(diǎn)積,結(jié)果是一個(gè)標(biāo)量, 兩個(gè)向量的各個(gè)對應(yīng)元素進(jìn)行乘積并累加, 如果兩個(gè)向量的個(gè)數(shù)不一致,無法進(jìn)行點(diǎn)積,程序會(huì)報(bào)錯(cuò)
a = np.array([1,3])
b = np.array([2,4,6])
c=np.dot(a, b)
Traceback (most recent call last):
  File "D:\Python\Python310\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  1. 如果是一個(gè)矩陣A和向量B的點(diǎn)積, 他的結(jié)果是一個(gè)向量C. 結(jié)果C中每個(gè)向量C的值是矩陣中一行(作為一個(gè)待操作向量和向量B的點(diǎn)擊,生成的標(biāo)量作為向量C的一個(gè)元素.
    所以如果矩陣A中的一行的個(gè)數(shù)和向量B不一致,也是無法運(yùn)算的
a = np.array([[1,1,1],[2,2,2]])
b = np.array([1,2,3])
c = np.dot(a,b)
c
array([ 6, 12])
a = np.array([[1,1,1,1],[2,2,2,2]])
b = np.array([1,2,3])
c = np.dot(a,b)
Traceback (most recent call last):
  File "D:\Python\Python310\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>

同時(shí)無法進(jìn)行向量跟矩陣的點(diǎn)積

a = np.array([[1,1,1],[2,2,2]])
b = np.array([1,2,3])
c = np.dot(a,b)
c
array([ 6, 12])
#無法執(zhí)行np.dot(b,a)
  1. 矩陣和矩陣的點(diǎn)積
    這個(gè)點(diǎn)積規(guī)則跟大學(xué)學(xué)的矩陣點(diǎn)積規(guī)則一致.
  2. 更高維的點(diǎn)積,暫時(shí)不理解.

張量變形運(yùn)算

  1. reshape
    張量變形指改變張量的行和列,以得到想要的形狀,變形后的張量元素總個(gè)數(shù)沒有變化.
    比如把2行2列的張量變成4行一列
a = np.array([[1,2],[3,4]])
b = a.reshape((4,1))
b
array([[1],
       [2],
       [3],
       [4]])
  1. transposition
    矩陣的轉(zhuǎn)置也是一種常見的變形
a = np.array([[1,2],[3,4],[5,6]])
b = a.transpose()
b
array([[1, 3, 5],
       [2, 4, 6]])

深度學(xué)習(xí)的數(shù)學(xué)解釋

神經(jīng)網(wǎng)絡(luò)就是由一系列的張量運(yùn)算組成的, 輸入張量和輸出張量通過一定的數(shù)學(xué)訓(xùn)練后,找到一種映射關(guān)系,這種映射關(guān)系通過一層層的張量運(yùn)算變換一步步實(shí)現(xiàn).
對于實(shí)際的問題, 只要你針對實(shí)際問題提取的輸入張量可靠, 訓(xùn)練的數(shù)據(jù)足夠多寫有代表性,那么你所針對的實(shí)際問題就有了數(shù)學(xué)上的識(shí)別模型, 這個(gè)模型可以通過你提供的數(shù)據(jù)訓(xùn)練出來.

3神經(jīng)網(wǎng)絡(luò)的訓(xùn)練引擎

神經(jīng)網(wǎng)絡(luò)的訓(xùn)練要利用損失的梯度方向傳播的各個(gè)層的權(quán)重.

什么是導(dǎo)數(shù)

導(dǎo)數(shù)的數(shù)學(xué)含義, 對于一個(gè)函數(shù) y = f(x). 在某個(gè)點(diǎn)的導(dǎo)數(shù)a記作d_y_d_x. 如果d_y_d_x是正數(shù),說明微小的dx會(huì)引起dy = ad_x的正向變化(變大). 如果a是負(fù)數(shù),說明dx的增加會(huì)導(dǎo)致y的減小. a的絕對值表示變化的速率.
如果我們反向求出d_L_d_w = a. 表示在當(dāng)前權(quán)重w狀態(tài)下,如果a是正值, 權(quán)重增加一些, 損失L就會(huì)增加,所以調(diào)節(jié)網(wǎng)絡(luò)的時(shí)候我們要反向調(diào)節(jié)讓權(quán)重減去(|a|
step). step表示一個(gè)很小的比例因子.
SGD 表示隨機(jī)梯度下降法

4 keras CNN 示例

神經(jīng)網(wǎng)絡(luò)的keras實(shí)現(xiàn)

層+損失函數(shù)定義+反向傳播方式指定

  1. 下面的代碼創(chuàng)建了一個(gè)全連接層, 輸入是二維張量, 可以認(rèn)為有784個(gè)向量, 向量的元素個(gè)數(shù)不限. 新建層的輸出是一個(gè)一維張量,包含32個(gè)值.
from keras import layers
layer = layers.Dense(32, input_shape=(784,))
  1. keras創(chuàng)建網(wǎng)絡(luò)結(jié)構(gòu)的時(shí)候,先指明結(jié)構(gòu)框架,然后逐個(gè)添加層. 比如下面的代碼
model = models.Sequential();
model.add(layers.Dense(32,input_shape=(784,)))
model.add(layers.Dense(32))

這段代碼中添加了兩個(gè)全連接層,第一個(gè)dense層輸入時(shí)(784,),輸出是32D向量. 第二個(gè)dense創(chuàng)建的時(shí)候,并沒有指定輸入,keras會(huì)自動(dòng)推導(dǎo)我的輸入應(yīng)該是上一層的輸出.所以是一個(gè)32D向量輸入,32D向量輸出的層.
神經(jīng)網(wǎng)絡(luò)的模型是由層構(gòu)成的有向無環(huán)圖. 最常見的例子是一個(gè)輸入分支從頭到尾經(jīng)過多層移動(dòng)到輸出. 但也存在雙分支網(wǎng)絡(luò),多頭網(wǎng)絡(luò),inception網(wǎng)絡(luò)(不知道是啥網(wǎng)絡(luò)??)

  1. 根據(jù)任務(wù)類型選擇合適的損失函數(shù)和反向傳播函數(shù)(優(yōu)化器)
    模型確定之后,需要編譯,在編譯的時(shí)候配置學(xué)習(xí)過程,如下面的代碼, RMSprop是一種參數(shù)反向調(diào)整的方法.(SGD也是一種方法). loss='mse' 指定均方誤差作為損失函數(shù).
from keras import optimizers
model.compile(optimizer=optimizers.RMSprop(learning_rate=0.001),loss='mse',metrics =['accuracy'])
  1. 最后學(xué)習(xí)過程通過fit()方法啟用
    類似代碼如下
model.fit(input_tensor, target_tensor, batch_size=128, epochs=10)

keras創(chuàng)建層的兩種方式

  1. 利用sequential類, 如下面的代碼
model = models.Sequential();
model.add(layers.Dense(32,input_shape=(784,)))
model.add(layers.Dense(32))
  1. 基于過程方式,利用函數(shù)式api
input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32,activation ='relu')(input_tensor)
output_tensor = layers.Dense(10,activation = 'softmax')(x)
model = models.Model(inputs=input_tensor,outputs=output_tensor)

5 建模示例

5.1 二分類問題

5.1.1 數(shù)據(jù)集獲取和分析

讓網(wǎng)絡(luò)學(xué)習(xí)后,可以根據(jù)電影的評論內(nèi)容,判斷出該評論是正面評論還是負(fù)面評論. 用到的數(shù)據(jù)集IMDB,包含了50000條評論,這些評論都有評論是正面或者負(fù)面的標(biāo)簽.
一樣的imdb.nbz數(shù)據(jù)集在實(shí)踐的過程中也發(fā)生無法下載的問題, 解決方法就是先手動(dòng)下載,讓后放到指定目錄中
手動(dòng)下載的地址(https://www.cnblogs.com/wt7018/p/13092512.html)
覆蓋的路徑要通過單步調(diào)試下面的代碼,確認(rèn)imdb的數(shù)據(jù)集加載路徑才行. 我這里是C:\Users\Administrator\.keras\datasets

import keras.datasets.imdb as myimdb
(train_data, train_labels),(test_data, test_labels) = myimdb.load_data(num_words=10000)
train_data.shape
(25000,)
train_labels.shape
(25000,)

imdb在加載數(shù)據(jù)的時(shí)候. num_words=10000的意思是僅保留訓(xùn)練數(shù)據(jù)中前10000個(gè)最常出現(xiàn)的單詞,低于這個(gè)頻率的單詞被舍棄.label中0表示負(fù)面,1表示正面.
**觀察數(shù)據(jù)集train_data.shape 返回的結(jié)果是(25000,)說明train_data是25000個(gè)向量(一維張量),通過下面的代碼可以查看訓(xùn)練集中第0條評論的樣子

oneComment = train_data[0]
oneComment
[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 17....]

為什么不是單詞,而是數(shù)字,這是因?yàn)閕mdb對單詞做了索引.每個(gè)不同的索引代表一個(gè)單詞.

5.1.2 訓(xùn)練數(shù)據(jù)處理

  1. 對于25000個(gè)訓(xùn)練樣本,有的樣本有10個(gè)單詞,有的樣本有2000個(gè)單詞. 個(gè)數(shù)都不一樣,這種情況下創(chuàng)建神經(jīng)網(wǎng)絡(luò)層的時(shí)候就會(huì)出現(xiàn)困難. 書上的解決辦法是"歸一化"成10000的向量. 因?yàn)椴灰粯拥膯卧~總個(gè)數(shù)就10000個(gè),每個(gè)評論都抽象成一個(gè)10000D向量,某個(gè)單詞出現(xiàn)過就在其索引位置上賦值1,否者為0. 轉(zhuǎn)換代碼如下
import numpy as np
def vectorize_sequences(sequences,dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i,sequence] = 1.
    return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
  1. 把輸出數(shù)據(jù)轉(zhuǎn)化為25000個(gè)浮點(diǎn)類型數(shù)據(jù),表明概率
y_test = np.asarray(test_labels).astype('float32')
y_train=np.asarray(train_labels).astype('float32')
train_labels
array([1, 0, 0, ..., 0, 1, 0], dtype=int64)
y_test
array([0., 1., 1., ..., 0., 0., 0.], dtype=float32)
y_test.shape
(25000,)

處理后, 輸入就是25000個(gè)10000D的向量, 輸出是1個(gè)25000D的向量, 每次訓(xùn)練的時(shí)候選一個(gè)10000D的向量,目標(biāo)是一個(gè)標(biāo)量. 也就是輸入數(shù)據(jù)是向量,而標(biāo)簽是標(biāo)量,這是會(huì)遇到的最簡單的情況.這種問題使用帶有relu激活的全連接層處理.

5.1.3 構(gòu)建網(wǎng)絡(luò)

帶relu激活的Dense層表示為Dense(16,activation="relu") 這里16表示該層隱藏單元的個(gè)數(shù). 以這個(gè)例子的背景為例,我們每次訓(xùn)練的輸入是一個(gè)評論也就是一個(gè)10000D的向量. 我們要用16個(gè)特征維度去解析這個(gè)輸入.每個(gè)維度用隱藏層中16個(gè)神經(jīng)元的一個(gè)去處理. 當(dāng)輸入10000D的一個(gè)向量連接這個(gè)神經(jīng)元的時(shí)候,他要做的最基本的數(shù)學(xué)運(yùn)算是 dot(W, input)+b, 可以認(rèn)為這個(gè)卷積過程就是一個(gè)維度的分解過程, 每個(gè)維度代表的神經(jīng)元有不同的權(quán)重W. 每個(gè)神經(jīng)元的權(quán)重W要能夠和input做卷積,所以一個(gè)神經(jīng)元的W在這里必然也是一個(gè)10000D的向量. 那16個(gè)隱藏單元對應(yīng)的權(quán)重矩陣W的形狀就是((10000,),16). 隱藏單元的個(gè)數(shù)(分析的維度)并不是越多越好, 越多計(jì)算量越大,且最終學(xué)習(xí)到的識(shí)別方法有可能普適性更差(針對訓(xùn)練集更好了,但沒有訓(xùn)練過的數(shù)據(jù)識(shí)別起來效果變差).
維度的解析基本運(yùn)算是dot(W, input)+b, 為了模擬一些跳躍的非線性的映射關(guān)系,加上了激活函數(shù)relu(dot(W,input)+b
針對這個(gè)case, 書上根據(jù)經(jīng)驗(yàn)選擇了如下的網(wǎng)絡(luò)結(jié)構(gòu)

from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(16,activation='relu',input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))

最后要在編譯過程中選擇損失函數(shù)和優(yōu)化器,代碼如下

model.compile(optimizer='rmsprop', loss='binary_crossentropy',metrics=['accuracy'])

5.1.4 驗(yàn)證模型

拆分訓(xùn)練集,驗(yàn)證集,測試集
原始的訓(xùn)練集合中x_train 和 y_train中有25000個(gè)評論和標(biāo)簽

x_train.shape
(25000, 10000)
y_train.shape
(25000,)

通過下面的代碼,拆分10000個(gè)評論出來作為驗(yàn)證集,并開始訓(xùn)練.訓(xùn)練時(shí)訓(xùn)練20輪,每一輪使用512個(gè)樣本.

x_varification = x_train[:10000]
x_real_train = x_train[10000:]
y_varification = y_train[:10000]
y_real_train = y_train[10000:]
history = model.fit(x_real_train, y_real_train, epochs=20,batch_size=512,validation_data= (x_varification, y_varification))

訓(xùn)練結(jié)果

Epoch 1/20
30/30 [==============================] - 5s 110ms/step - loss: 0.5491 - accuracy: 0.7777 - val_loss: 0.4185 - val_accuracy: 0.8619

......
[==============================] - 1s 45ms/step - loss: 0.0237 - accuracy: 0.9958 - val_loss: 0.4962 - val_accuracy: 0.8714
Epoch 19/20
30/30 [==============================] - 1s 46ms/step - loss: 0.0192 - accuracy: 0.9969 - val_loss: 0.5181 - val_accuracy: 0.8699
Epoch 20/20
30/30 [==============================] - 1s 46ms/step - loss: 0.0177 - accuracy: 0.9973 - val_loss: 0.5396 - val_accuracy: 0.8685

模型可以優(yōu)化的方向

可以嘗試更少或更多的隱藏層
可以嘗試不同的解析維度
可以使用不同的激活函數(shù),損失函數(shù)
通過驗(yàn)證集上測試的loss和精度數(shù)據(jù),確認(rèn)是否發(fā)生過擬合的情況,并優(yōu)化

5.2 多分類問題

訓(xùn)練集是一些新聞評論,每條新聞的標(biāo)簽是新聞的類別,和單分類問題不一樣的是,標(biāo)簽的類別有46個(gè).
這個(gè)示例問題的解決方法基本和單分類的示例類似. 需要注意的地方有兩個(gè)

  1. 多分類標(biāo)簽也需要進(jìn)行編碼轉(zhuǎn)換. 轉(zhuǎn)換方法就是統(tǒng)一用46D的向量表示標(biāo)簽.
  2. 網(wǎng)絡(luò)的輸出有46種可能,如果在設(shè)計(jì)解析維度的時(shí)候依然沿用上例的16,就有些不夠了.既然有46種可能輸出,那至少有46個(gè)特征維度.所以Dense層的網(wǎng)絡(luò)節(jié)點(diǎn)最好比46大,書中根據(jù)經(jīng)驗(yàn)使用了64.
  3. 當(dāng)然輸出是1D向量, 只不過0-45的不同數(shù)據(jù).這種標(biāo)簽編碼是整數(shù),如果直接用1D的向量作為輸出,那么要選用sparse_categorical_crossentropy作為損失函數(shù).
    如果把輸出的1D向量轉(zhuǎn)化為46D向量,每個(gè)向量上的標(biāo)量取值不是0就是1,這種情況下使用categorical_crossentropy作為損失函數(shù).

5.3 回歸問題

5.3.1 數(shù)據(jù)集獲取和分析

boston_housing數(shù)據(jù)集有506份樣本. 每個(gè)樣本有13個(gè)屬性描述,如人均犯罪率,住宅平均房間數(shù),公交遍歷性等. 目標(biāo)是房屋價(jià)格的平均值.

from keras.datasets import boston_housing
(train_data,train_targets),(test_data,test_targets) = boston_housing.load_data()
train_data.shape
(404, 13)
test_data.shape
(102, 13)

上述的代碼如果下載數(shù)據(jù)集異常, 需要手動(dòng)下載(https://gitee.com/polarisslk/boston_housing/blob/master/boston_housing.npz)

5.3.2 數(shù)據(jù)準(zhǔn)備

每一個(gè)樣本的13個(gè)屬性, 即使是同一個(gè)屬性相對于其他樣本可能差異很大. 這樣的數(shù)據(jù)對網(wǎng)絡(luò)訓(xùn)練是不利的(為啥不利?).普遍的做法是針對每個(gè)屬性(特征)做標(biāo)準(zhǔn)化.即輸入的數(shù)據(jù)的每個(gè)特征減去特征的平均值,再除以標(biāo)準(zhǔn)差,這樣得到的特征列都具有平均值為0,標(biāo)準(zhǔn)差為1的特點(diǎn)了.
數(shù)據(jù)處理代碼如下. 需要注意的是訓(xùn)練集的數(shù)據(jù)特征標(biāo)準(zhǔn)化后,對測試集的數(shù)據(jù)特征也需要標(biāo)準(zhǔn)化. 但測試集的數(shù)據(jù)標(biāo)準(zhǔn)化,不能用測試集的統(tǒng)計(jì)數(shù)據(jù)!, 因?yàn)閷?shí)際的測試數(shù)據(jù)集代表的是你沒有提前拿到的數(shù)據(jù),發(fā)生時(shí),也只有發(fā)生時(shí)刻的那一份

mean =train_data.mean(axis=0)
mean.shape
(13,)
mean
array([3.74511057e+00, 1.14801980e+01, 1.11044307e+01, 6.18811881e-02,
       5.57355941e-01, 6.26708168e+00, 6.90106436e+01, 3.74027079e+00,
       9.44059406e+00, 4.05898515e+02, 1.84759901e+01, 3.54783168e+02,
       1.27408168e+01])
train_data -= mean
std = train_data.std(axis=0)
std
array([9.22929073e+00, 2.37382770e+01, 6.80287253e+00, 2.40939633e-01,
       1.17147847e-01, 7.08908627e-01, 2.79060634e+01, 2.02770050e+00,
       8.68758849e+00, 1.66168506e+02, 2.19765689e+00, 9.39946015e+01,
       7.24556085e+00])
train_data /=std
test_data -= mean
test_data /=std

5.3.3 構(gòu)建網(wǎng)絡(luò)

這個(gè)數(shù)據(jù)集的特點(diǎn)是數(shù)據(jù)較少. 書上交代如果一般訓(xùn)練集越少,過擬合會(huì)越嚴(yán)重,而較小的網(wǎng)絡(luò)可以降低過擬合.
針對這個(gè)的網(wǎng)絡(luò)構(gòu)建和之前稍微有所不同的是,最后一層的Dense, 最后一層Dense不能使用激活函數(shù).如果使用激活函數(shù),最后一層的輸出會(huì)是不連續(xù)的輸出,而我們期望的預(yù)測價(jià)值是個(gè)連續(xù)值.
網(wǎng)絡(luò)構(gòu)建代碼如下

from keras import models
from keras import layers
def build_model():
    model = models.Sequential()
    model.add(layers.Dense(64,activation='relu',input_shape=(train_data.shape[1],)))
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(1))
    model.compile(optimizer='rmsprop',loss='mse', metrics=['mae'])
    return model 

5.3.4 K折驗(yàn)證

這個(gè)數(shù)據(jù)集很小,我們只劃分了100個(gè)樣本作為驗(yàn)證集. 這樣驗(yàn)證分?jǐn)?shù)會(huì)有很大的波動(dòng).這種背景下,最佳做法是:
將可用的訓(xùn)練數(shù)據(jù)劃分為K個(gè)分區(qū),

train_data.shape
(404, 13)

把train_data中的404張拆分成4份
書上的3.6.4小節(jié). 后續(xù)補(bǔ)充.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子横堡,更是在濱河造成了極大的恐慌,老刑警劉巖晓猛,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菌瘪,死亡現(xiàn)場離奇詭異玷室,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)章喉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來部蛇,“玉大人巷查,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵舅逸,是天一觀的道長。 經(jīng)常有香客問我撮弧,道長叛拷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任岂却,我火速辦了婚禮忿薇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躏哩。我一直安慰自己署浩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布扫尺。 她就那樣靜靜地躺著筋栋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪正驻。 梳的紋絲不亂的頭發(fā)上弊攘,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音姑曙,去河邊找鬼襟交。 笑死,一個(gè)胖子當(dāng)著我的面吹牛伤靠,可吹牛的內(nèi)容都是我干的捣域。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焕梅!你這毒婦竟也來了迹鹅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤丘侠,失蹤者是張志新(化名)和其女友劉穎徒欣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜗字,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡打肝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挪捕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粗梭。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖级零,靈堂內(nèi)的尸體忽然破棺而出断医,到底是詐尸還是另有隱情,我是刑警寧澤奏纪,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布鉴嗤,位于F島的核電站,受9級(jí)特大地震影響序调,放射性物質(zhì)發(fā)生泄漏醉锅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一发绢、第九天 我趴在偏房一處隱蔽的房頂上張望硬耍。 院中可真熱鬧,春花似錦边酒、人聲如沸经柴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坯认。三九已至,卻和暖如春氓涣,著一層夾襖步出監(jiān)牢的瞬間牛哺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工春哨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荆隘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓赴背,卻偏偏與公主長得像椰拒,于是被迫代替她去往敵國和親晶渠。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容