当前位置: 首页 > 科技观察

教你使用TensorFlow2判断细胞图像是否感染_0

时间:2023-03-21 12:16:41 科技观察

在本教程中,我们将使用TensorFlow(KerasAPI)为二元分类任务实施深度学习模型,该任务涉及将细胞图像标记为感染或未感染疟疾。数据集来源:https://www.kaggle.com/iarunava/cell-images-for-detecting-malaria数据集包含2个文件夹Infected:13780张图片Uninfected:13780张图片共27558张图片。这个数据集取自NIH官网:https://ceb.nlm.nih.gov/repositories/malaria-datasets/环境:kaggle,天池实验室或者gogolecolab都可以。导入相关模块importcv2importtensorflowastffromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportDense,Conv2D,MaxPool2D,Flatten,Activationfromsklearn.model_selectionimporttrain_test_splitimportnumpyasnpimportmatplotlib.pyplotasplimportCVimportos存在需要对不同形状的图像进行预处理的情况。将图像以numpy数组(数字格式)的形式转换为灰度,并将其大小调整为(70x70)形状。img_dir="../input/cell-images-for-detecting-malaria/cell_images"img_size=70defload_img_data(path):#disruptdataimage_files=glob.glob(os.path.join(path,"Parasitized/*.png"))+\glob.glob(os.path.join(path,"Uninfected/*.png"))X,y=[],[]forimage_fileinimage_files:#namedlabel0foruninfectedand1forinfectedlabel=0if"Uninfected"inimage_fileelse1#loadtheimageingrayscale成为灰度图像img_arr=cv2.imread(image_file,cv2.IMREAD_GRAYSCALE)#resizetheimageto(70x70)调整图像大小img_resized=cv2.resize(img_arr,(img_size,img_size))X.append(img_resized)y.append(label)returnX,yX,y=load_img_data(img_dir)查看X的形状print(X.shape)X的形状为(27558,70,70,1),27558代表图片的数据,70*70代表图片的长度和宽度像素。另外,为了帮助网络更快收敛,我们应该对数据进行归一化处理。sklearn中有一些缩放方法,例如:这里我们将除以255,因为一个像素可以达到的最大值是255,这将导致应用缩放后像素范围在0和1之间。X,y=load_img_data(img_dir)#reshapeto(n_samples,70,70,1)(tofittheNN)X=np.array(X).reshape(-1,img_size,img_size,1)#从[0,255]到[0,1]缩放像素有助于神经网络更快地训练X=X/255#shuffle&splitthedatasetX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1,stratify=y)print("Totaltrainingsamples:",X_train.shape)print("Totalvalidationsamples:",X_test.shape[0])使用sklearn的train_test_split()方法将数据集拆分为训练集和测试集,我们使用总数据的10%稍后对其进行验证。在建立的模型中,我们会加入3个卷积层,然后Flatten是由层组成的全连接Dense层。model=Sequential()model.add(Conv2D(64,(3,3),input_shape=X_train.shape[1:]))model.add(Activation("relu"))model.add(MaxPool2D(pool_size=(2,2)))model.add(Conv2D(64,(3,3)))model.add(Activation("relu"))model.add(MaxPool2D(pool_size=(2,2)))model.add(Conv2D(64,(3,3)))model.add(Activation("relu"))model.add(MaxPool2D(pool_size=(2,2)))model.add(Flatten())model.add(密集(64))model.add(激活(“relu”))model.add(密集(64))model.add(激活(“relu”))model.add(Dense(1))model.add(激活("sigmoid"))model.compile(loss="binary_crossentropy",optimizer="adam",metrics=["accuracy"])print(model.summary())由于输出是二进制的(感染或未感染),我们使用Sigmoid函数作为输出层的激活函数。#trainthemodelwith10epochs,64batchsizemodel.fit(X_train,np.array(y_train),batch_size=64,epochs=10,validation_split=0.2)在训练数据集及其验证拆分上实现了94%的准确率。现在使用evaluate()在测试数据集上评估模型损失,accuracy=model.evaluate(X_test,np.array(y_test),verbose=0)print(f"Testingon{len(X_test)}images,theresultsare\nAccuracy:{accuracy}|Loss:{loss}")输出如下Testingon2756images,theresultsareAccuracy:0.9404934644699097|Loss:0.1666732281446457该模型在测试数据上也表现良好,准确率为94%最后,我们将通过保存我们的模型来结束一切这个流程。model.save("model.h5")【编辑推荐】鸿蒙,如果是安卓shell呢?为什么Kubernetes会放弃Docker?从“PPT系统”到现实:HarmonyOS,你真香吗?你用过这6个PythonIDE和代码编辑器吗?优雅终止Kubernetes实践