基于深度学习的图片分类模型训练与预测代码
"import os\nfrom PIL import Image\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D,MaxPool2D,Dense,Flatten,BatchNormalization,Input,add,Dropout\nfrom keras.utils import to_categorical\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nimport keras\n\nimg_x = 32\nimg_y = 32\n#对读取图片进行预处理\n#读取图片\ndef read_image(imageName):\n img = Image.open(imageName)\n #读取为6464\n img = img.resize((img_x,img_y),Image.ANTIALIAS)\n number_data = img.getdata()\n #归一化处理\n number_data_array = np.array(number_data)\n number_data_array = number_data_array.astype(float)\n number_data_normalize = number_data_array / 255\n\n return number_data_normalize\n\nimages = []\nlabels = []\n#文件路径\npath = os.listdir("./mgh")\n\n#读取路径下各文件夹对应的图片\n#遍历文件路径下包含的所有文件夹\nfor textPath in path:\n print(textPath)\n #将文件路径下各文件夹名与文件路径结合变为图片的路径\n for fn in os.listdir(os.path.join('mgh', textPath)):\n #读取所有路径下的图片\n if fn.endswith('.jpg'):\n fd = os.path.join('./mgh', textPath, fn)\n images.append(read_image(fd))\n labels.append(textPath)\nX = np.array(images)\ny = np.array(labels)\n\n#将标签转换为整数形式0\nlabel_mapping = {label: i for i, label in enumerate(np.unique(y))}\ny = np.array([label_mapping[label] for label in y])\n\n#划分训练集与测试集\nx_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=30)\n\n\ny_train = to_categorical(y_train,num_classes=len(label_mapping))\ny_test = to_categorical(y_test,num_classes=len(label_mapping))\n\nx_train = x_train.reshape(x_train.shape[0],img_x,img_y,3)\nx_test = x_test.reshape(x_test.shape[0],img_x,img_y,3)\n\n\n#定义模型\ndef res_model():\n input_shape = tf.keras.Input(shape=(img_x,img_y,3))\n x1 = Conv2D(128, kernel_size=(3,3),padding='same', activation='relu')(input_shape)\n #x1 = BatchNormalization()(x1)\n x1 = MaxPool2D(pool_size=(2,2))(x1)\n x2 = Conv2D(256, kernel_size=(3,3),padding='same', activation='relu')(x1)\n #x2 = BatchNormalization()(x2)\n x2 = MaxPool2D(pool_size=(2,2))(x2)\n\n x3 = Conv2D(512, kernel_size=(3,3),activation='relu')(x2)\n #x3 = BatchNormalization()(x3)\n \n x3 = MaxPool2D(pool_size=(2,2))(x3)\n #x3 = BatchNormalization()(x3)\n \n\n x4 = Dropout(0.25)(x3)\n x4 = Flatten()(x3)\n x4 = Dense(128,activation='relu')(x4)\n x4 = Dropout(0.5)(x4)\n output = Dense(2,activation='softmax')(x4)\n\n model = tf.keras.Model(input_shape,output)\n validity = model(input_shape)\n\n model.compile(optimizer = "adam",loss="binary_crossentropy",\n metrics = ["accuracy"])\n print(model.summary)\n\n return model\n\n'''model = tf.keras.models.Sequential()\nmodel.add(tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))\nmodel.add(tf.keras.layers.MaxPooling2D((2, 2)))\nmodel.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))\nmodel.add(tf.keras.layers.MaxPooling2D((2, 2)))\nmodel.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(tf.keras.layers.MaxPooling2D((2, 2)))\nmodel.add(tf.keras.layers.Flatten())\nmodel.add(tf.keras.layers.Dense(128, activation='relu'))\nmodel.add(tf.keras.layers.Dropout(0.5))\nmodel.add(tf.keras.layers.Dense(1, activation='sigmoid'))\n\n# 编译模型\nmodel.compile(optimizer='adam',\n loss='binary_crossentropy',\n metrics=['accuracy'])'''\n\n\n##有GPU就用GPU加速训练\nimport os\nos.environ["CUDA_VISIBLE_DEVICES"] = "-1" if tf.config.list_physical_devices('GPU') == [] else "0"\n\n#定义准确率变化绘图\ndef show_train_history(train_history, train, validation):\n plt.plot(train_history.history[train])\n plt.plot(train_history.history[validation])\n plt.title('Train History')\n plt.ylabel(train)\n plt.xlabel('Epoch')\n plt.legend(['train', 'validation'], loc='best')\n plt.show()\n\n#定义模型训练与图片展示\ndef train_model(model):\n print("Staring now")\n # 开始网络训练(定义训练数据与验证数据、定义训练代数,定义训练批大小)\n train_history = model.fit(x_train, y_train, validation_data=(x_test, y_test),\n epochs=50, batch_size=1024,verbose=2)\n\n#validation_data=(x_test, y_test)\n\n # 模型保存\n model.save('./res_model_11') # 根据要训练的网络自行修改.h5模型名称\n #_9 batch_size=64 6464 128 128 128 500 x4=Dropout(0.5)(x3) 0.94\n #_10 同上 64 64 64\n print("End now")\n show_train_history(train_history, 'accuracy', 'val_accuracy')\n show_train_history(train_history, 'loss', 'val_loss')\n\nmodel=res_model()\n#加载已训练好的模型\n#model = keras.models.load_model('./res_model_5')\n#开始训练模型\nif name == 'main':\n train_model(model)\n\n#模型打分\nscores = model.evaluate(x_test, y_test)\nprint("Score: ",scores)\n\n#进行预测\nfrom PIL import Image\n\n\n#图片类型预测\n#预处理\nimg_path = './7.jpg'\nimg = Image.open(img_path)\nimg = img.resize((img_x,img_y),Image.ANTIALIAS)\nnumber_data = img.getdata()\n\nnumber_data_array = np.array(number_data)\nnumber_data_array = number_data_array.astype(float)\nnumber_data_normalize = number_data_array / 255\nnumber_data_normalize = number_data_normalize.reshape(1,img_x,img_y,3)\n\nprediction = model.predict(number_data_normalize)\nprint(np.max(prediction))\npred_ind = np.argmax(prediction)\n\n\n#print("预测类别为: ",labels[pred_ind[0]]," 可能性为: ",pred_val[0]*100,"%")\n#print("Predicted class: {},Score: {:.2%}".format(pred_ind,pred_val))\nprint("Predicted class:",pred_ind)\n\nlabels = ['meiguihuaa', 'xiangrikui']\nprint(labels[pred_ind])
原文地址: http://www.cveoy.top/t/topic/pMux 著作权归作者所有。请勿转载和采集!