You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

tf09_keras_regression-wide_deep-subclass.ipynb 33 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "code",
  5. "execution_count": 1,
  6. "metadata": {},
  7. "outputs": [
  8. {
  9. "name": "stdout",
  10. "output_type": "stream",
  11. "text": [
  12. "2.2.0\n",
  13. "sys.version_info(major=3, minor=6, micro=9, releaselevel='final', serial=0)\n",
  14. "matplotlib 3.2.1\n",
  15. "numpy 1.18.5\n",
  16. "pandas 1.0.4\n",
  17. "sklearn 0.23.1\n",
  18. "tensorflow 2.2.0\n",
  19. "tensorflow.keras 2.3.0-tf\n"
  20. ]
  21. }
  22. ],
  23. "source": [
  24. "import matplotlib as mpl\n",
  25. "import matplotlib.pyplot as plt\n",
  26. "%matplotlib inline\n",
  27. "import numpy as np\n",
  28. "import sklearn\n",
  29. "import pandas as pd\n",
  30. "import os\n",
  31. "import sys\n",
  32. "import time\n",
  33. "import tensorflow as tf\n",
  34. "\n",
  35. "from tensorflow import keras\n",
  36. "\n",
  37. "print(tf.__version__)\n",
  38. "print(sys.version_info)\n",
  39. "for module in mpl, np, pd, sklearn, tf, keras:\n",
  40. " print(module.__name__, module.__version__)"
  41. ]
  42. },
  43. {
  44. "cell_type": "code",
  45. "execution_count": 2,
  46. "metadata": {},
  47. "outputs": [
  48. {
  49. "name": "stdout",
  50. "output_type": "stream",
  51. "text": [
  52. ".. _california_housing_dataset:\n",
  53. "\n",
  54. "California Housing dataset\n",
  55. "--------------------------\n",
  56. "\n",
  57. "**Data Set Characteristics:**\n",
  58. "\n",
  59. " :Number of Instances: 20640\n",
  60. "\n",
  61. " :Number of Attributes: 8 numeric, predictive attributes and the target\n",
  62. "\n",
  63. " :Attribute Information:\n",
  64. " - MedInc median income in block\n",
  65. " - HouseAge median house age in block\n",
  66. " - AveRooms average number of rooms\n",
  67. " - AveBedrms average number of bedrooms\n",
  68. " - Population block population\n",
  69. " - AveOccup average house occupancy\n",
  70. " - Latitude house block latitude\n",
  71. " - Longitude house block longitude\n",
  72. "\n",
  73. " :Missing Attribute Values: None\n",
  74. "\n",
  75. "This dataset was obtained from the StatLib repository.\n",
  76. "http://lib.stat.cmu.edu/datasets/\n",
  77. "\n",
  78. "The target variable is the median house value for California districts.\n",
  79. "\n",
  80. "This dataset was derived from the 1990 U.S. census, using one row per census\n",
  81. "block group. A block group is the smallest geographical unit for which the U.S.\n",
  82. "Census Bureau publishes sample data (a block group typically has a population\n",
  83. "of 600 to 3,000 people).\n",
  84. "\n",
  85. "It can be downloaded/loaded using the\n",
  86. ":func:`sklearn.datasets.fetch_california_housing` function.\n",
  87. "\n",
  88. ".. topic:: References\n",
  89. "\n",
  90. " - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
  91. " Statistics and Probability Letters, 33 (1997) 291-297\n",
  92. "\n",
  93. "(20640, 8)\n",
  94. "(20640,)\n"
  95. ]
  96. }
  97. ],
  98. "source": [
  99. "from sklearn.datasets import fetch_california_housing\n",
  100. "\n",
  101. "housing = fetch_california_housing()\n",
  102. "print(housing.DESCR)\n",
  103. "print(housing.data.shape)\n",
  104. "print(housing.target.shape)"
  105. ]
  106. },
  107. {
  108. "cell_type": "code",
  109. "execution_count": 3,
  110. "metadata": {},
  111. "outputs": [
  112. {
  113. "name": "stdout",
  114. "output_type": "stream",
  115. "text": [
  116. "(11610, 8) (11610,)\n",
  117. "(3870, 8) (3870,)\n",
  118. "(5160, 8) (5160,)\n"
  119. ]
  120. }
  121. ],
  122. "source": [
  123. "from sklearn.model_selection import train_test_split\n",
  124. "\n",
  125. "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
  126. " housing.data, housing.target, random_state = 7)\n",
  127. "x_train, x_valid, y_train, y_valid = train_test_split(\n",
  128. " x_train_all, y_train_all, random_state = 11)\n",
  129. "print(x_train.shape, y_train.shape)\n",
  130. "print(x_valid.shape, y_valid.shape)\n",
  131. "print(x_test.shape, y_test.shape)\n"
  132. ]
  133. },
  134. {
  135. "cell_type": "code",
  136. "execution_count": 4,
  137. "metadata": {},
  138. "outputs": [],
  139. "source": [
  140. "from sklearn.preprocessing import StandardScaler\n",
  141. "\n",
  142. "scaler = StandardScaler()\n",
  143. "x_train_scaled = scaler.fit_transform(x_train)\n",
  144. "x_valid_scaled = scaler.transform(x_valid)\n",
  145. "x_test_scaled = scaler.transform(x_test)"
  146. ]
  147. },
  148. {
  149. "cell_type": "code",
  150. "execution_count": 7,
  151. "metadata": {},
  152. "outputs": [
  153. {
  154. "name": "stdout",
  155. "output_type": "stream",
  156. "text": [
  157. "Model: \"wide_deep_model_2\"\n",
  158. "_________________________________________________________________\n",
  159. "Layer (type) Output Shape Param # \n",
  160. "=================================================================\n",
  161. "dense_6 (Dense) multiple 270 \n",
  162. "_________________________________________________________________\n",
  163. "dense_7 (Dense) multiple 930 \n",
  164. "_________________________________________________________________\n",
  165. "dense_8 (Dense) multiple 39 \n",
  166. "=================================================================\n",
  167. "Total params: 1,239\n",
  168. "Trainable params: 1,239\n",
  169. "Non-trainable params: 0\n",
  170. "_________________________________________________________________\n",
  171. "None\n"
  172. ]
  173. }
  174. ],
  175. "source": [
  176. "# 子类API\n",
  177. "#Model类的介绍看下面\n",
  178. "# https://tensorflow.google.cn/api_docs/python/tf/keras/Model\n",
  179. "#其实就是将原有面向过程的代码,改为面向对象\n",
  180. "class WideDeepModel(keras.models.Model):\n",
  181. " def __init__(self):\n",
  182. " super(WideDeepModel, self).__init__()\n",
  183. " \"\"\"定义模型的层次\"\"\"\n",
  184. " #初始化了3个全连接层的层对象\n",
  185. " self.hidden1_layer = keras.layers.Dense(30, activation='relu')\n",
  186. " self.hidden2_layer = keras.layers.Dense(30, activation='relu')\n",
  187. " self.output_layer = keras.layers.Dense(1)\n",
  188. " \n",
  189. " def call(self, input):\n",
  190. " \"\"\"完成模型的正向计算(搭建),call是被build方法调用的\"\"\"\n",
  191. " #这里的input是输入的特征形状\n",
  192. " hidden1 = self.hidden1_layer(input)\n",
  193. " hidden2 = self.hidden2_layer(hidden1)\n",
  194. " concat = keras.layers.concatenate([input, hidden2])\n",
  195. " output = self.output_layer(concat)\n",
  196. " return output\n",
  197. "\n",
  198. "model = WideDeepModel()\n",
  199. "#下面这种也可以,和model = WideDeepModel()是没有打印细节\n",
  200. "# model = keras.models.Sequential([\n",
  201. "# WideDeepModel(),\n",
  202. "# ])\n",
  203. "#build等价于调用call,29行和30行是等价的\n",
  204. "# model(input_shape=(None, 8))\n",
  205. "model.build(input_shape=(None, 8))\n",
  206. " \n",
  207. "print(model.summary())\n",
  208. "model.compile(loss=\"mean_squared_error\",\n",
  209. " optimizer = keras.optimizers.SGD(0.001))\n",
  210. "callbacks = [keras.callbacks.EarlyStopping(\n",
  211. " patience=5, min_delta=1e-2)]"
  212. ]
  213. },
  214. {
  215. "cell_type": "code",
  216. "execution_count": 8,
  217. "metadata": {},
  218. "outputs": [
  219. {
  220. "name": "stdout",
  221. "output_type": "stream",
  222. "text": [
  223. "Epoch 1/100\n",
  224. "363/363 [==============================] - 1s 3ms/step - loss: 2.8035 - val_loss: 1.0274\n",
  225. "Epoch 2/100\n",
  226. "363/363 [==============================] - 1s 2ms/step - loss: 0.7387 - val_loss: 0.6841\n",
  227. "Epoch 3/100\n",
  228. "363/363 [==============================] - 1s 2ms/step - loss: 0.6182 - val_loss: 0.6414\n",
  229. "Epoch 4/100\n",
  230. "363/363 [==============================] - 1s 2ms/step - loss: 0.5884 - val_loss: 0.6184\n",
  231. "Epoch 5/100\n",
  232. "363/363 [==============================] - 1s 2ms/step - loss: 0.5689 - val_loss: 0.6016\n",
  233. "Epoch 6/100\n",
  234. "363/363 [==============================] - 1s 2ms/step - loss: 0.5555 - val_loss: 0.5885\n",
  235. "Epoch 7/100\n",
  236. "363/363 [==============================] - 1s 2ms/step - loss: 0.5444 - val_loss: 0.5785\n",
  237. "Epoch 8/100\n",
  238. "363/363 [==============================] - 1s 2ms/step - loss: 0.5350 - val_loss: 0.5679\n",
  239. "Epoch 9/100\n",
  240. "363/363 [==============================] - 1s 2ms/step - loss: 0.5276 - val_loss: 0.5606\n",
  241. "Epoch 10/100\n",
  242. "363/363 [==============================] - 1s 2ms/step - loss: 0.5214 - val_loss: 0.5531\n",
  243. "Epoch 11/100\n",
  244. "363/363 [==============================] - 1s 2ms/step - loss: 0.5158 - val_loss: 0.5499\n",
  245. "Epoch 12/100\n",
  246. "363/363 [==============================] - 1s 2ms/step - loss: 0.5110 - val_loss: 0.5429\n",
  247. "Epoch 13/100\n",
  248. "363/363 [==============================] - 1s 2ms/step - loss: 0.5059 - val_loss: 0.5385\n",
  249. "Epoch 14/100\n",
  250. "363/363 [==============================] - 1s 2ms/step - loss: 0.5008 - val_loss: 0.5325\n",
  251. "Epoch 15/100\n",
  252. "363/363 [==============================] - 1s 2ms/step - loss: 0.4973 - val_loss: 0.5282\n",
  253. "Epoch 16/100\n",
  254. "363/363 [==============================] - 1s 2ms/step - loss: 0.4933 - val_loss: 0.5243\n",
  255. "Epoch 17/100\n",
  256. "363/363 [==============================] - 1s 2ms/step - loss: 0.4890 - val_loss: 0.5195\n",
  257. "Epoch 18/100\n",
  258. "363/363 [==============================] - 1s 2ms/step - loss: 0.4858 - val_loss: 0.5162\n",
  259. "Epoch 19/100\n",
  260. "363/363 [==============================] - 1s 2ms/step - loss: 0.4830 - val_loss: 0.5129\n",
  261. "Epoch 20/100\n",
  262. "363/363 [==============================] - 1s 2ms/step - loss: 0.4794 - val_loss: 0.5113\n",
  263. "Epoch 21/100\n",
  264. "363/363 [==============================] - 1s 2ms/step - loss: 0.4764 - val_loss: 0.5058\n",
  265. "Epoch 22/100\n",
  266. "363/363 [==============================] - 1s 2ms/step - loss: 0.4734 - val_loss: 0.5035\n",
  267. "Epoch 23/100\n",
  268. "363/363 [==============================] - 1s 2ms/step - loss: 0.4707 - val_loss: 0.4990\n",
  269. "Epoch 24/100\n",
  270. "363/363 [==============================] - 1s 1ms/step - loss: 0.4676 - val_loss: 0.4974\n",
  271. "Epoch 25/100\n",
  272. "363/363 [==============================] - 1s 2ms/step - loss: 0.4657 - val_loss: 0.4938\n",
  273. "Epoch 26/100\n",
  274. "363/363 [==============================] - 1s 2ms/step - loss: 0.4632 - val_loss: 0.4917\n",
  275. "Epoch 27/100\n",
  276. "363/363 [==============================] - 1s 2ms/step - loss: 0.4600 - val_loss: 0.4888\n",
  277. "Epoch 28/100\n",
  278. "363/363 [==============================] - 1s 2ms/step - loss: 0.4579 - val_loss: 0.4864\n",
  279. "Epoch 29/100\n",
  280. "363/363 [==============================] - 1s 2ms/step - loss: 0.4554 - val_loss: 0.4835\n",
  281. "Epoch 30/100\n",
  282. "363/363 [==============================] - 1s 2ms/step - loss: 0.4529 - val_loss: 0.4804\n",
  283. "Epoch 31/100\n",
  284. "363/363 [==============================] - 1s 2ms/step - loss: 0.4505 - val_loss: 0.4786\n",
  285. "Epoch 32/100\n",
  286. "363/363 [==============================] - 1s 2ms/step - loss: 0.4483 - val_loss: 0.4758\n",
  287. "Epoch 33/100\n",
  288. "363/363 [==============================] - 1s 2ms/step - loss: 0.4461 - val_loss: 0.4749\n",
  289. "Epoch 34/100\n",
  290. "363/363 [==============================] - 1s 2ms/step - loss: 0.4431 - val_loss: 0.4708\n",
  291. "Epoch 35/100\n",
  292. "363/363 [==============================] - 1s 2ms/step - loss: 0.4414 - val_loss: 0.4681\n",
  293. "Epoch 36/100\n",
  294. "363/363 [==============================] - 1s 1ms/step - loss: 0.4394 - val_loss: 0.4661\n",
  295. "Epoch 37/100\n",
  296. "363/363 [==============================] - 1s 2ms/step - loss: 0.4383 - val_loss: 0.4651\n",
  297. "Epoch 38/100\n",
  298. "363/363 [==============================] - 1s 2ms/step - loss: 0.4354 - val_loss: 0.4635\n",
  299. "Epoch 39/100\n",
  300. "363/363 [==============================] - 1s 2ms/step - loss: 0.4335 - val_loss: 0.4605\n",
  301. "Epoch 40/100\n",
  302. "363/363 [==============================] - 1s 2ms/step - loss: 0.4319 - val_loss: 0.4587\n",
  303. "Epoch 41/100\n",
  304. "363/363 [==============================] - 1s 2ms/step - loss: 0.4293 - val_loss: 0.4571\n",
  305. "Epoch 42/100\n",
  306. "363/363 [==============================] - 1s 2ms/step - loss: 0.4274 - val_loss: 0.4542\n",
  307. "Epoch 43/100\n",
  308. "363/363 [==============================] - 1s 2ms/step - loss: 0.4254 - val_loss: 0.4520\n",
  309. "Epoch 44/100\n",
  310. "363/363 [==============================] - 1s 2ms/step - loss: 0.4242 - val_loss: 0.4504\n",
  311. "Epoch 45/100\n",
  312. "363/363 [==============================] - 1s 2ms/step - loss: 0.4219 - val_loss: 0.4490\n",
  313. "Epoch 46/100\n",
  314. "363/363 [==============================] - 1s 2ms/step - loss: 0.4198 - val_loss: 0.4473\n",
  315. "Epoch 47/100\n",
  316. "363/363 [==============================] - 1s 2ms/step - loss: 0.4196 - val_loss: 0.4449\n",
  317. "Epoch 48/100\n",
  318. "363/363 [==============================] - 1s 2ms/step - loss: 0.4173 - val_loss: 0.4432\n",
  319. "Epoch 49/100\n",
  320. "363/363 [==============================] - 1s 2ms/step - loss: 0.4154 - val_loss: 0.4417\n"
  321. ]
  322. }
  323. ],
  324. "source": [
  325. "history = model.fit(x_train_scaled, y_train,\n",
  326. " validation_data = (x_valid_scaled, y_valid),\n",
  327. " epochs = 100,\n",
  328. " callbacks = callbacks)"
  329. ]
  330. },
  331. {
  332. "cell_type": "code",
  333. "execution_count": 9,
  334. "metadata": {},
  335. "outputs": [
  336. {
  337. "data": {
  338. "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe0AAAEzCAYAAAAcgFukAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deZxddZ3n/9fn7rVlTyohCUlYAySQSEAYFArQgNCC/mwHEByw1fQouMyvm2m0+4cOLq3y6La7p7EhozTiKIEfjd0ooSGtFMuwmICBJCwhiUCqyL7Wfrfv/HHOrbpVqUrdqjqhcuq8n4/HeZz93O/9kuLz3c73mnMOEREROfrFRjsBIiIiUhkFbRERkZBQ0BYREQkJBW0REZGQUNAWEREJCQVtERGRkBg0aJvZbDN7wsxeNbMNZvaVfq4xM/sHM9tkZq+Y2fvKzl1vZm/6y/VBfwEREZGosMHe0zazGcAM59xLZlYHvAh8zDn3atk1lwFfAi4D3g/8vXPu/WY2CVgDLAGcf++Zzrl9R+TbiIiIjGGD1rSdc9uccy/52y3Aa8DMPpddCdzrPM8DE/xgfwmwyjm31w/Uq4BLA/0GIiIiETGkPm0zmwssBl7oc2omsLVsv8k/NtBxERERGaJEpReaWS3wL8BXnXMHg06ImS0DlgFUVVWdOXv27MCeXSwWicVi7Ol0tOUcx9Zp/N1IlPJTgqM8DZ7yNFjKz+CV5+nGjRt3O+emDnZPRUHbzJJ4AfvnzrmH+rmkGSiPsrP8Y81AQ5/jjf19hnNuObAcYMmSJW7NmjWVJK0ijY2NNDQ08O1fv8p9v3uHDbephX4kSvkpwVGeBk95GizlZ/DK89TM3q7knkpGjxvwE+A159zfDnDZw8B/8UeRnwMccM5tAx4DlprZRDObCCz1j42KdDJGV744Wh8vIiIyIpXUtM8DPg2sM7O1/rGvA8cCOOfuBFbijRzfBLQDn/HP7TWzbwGr/ftuc87tDS75Q5OKx8kXHYWiIx6z0UqGiIjIsAwatJ1zzwCHjXDOe2/sxgHO3Q3cPazUBSyd9BoWsvkiVan4KKdGRERkaCoeiDYWpBNe0O7KFxS0RUQClMvlaGpqorOzc7STclTLZDLMmjWLZDI5rPsjFbRT3UFb/doiIkFqamqirq6OuXPn4g2Fkr6cc+zZs4empibmzZs3rGdEavx+OuHVrrtyCtoiIkHq7Oxk8uTJCtiHYWZMnjx5RK0REQvafp92oTDKKRERGXsUsAc30jyKZNDuVE1bRGTMqa2tHe0kHHGRCtrq0xYRkTCLVNAu9WlnFbRFRMYs5xw333wzCxYsYOHChdx///0AbNu2jfPPP59FixaxYMECnn76aQqFAjfccEP3tT/84Q9HOfWHF6nR46X3tLvy6tMWERmrHnroIdauXcvLL7/M7t27Oeusszj//PP5xS9+wSWXXMJf/uVfUigUaG9vZ+3atTQ3N7N+/XoA9u/fP8qpP7xIBe1UXM3jIiJH2v/41QZefTfY35U69ZhxfOOjp1V07TPPPMM111xDPB6nvr6eCy64gNWrV3PWWWfxJ3/yJ+RyOT72sY+xaNEijjvuOLZs2cKXvvQlLr/8cpYuXRpouoMWqebxTFJBW0Qkqs4//3yeeuopZs6cyQ033MC9997LxIkTefnll2loaODOO+/kc5/73Ggn87AiVdNWn7aIyJFXaY34SPngBz/IXXfdxfXXX8/evXt56qmnuP3223n77beZNWsWn//85+nq6uKll17isssuI5VK8YlPfIKTTz6Z6667blTTPpiIBW31aYuIjHUf//jHee655zjjjDMwM37wgx8wffp0fvrTn3L77beTTCapra3l3nvvpbm5mc985jMUi15l7q//+q9HOfWHF6mg3f3Kl97TFhEZc1pbWwFvApPbb7+d22+/vdf566+/nuuvv/6Q+1566aX3JH1BiFSfdnfzeEFBW0REwidSQVs1bRERCbNIBe14zEjETH3aIiISSpEK2uANRtMrXyIiEkbRC9rJuF75EhGRUIpe0E7E1DwuIiKhFLmgnVLzuIiIhFTkgnY6EVPzuIhIxB3ut7ffeustFixY8B6mpnIRDNpx1bRFRCSUIhe0U+rTFhEZc2655RbuuOOO7v1vfvObfPvb3+biiy/mfe97HwsXLuTf/u3fhvzczs5OPvOZz7Bw4UIWL17ME088AcCGDRs4++yzWbRoEaeffjpvvvkmbW1tXH755ZxxxhksWLCg+3e8gxSpaUzBH4imyVVERI6cR2+B7euCfeb0hfCR7w14+qqrruKrX/0qN954IwAPPPAAjz32GF/+8pcZN24cu3fv5pxzzuGKK67AzCr+2DvuuAMzY926dbz++uss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\n",
  339. "text/plain": [
  340. "<Figure size 576x360 with 1 Axes>"
  341. ]
  342. },
  343. "metadata": {
  344. "needs_background": "light"
  345. },
  346. "output_type": "display_data"
  347. }
  348. ],
  349. "source": [
  350. "def plot_learning_curves(history):\n",
  351. " pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
  352. " plt.grid(True)\n",
  353. " plt.gca().set_ylim(0, 2)\n",
  354. " plt.show()\n",
  355. "plot_learning_curves(history)"
  356. ]
  357. },
  358. {
  359. "cell_type": "code",
  360. "execution_count": 10,
  361. "metadata": {},
  362. "outputs": [
  363. {
  364. "data": {
  365. "text/plain": [
  366. "0.43126633763313293"
  367. ]
  368. },
  369. "execution_count": 10,
  370. "metadata": {},
  371. "output_type": "execute_result"
  372. }
  373. ],
  374. "source": [
  375. "model.evaluate(x_test_scaled, y_test, verbose=0)"
  376. ]
  377. },
  378. {
  379. "cell_type": "code",
  380. "execution_count": null,
  381. "metadata": {},
  382. "outputs": [],
  383. "source": []
  384. }
  385. ],
  386. "metadata": {
  387. "kernelspec": {
  388. "display_name": "Python 3",
  389. "language": "python",
  390. "name": "python3"
  391. },
  392. "language_info": {
  393. "codemirror_mode": {
  394. "name": "ipython",
  395. "version": 3
  396. },
  397. "file_extension": ".py",
  398. "mimetype": "text/x-python",
  399. "name": "python",
  400. "nbconvert_exporter": "python",
  401. "pygments_lexer": "ipython3",
  402. "version": "3.6.9"
  403. }
  404. },
  405. "nbformat": 4,
  406. "nbformat_minor": 2
  407. }

随着人工智能和大数据的发展,任一方面对自动化工具有着一定的需求,在当下疫情防控期间,使用mindspore来实现yolo模型来进行目标检测及语义分割,对视频或图片都可以进行口罩佩戴检测和行人社交距离检测,来对公共场所的疫情防控来实行自动化管理。