編程軟體
之前使用pycharm來訓練模型發現很難對代碼進行實時的修改,在訓練完模型之后保存后 需要運行很多余的代碼,在這里我覺的notebook 更適合用來進行訓練測驗
代碼
# 匯入需要的包
from keras.datasets import cifar10
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.optimizers import SGD, Adam, RMSprop
import matplotlib.pyplot as plt
import pandas as pd
import os
import cv2 as cv
import numpy as np
import PIL.Image as Image
# CIFAR-10 是包含了60000 張 32*32 的三通道資料集,
#在這里保存下圖片的大小
IMG_CHANNELS = 3
IMG_ROWS = 32
IMG_COLS = 32
保存圖片的維度是因為在keras Sequential模型中, 第一層Conv2D 中需要輸入圖片的大小尺寸
# 定義超引數
BATCH_SIZE = 128
NB_EPOCH = 40
NB_CLASSES = 10
VERBOSE = 1
VALIDATION_SPLIT = 0.2
OPTIM= RMSprop()
# 加載資料集
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
print('X_train.shape: ', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
# 做one-hot 編碼,并把圖片歸一化操作
# 分類轉換
Y_train = np_utils.to_categorical(y_train, NB_CLASSES)
Y_test = np_utils.to_categorical(y_test, NB_CLASSES)
# 將其轉化為float型別, 并對其進行歸一化操作
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /=255
構建神經網路
# 構建神經網路
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
input_shape=(IMG_ROWS, IMG_COLS, IMG_CHANNELS))) # 32個卷積濾波器, 每個濾波器的大小是3*3
# 當Conv2D 模型作為第一層的時候需要給其添加輸入維度
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
#深度管道中的下一個階段是512 個單元 和Relu 的激活函式的全連接網路,其后是關閉了50% 的神經元的dropout 層作為輸出有10 個類的softmax 層,每一個類對應一個類別
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(NB_CLASSES))
model.add(Activation('softmax'))
model.summary()
訓練模型
#定義了網路之后開始訓練
model.compile(loss='categorical_crossentropy',optimizer=OPTIM, metrics=['accuracy'])
model.fit(X_train, Y_train, batch_size=BATCH_SIZE,
epochs=NB_EPOCH, validation_split=VALIDATION_SPLIT, shuffle=True)
score = model.evaluate(X_test, Y_test,
batch_size=BATCH_SIZE, verbose=VERBOSE)
print("Test score:", score[0])
print('Test accuracy:', score[1])
結果
Epoch 1/40
313/313 [==============================] - 6s 16ms/step - loss: 2.0243 - accuracy: 0.2575 - val_loss: 1.6328 - val_accuracy: 0.4184
Epoch 2/40
313/313 [==============================] - 4s 14ms/step - loss: 1.4476 - accuracy: 0.4816 - val_loss: 1.1816 - val_accuracy: 0.5755
Epoch 3/40
313/313 [==============================] - 4s 14ms/step - loss: 1.1817 - accuracy: 0.5780 - val_loss: 1.0592 - val_accuracy: 0.6275
Epoch 4/40
313/313 [==============================] - 4s 14ms/step - loss: 1.0345 - accuracy: 0.6376 - val_loss: 1.0002 - val_accuracy: 0.6482
Epoch 5/40
313/313 [==============================] - 4s 14ms/step - loss: 0.9094 - accuracy: 0.6838 - val_loss: 0.9212 - val_accuracy: 0.6794
Epoch 6/40
313/313 [==============================] - 4s 14ms/step - loss: 0.8270 - accuracy: 0.7113 - val_loss: 0.8573 - val_accuracy: 0.7003
Epoch 7/40
313/313 [==============================] - 4s 14ms/step - loss: 0.7702 - accuracy: 0.7303 - val_loss: 0.7958 - val_accuracy: 0.7242
Epoch 8/40
313/313 [==============================] - 4s 14ms/step - loss: 0.7012 - accuracy: 0.7575 - val_loss: 0.7268 - val_accuracy: 0.7517
Epoch 9/40
313/313 [==============================] - 4s 14ms/step - loss: 0.6536 - accuracy: 0.7722 - val_loss: 0.7270 - val_accuracy: 0.7498
Epoch 10/40
313/313 [==============================] - 4s 14ms/step - loss: 0.6312 - accuracy: 0.7812 - val_loss: 0.7472 - val_accuracy: 0.7471
Epoch 11/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5972 - accuracy: 0.7935 - val_loss: 0.7077 - val_accuracy: 0.7733
Epoch 12/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5870 - accuracy: 0.8014 - val_loss: 0.7168 - val_accuracy: 0.7697
Epoch 13/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5611 - accuracy: 0.8081 - val_loss: 0.7616 - val_accuracy: 0.7534
Epoch 14/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5451 - accuracy: 0.8161 - val_loss: 0.7596 - val_accuracy: 0.7668
Epoch 15/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5417 - accuracy: 0.8206 - val_loss: 0.6806 - val_accuracy: 0.7799
Epoch 16/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5407 - accuracy: 0.8213 - val_loss: 0.7599 - val_accuracy: 0.7797
Epoch 17/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5299 - accuracy: 0.8261 - val_loss: 0.7900 - val_accuracy: 0.7603
Epoch 18/40
313/313 [==============================] - 5s 14ms/step - loss: 0.5218 - accuracy: 0.8296 - val_loss: 0.8555 - val_accuracy: 0.7555
Epoch 19/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5224 - accuracy: 0.8256 - val_loss: 0.7607 - val_accuracy: 0.7849
Epoch 20/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5130 - accuracy: 0.8322 - val_loss: 0.7154 - val_accuracy: 0.7703
Epoch 21/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5080 - accuracy: 0.8331 - val_loss: 0.7410 - val_accuracy: 0.7818
Epoch 22/40
313/313 [==============================] - 5s 14ms/step - loss: 0.5121 - accuracy: 0.8384 - val_loss: 0.8094 - val_accuracy: 0.7465
Epoch 23/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5174 - accuracy: 0.8328 - val_loss: 0.7604 - val_accuracy: 0.7760
Epoch 24/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5109 - accuracy: 0.8357 - val_loss: 0.7400 - val_accuracy: 0.7684
Epoch 25/40
313/313 [==============================] - 5s 14ms/step - loss: 0.5049 - accuracy: 0.8380 - val_loss: 0.7450 - val_accuracy: 0.7711
Epoch 26/40
313/313 [==============================] - 4s 14ms/step - loss: 0.5140 - accuracy: 0.8353 - val_loss: 0.7522 - val_accuracy: 0.7767
Epoch 27/40
313/313 [==============================] - 5s 14ms/step - loss: 0.4955 - accuracy: 0.8397 - val_loss: 0.7715 - val_accuracy: 0.7830
Epoch 28/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5037 - accuracy: 0.8395 - val_loss: 0.7806 - val_accuracy: 0.7799
Epoch 29/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5104 - accuracy: 0.8402 - val_loss: 0.8468 - val_accuracy: 0.7866
Epoch 30/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5066 - accuracy: 0.8407 - val_loss: 0.7501 - val_accuracy: 0.7755
Epoch 31/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5118 - accuracy: 0.8370 - val_loss: 0.8303 - val_accuracy: 0.7885
Epoch 32/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5201 - accuracy: 0.8382 - val_loss: 0.7711 - val_accuracy: 0.7880
Epoch 33/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5329 - accuracy: 0.8365 - val_loss: 0.7746 - val_accuracy: 0.7961
Epoch 34/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5065 - accuracy: 0.8407 - val_loss: 1.0186 - val_accuracy: 0.7816
Epoch 35/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5252 - accuracy: 0.8377 - val_loss: 0.7815 - val_accuracy: 0.7771
Epoch 36/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5233 - accuracy: 0.8370 - val_loss: 1.1165 - val_accuracy: 0.7676
Epoch 37/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5336 - accuracy: 0.8356 - val_loss: 0.7393 - val_accuracy: 0.7863
Epoch 38/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5204 - accuracy: 0.8378 - val_loss: 0.9677 - val_accuracy: 0.7916
Epoch 39/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5149 - accuracy: 0.8412 - val_loss: 0.7782 - val_accuracy: 0.7804
Epoch 40/40
313/313 [==============================] - 5s 15ms/step - loss: 0.5300 - accuracy: 0.8358 - val_loss: 0.8108 - val_accuracy: 0.7514
79/79 [==============================] - 0s 4ms/step - loss: 0.8284 - accuracy: 0.7447
Test score: 0.8284057378768921
Test accuracy: 0.744700014591217
保存模型
# 保存模型
model_json = model.to_json()
with open('cifar10_architecture1.json', 'w') as f:
f.write(model_json)
model.save_weights('cifar10_weights1.h5', overwrite=True)
加載模型
# 利用獲取到的模型進行預測
from keras.models import model_from_json
from keras.optimizers import SGD
model_architecture = 'cifar10_architecture1.json'
model_weights = 'cifar10_weights1.h5'
with open('cifar10_architecture1.json', 'r') as f:
model_read = f.read()
model = model_from_json(model_read)
model.load_weights(model_weights)
加載模型之后就是對圖片進行預測了, 在這里用爬蟲從網上下載了些貓的圖片然后對其進行預測,
這里我用opencv模塊對圖片進行預處理, 因為在訓練模型的時候我們是對圖片進行了一系列的操作, 包括輸入的維度, 圖片的大小, 首先加載圖片
預測圖片預處理操作
def get_inputs(src=[]):
prex = []
for s in src:
input_img = cv.imread(s)
input_img = cv.resize(input_img, (32, 32))
input_img = cv.cvtColor(input_img, cv.COLOR_BGR2RGB)
prex.append(input_img)
#由于進入網路的圖片是歸一化后的圖片, 因此在預測的時候也應該對其進行歸一化操作
prex = np.array(prex) / 255.0
return prex
我是將圖片保存在了檔案夾下, 而opencv 讀取圖片檔案需要檔案的路徑以及名稱, 因此我需要獲取圖片檔案夾下所有圖片的名稱并將其 路徑+名稱 添加到 list 串列中 需要用到os 模塊
# 創建檔案絕對路徑串列
img_path = []
# 檔案夾路徑
dir = '/home/cyf/PycharmProjects/ProjectTensorFlow/img_cat'
for filename in os.listdir(dir):
# 因為獲取到的檔案只是名稱 要讓opencv 讀取需要添加前邊的路徑
head = '/home/cyf/PycharmProjects/ProjectTensorFlow/img_cat/'
path = head + filename
img_path.append(path)
到這里我們獲取到了圖片的絕對路徑, 可以用opencv 對圖片進行處理了
prex = get_inputs(img_path)
# 在這里我們獲取到了處理后的圖片
到這里我們獲取到了處理后的圖, 然后可以用訓練好的模型對其進行預測了
optim = SGD()
model.compile(loss='categorical_crossentropy', optimizer=optim, metrics=['accuracy'])
predictions = model.predict_classes(prex)
獲取到prediction 是一個包含類別的串列
查看準確率
因為這一個檔案夾內全部都是貓的圖片, 所以通過判斷標簽下標是否是3 來判斷是否預測正確
cat = 3
right = 0
for p in predictions:
if p == cat:
right+=1
accurcy = right/len(predictions)
print(len(predictions))
print(accurcy)
1473
0.3693143245078072
最后發現只有30 多的準率, 對于貓來說,
問題
1.在訓練的時候準確率明明不是特別低70多把, 但是用在實際上的時候發現只有36% 的準確率, 這是不是過擬合的一種表現?
2.keras 進行預測的時候圖片三個通道的順序會不會對預測結果產生影響, 是不是因為自己的輸入資料維度和keras 本身驗證測驗集的維度順序有所不一樣導致完全不一樣的結果呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272248.html
標籤:python
下一篇:一個代表二維表格的類(面向物件)
