如何生成人造数据集
最简单的方法是,从数据集中提取一个随机样本,随机打开(1)和关闭(0)一些像素来生成新的数据集
但是通常在图像中,出现的对象(如狗vs猫的分类中的:狗&猫)导致模型的预测会跨越多个像素,而不是一个像素。所以即使你关掉一两个像素,它们看起来仍然和我们选择样本非常相似。
所以这里需要做的是设置一个相邻像素池的ON和OFF,这样才能保证创造的人工数据集的随机性。所以将图像分割成多个称为超像素的片段,然后打开和关闭这些超像素来生成随机样本。
让我们使用LIME进行二进制分类来解释CNN的代码。例如我们有以下的两类数据。
IME示例
%matplotlib inline import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from keras.layers import Input, Dense, Embedding, Flatten from keras.layers import SpatialDropout1D from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.models import Sequential from randimage import get_random_image, show_array import random import pandas as pd import numpy as np import lime from lime import lime_image from skimage.segmentation import mark_boundaries #preparing above dataset artificially training_dataset = [] training_label = [] for x in range(200): img_size = (64,64) img = get_random_image(img_size) a,b = random.randrange(0,img_size[0]/2),random.randrange(0,img_size[0]/2) c,d = random.randrange(img_size[0]/2,img_size[0]),random.randrange(img_size[0]/2,img_size[0]) value = random.sample([True,False],1)[0] if value==False: img[a:c,b:d,0] = 100 img[a:c,b:d,1] = 100 img[a:c,b:d,2] = 100 training_dataset.append(img) training_label.append(value) #training baseline CNN model training_label = [1-x for x in training_label] X_train, X_val, Y_train, Y_val = train_test_split(np.array(training_dataset).reshape(-1,64,64,3),np.array(training_label).reshape(-1,1), test_size=0.1, random_state=42) epochs = 10 batch_size = 32 model = Sequential() model.add(Conv2D(32, kernel_size=3, padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=2)) model.add(Flatten()) # Output layer model.add(Dense(32,activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(X_train, Y_train, validation_data=(X_val, Y_val), epochs=epochs, batch_size=batch_size, verbose=1)
让我们引入LIME
x=10 explainer = lime_image.LimeImageExplainer(random_state=42) explanation = explainer.explain_instance( X_val[x], model.predict,top_labels=2) ) image, mask = explanation.get_image_and_mask(0, positives_only=True, hide_rest=True)
上面的代码片段需要一些解释
我们初始化了LimeImageExplainer对象,该对象使用explain_instance解释特定示例的输出。这里我们从验证集中选取了第10个样本,Get_image_and_mask()返回模型与原始图像一起预测的高亮区域。
标签:解释,training,img,random,CNN,import,model,LIME,size From: https://www.cnblogs.com/xiaobu1985/p/16883362.html