1. 程式人生 > 程式設計 >keras分類模型中的輸入資料與標籤的維度例項

keras分類模型中的輸入資料與標籤的維度例項

在《python深度學習》這本書中。

一、21頁mnist十分類

匯入資料集
from keras.datasets import mnist
(train_images,train_labels),(test_images,test_labels) = mnist.load_data()

初始資料維度:
>>> train_images.shape
(60000,28,28)
>>> len(train_labels)
60000
>>> train_labels
array([5,4,...,5,6,8],dtype=uint8)

資料預處理:
train_images = train_images.reshape((60000,28 * 28))
train_images = train_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
  
之後:
print(train_images,type(train_images),train_images.shape,train_images.dtype)
print(train_labels,type(train_labels),train_labels.shape,train_labels.dtype)
結果:
[[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]] <class 'numpy.ndarray'> (60000,784) float32
[[0. 0. 0. ... 0. 0. 0.]
 [1. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 1. 0.]] <class 'numpy.ndarray'> (60000,10) float32

二、51頁IMDB二分類

匯入資料:

from keras.datasets import imdb (train_data,(test_data,test_labels) = imdb.load_data(num_words=10000)

引數 num_words=10000 的意思是僅保留訓練資料中前 10 000 個最常出現的單詞。

train_data和test_data都是numpy.ndarray型別,都是一維的(共25000個元素,相當於25000個list),其中每個list代表一條評論,每個list中的每個元素的值範圍在0-9999 ,代表10000個最常見單詞的每個單詞的索引,每個list長度不一,因為每條評論的長度不一,例如train_data中的list最短的為11,最長的為189。

train_labels和test_labels都是含25000個元素(元素的值要不0或者1,代表兩類)的list。

資料預處理:

# 將整數序列編碼為二進位制矩陣
def vectorize_sequences(sequences,dimension=10000):
 # Create an all-zero matrix of shape (len(sequences),dimension)
 results = np.zeros((len(sequences),dimension))
 for i,sequence in enumerate(sequences):
  results[i,sequence] = 1. # set specific indices of results[i] to 1s
 return results


x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)

第一種方式:shape為(25000,)
y_train = np.asarray(train_labels).astype('float32') #就用這種方式就行了
y_test = np.asarray(test_labels).astype('float32')
第二種方式:shape為(25000,1)
y_train = np.asarray(train_labels).astype('float32').reshape(25000,1)
y_test = np.asarray(test_labels).astype('float32').reshape(25000,1)
第三種方式:shape為(25000,2)
y_train = to_categorical(train_labels) #變成one-hot向量
y_test = to_categorical(test_labels)

第三種方式,相當於把二分類看成了多分類,所以網路的結構同時需要更改,

最後輸出的維度:1->2

最後的啟用函式:sigmoid->softmax

損失函式:binary_crossentropy->categorical_crossentropy

預處理之後,train_data和test_data變成了shape為(25000,10000),dtype為float32的ndarray(one-hot向量),train_labels和test_labels變成了shape為(25000,)的一維ndarray,或者(25000,1)的二維ndarray,或者shape為(25000,2)的one-hot向量。

注:

1.sigmoid對應binary_crossentropy,softmax對應categorical_crossentropy

2.網路的所有輸入和目標都必須是浮點數張量

補充知識:keras輸入資料的方法:model.fit和model.fit_generator

1.第一種,普通的不用資料增強的

from keras.datasets import mnist,cifar10,cifar100
(X_train,y_train),(X_valid,Y_valid) = cifar10.load_data() 
model.fit(X_train,Y_train,batch_size=batch_size,nb_epoch=nb_epoch,shuffle=True,verbose=1,validation_data=(X_valid,Y_valid),)

2.第二種,帶資料增強的 ImageDataGenerator,可以旋轉角度、平移等操作。

from keras.preprocessing.image import ImageDataGenerator
(trainX,trainY),(testX,testY) = cifar100.load_data()
trainX = trainX.astype('float32')
testX = testX.astype('float32')
trainX /= 255.
testX /= 255.
Y_train = np_utils.to_categorical(trainY,nb_classes)
Y_test = np_utils.to_categorical(testY,nb_classes)
generator = ImageDataGenerator(rotation_range=15,width_shift_range=5./32,height_shift_range=5./32)
generator.fit(trainX,seed=0)
model.fit_generator(generator.flow(trainX,batch_size=batch_size),steps_per_epoch=len(trainX) // batch_size,epochs=nb_epoch,callbacks=callbacks,validation_data=(testX,Y_test),validation_steps=testX.shape[0] // batch_size,verbose=1)

以上這篇keras分類模型中的輸入資料與標籤的維度例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。