写在前面:感谢阿里天池实验室,让我免费白嫖到GPU训练数据
本文参考价值不大,只是本人练手的代码,简单保存下代码而已,若有错误,尽管提出,不胜感激。
-------------------------------------分割线--------------------------------
1-导入所需要的包
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import os
import re
from PIL import Image
import random
%matplotlib inline
2-从文件中获取数据集
def make_data():
file_list = os.listdir('dataset/')
pic_to_label = {'nothing':0,'ok':1,'peace':2,'punch':3,'stop':4}
data_path = []
data = []
label = []
for item in file_list:
data_path.append(item)
for i in range(10):
random.shuffle(data_path)
for item in data_path:
temp = 'dataset/'+item
if re.match('n+othing',item) != None:
label.append([0])
im = Image.open(temp)
im = im.convert('L')
img_ndarray = np.asarray(im, dtype='float64')
data.append(img_ndarray)
elif re.match('iiok',item) != None:
label.append([1])
im = Image.open(temp)
im = im.convert('L')
img_ndarray = np.asarray(im, dtype='float64')
data.append(img_ndarray)
elif re.match('peace',item) != None:
label.append([2])
im = Image.open(temp)
im = im.convert('L')
img_ndarray = np.asarray(im, dtype='float64')
data.append(img_ndarray)
elif re.match('punch',item) != None:
label.append([3])
im = Image.open(temp)
im = im.convert('L')
img_ndarray = np.asarray(im, dtype='float64')
data.append(img_ndarray)
elif re.match('stop',item) != None:
label.append([4])
im = Image.open(temp)
im = im.convert('L')
img_ndarray = np.asarray(im, dtype='float64')
data.append(img_ndarray)
return data,label
3-加载数据集,分为训练集和测试集(6:4)
def load_data():
data,label = make_data()
data_number = len(data)
train_number = data_number*6//10
test_data = data_number-train_number
data_train = data[0:train_number]
label_train = label[0:train_number]
data_test = data[train_number:-1]
label_test = label[train_number:-1]
return(data_train,label_train),(data_test,label_test)
4-预处理数据(归一化,标签变one_hot)
def process_data():
(data_train,label_train),(data_test,label_test) = load_data()
data_train = np.array(data_train)
#data_train = data_train.reshape(data_train.shape[0],1,200,200)/255
data_test = np.array(data_test)
# data_test = data_test.reshape(data_test.shape[0],1,200,200)/255
data_train = np.expand_dims(data_train,-1)/255
data_test = np.expand_dims(data_test,-1)/255
label_train = np.array(label_train,dtype='uint8')
label_test = np.array(label_test,dtype='uint8')
label_train_onehot = tf.keras.utils.to_categorical(label_train)
label_test_onehot = tf.keras.utils.to_categorical(label_test)
return(data_train,label_train_onehot),(data_test,label_test_onehot)
5-搭建卷积网络
def build_model():
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(16,(3,3),input_shape=(200,200,1),activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(16,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.MaxPool2D())
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Conv2D(32,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(32,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.MaxPool2D())
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.MaxPool2D())
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.MaxPool2D())
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Conv2D(256,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(256,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.MaxPool2D())
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(256,activation='relu'))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(256,activation='relu'))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(5,activation='softmax'))
return model
6-后续训练数据,预测数据
model = build_model()
model.summary()
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['acc']
)
(data_train,label_train),(data_test,label_test) = process_data()
history = model.fit(data_train,label_train,epochs=30,validation_data=(data_test,label_test))
history.history.keys()
plt.plot(history.epoch,history.history.get('loss'),label='loss')
plt.plot(history.epoch,history.history.get('val_loss'),label='val_loss')
plt.legend()
plt.plot(history.epoch,history.history.get('val_acc'),label='val_acc')
plt.plot(history.epoch,history.history.get('acc'),label='acc')
plt.legend()
model.evaluate(data_test,label_test)
7-训练过程情况
8-训练结果测试
pic_to_label = {0:'nothing',1:'ok',2:'peace',3:'punch',4:'stop'}
im = Image.open('dataset/punch100.png')
im = im.convert('L')
im = np.asarray(im, dtype='float64')
plt.imshow(im)
im = im.reshape(1,200,200,1)
ans = model.predict(im)
ans = np.argmax(ans)
print(' ',pic_to_label[ans])