Skip to content

Instantly share code, notes, and snippets.

@nttuan8
Created April 10, 2019 09:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nttuan8/db06444ccfe33d5172f0a0c829486641 to your computer and use it in GitHub Desktop.
Save nttuan8/db06444ccfe33d5172f0a0c829486641 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\DELL\\Anaconda3\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
" from ._conv import register_converters as _register_converters\n",
"Using TensorFlow backend.\n"
]
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import os\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"from keras.models import Sequential \n",
"from keras.optimizers import Adam\n",
"from keras.callbacks import ModelCheckpoint\n",
"from keras.layers import Lambda, Conv2D, Dropout, Dense, Flatten\n",
"from keras.regularizers import l2\n",
"\n",
"from utils import INPUT_SHAPE, batch_generator"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([ 7., 53., 302., 610., 5553., 208., 179., 43., 18.,\n",
" 11.]),\n",
" array([-0.9197341 , -0.72776069, -0.53578728, -0.34381387, -0.15184046,\n",
" 0.04013295, 0.23210636, 0.42407977, 0.61605318, 0.80802659,\n",
" 1. ]),\n",
" <a list of 10 Patch objects>)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Thư mục để dữ liệu\n",
"data_dir = 'dataset'\n",
"# Đọc file driving_log.csv với các cột tương ứng\n",
"data_df = pd.read_csv(os.path.join(os.getcwd(), data_dir, 'driving_log.csv'), names=['center', 'left', 'right', 'steering', 'throttle', 'reverse', 'speed'])\n",
"\n",
"# Lấy đường dẫn đến ảnh ở camera giữa, trái, phải\n",
"X = data_df[['center', 'left', 'right']].values\n",
"# Lấy góc lái của ô tô\n",
"y = data_df['steering'].values\n",
"\n",
"# Vẽ histogram dữ liệu\n",
"plt.hist(y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Do quá nhiều dữ liệu với góc lái ở 0 tức là để ô tô đi thẳng, nên ta sẽ loại bỏ bớt đi để tránh việc model có xu hướng dự đoán góc lái thiên về 0."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([ 7., 53., 302., 610., 1503., 208., 179., 43., 18.,\n",
" 11.]),\n",
" array([-0.9197341 , -0.72776069, -0.53578728, -0.34381387, -0.15184046,\n",
" 0.04013295, 0.23210636, 0.42407977, 0.61605318, 0.80802659,\n",
" 1. ]),\n",
" <a list of 10 Patch objects>)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Loại bỏ và chỉ lấy 1000 dữ liệu có góc lái ở 0\n",
"pos_zero = np.array(np.where(y==0)).reshape(-1, 1)\n",
"pos_none_zero = np.array(np.where(y!=0)).reshape(-1, 1)\n",
"np.random.shuffle(pos_zero)\n",
"pos_zero = pos_zero[:1000]\n",
"\n",
"pos_combined = np.vstack((pos_zero, pos_none_zero))\n",
"pos_combined = list(pos_combined)\n",
"\n",
"y = y[pos_combined].reshape(len(pos_combined))\n",
"X = X[pos_combined, :].reshape((len(pos_combined), 3))\n",
"\n",
"# After process\n",
"plt.hist(y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ta vẫn để giá trị góc lái ở 0 là nhiều nhất vì có thể phần nhiều thời gian của ô tô là đi thẳng thật. Việc histogram lệch bên trái không quá quan trọng vì ta dùng flip ảnh."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Chia ra traing set và validation set\n",
"X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=0)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"lambda_1 (Lambda) (None, 66, 200, 3) 0 \n",
"_________________________________________________________________\n",
"conv2d_1 (Conv2D) (None, 31, 98, 24) 1824 \n",
"_________________________________________________________________\n",
"conv2d_2 (Conv2D) (None, 14, 47, 36) 21636 \n",
"_________________________________________________________________\n",
"conv2d_3 (Conv2D) (None, 5, 22, 48) 43248 \n",
"_________________________________________________________________\n",
"conv2d_4 (Conv2D) (None, 3, 20, 64) 27712 \n",
"_________________________________________________________________\n",
"conv2d_5 (Conv2D) (None, 1, 18, 64) 36928 \n",
"_________________________________________________________________\n",
"dropout_1 (Dropout) (None, 1, 18, 64) 0 \n",
"_________________________________________________________________\n",
"flatten_1 (Flatten) (None, 1152) 0 \n",
"_________________________________________________________________\n",
"dense_1 (Dense) (None, 100) 115300 \n",
"_________________________________________________________________\n",
"dropout_2 (Dropout) (None, 100) 0 \n",
"_________________________________________________________________\n",
"dense_2 (Dense) (None, 50) 5050 \n",
"_________________________________________________________________\n",
"dense_3 (Dense) (None, 10) 510 \n",
"_________________________________________________________________\n",
"dense_4 (Dense) (None, 1) 11 \n",
"=================================================================\n",
"Total params: 252,219\n",
"Trainable params: 252,219\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\DELL\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:3: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(24, (5, 5), activation=\"elu\", strides=(2, 2))`\n",
" This is separate from the ipykernel package so we can avoid doing imports until\n",
"C:\\Users\\DELL\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:4: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(36, (5, 5), activation=\"elu\", strides=(2, 2))`\n",
" after removing the cwd from sys.path.\n",
"C:\\Users\\DELL\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:5: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(48, (5, 5), activation=\"elu\", strides=(2, 2))`\n",
" \"\"\"\n",
"C:\\Users\\DELL\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:6: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(64, (3, 3), activation=\"elu\")`\n",
" \n",
"C:\\Users\\DELL\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:7: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(64, (3, 3), activation=\"elu\")`\n",
" import sys\n"
]
}
],
"source": [
"# Xây dựng model\n",
"model = Sequential()\n",
"model.add(Lambda(lambda x: x/127.5-1.0, input_shape=INPUT_SHAPE))\n",
"model.add(Conv2D(24, 5, 5, activation='elu', subsample=(2, 2)))\n",
"model.add(Conv2D(36, 5, 5, activation='elu', subsample=(2, 2)))\n",
"model.add(Conv2D(48, 5, 5, activation='elu', subsample=(2, 2)))\n",
"model.add(Conv2D(64, 3, 3, activation='elu'))\n",
"model.add(Conv2D(64, 3, 3, activation='elu'))\n",
"model.add(Dropout(0.5))\n",
"model.add(Flatten())\n",
"model.add(Dense(100, activation='elu'))\n",
"model.add(Dropout(0.5))\n",
"model.add(Dense(50, activation='elu'))\n",
"model.add(Dense(10, activation='elu'))\n",
"model.add(Dense(1))\n",
"model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\DELL\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:28: UserWarning: The semantics of the Keras 2 argument `steps_per_epoch` is not the same as the Keras 1 argument `samples_per_epoch`. `steps_per_epoch` is the number of batches to draw from the generator at each epoch. Basically steps_per_epoch = samples_per_epoch/batch_size. Similarly `nb_val_samples`->`validation_steps` and `val_samples`->`steps` arguments have changed. Update your method calls accordingly.\n",
"C:\\Users\\DELL\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:28: UserWarning: Update your `fit_generator` call to the Keras 2 API: `fit_generator(<generator..., steps_per_epoch=1000, epochs=10, validation_data=<generator..., callbacks=[<keras.ca..., verbose=1, validation_steps=587, max_queue_size=1)`\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/10\n",
"1000/1000 [==============================] - 100s 100ms/step - loss: 0.0631 - val_loss: 0.0332\n",
"Epoch 2/10\n",
"1000/1000 [==============================] - 102s 102ms/step - loss: 0.0500 - val_loss: 0.0305\n",
"Epoch 3/10\n",
"1000/1000 [==============================] - 100s 100ms/step - loss: 0.0468 - val_loss: 0.0332\n",
"Epoch 4/10\n",
"1000/1000 [==============================] - 97s 97ms/step - loss: 0.0452 - val_loss: 0.0304\n",
"Epoch 5/10\n",
"1000/1000 [==============================] - 95s 95ms/step - loss: 0.0433 - val_loss: 0.0293\n",
"Epoch 6/10\n",
"1000/1000 [==============================] - 95s 95ms/step - loss: 0.0421 - val_loss: 0.0305\n",
"Epoch 7/10\n",
"1000/1000 [==============================] - 95s 95ms/step - loss: 0.0409 - val_loss: 0.0298\n",
"Epoch 8/10\n",
"1000/1000 [==============================] - 101s 101ms/step - loss: 0.0403 - val_loss: 0.0293\n",
"Epoch 9/10\n",
"1000/1000 [==============================] - 98s 98ms/step - loss: 0.0390 - val_loss: 0.0303\n",
"Epoch 10/10\n",
"1000/1000 [==============================] - 96s 96ms/step - loss: 0.0384 - val_loss: 0.0303\n"
]
}
],
"source": [
"nb_epoch = 10\n",
"samples_per_epoch = 1000\n",
"batch_size = 32\n",
"save_best_only = True\n",
"learning_rate = 1e-4\n",
"\n",
"# Checkpoint này để nói cho model lưu lại model nếu validation loss thấp nhất\n",
"checkpoint = ModelCheckpoint('models/model-{epoch:03d}.h5',\n",
" monitor='val_loss',\n",
" verbose=0,\n",
" save_best_only=save_best_only,\n",
" mode='auto')\n",
"\n",
"# Dùng mean_squrared_error làm loss function\n",
"model.compile(loss='mean_squared_error', optimizer=Adam(lr=learning_rate))\n",
"\n",
"# Train model\n",
"H = model.fit_generator(batch_generator(data_dir, X_train, y_train, batch_size, True),\n",
" steps_per_epoch = samples_per_epoch,\n",
" epochs = nb_epoch,\n",
" max_q_size=1,\n",
" validation_data=batch_generator(data_dir, X_valid, y_valid, batch_size, False),\n",
" nb_val_samples=len(X_valid),\n",
" callbacks=[checkpoint],\n",
" verbose=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vậy model ở epoch 8 có val_loss thấp nhất nên ta sẽ dùng model này để cho ô tô tự lái"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment