Skip to content

Instantly share code, notes, and snippets.

@praisethemoon
Created March 31, 2019 00:53
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 praisethemoon/26396a67cfe263f5c209f6ea99baedc3 to your computer and use it in GitHub Desktop.
Save praisethemoon/26396a67cfe263f5c209f6ea99baedc3 to your computer and use it in GitHub Desktop.
conv_loop_vs_vectorized
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import skimage\n",
"from PIL import Image\n",
"%matplotlib inline "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def conv_loop(M, K, s = (1, 1)):\n",
" m = M.shape[0]\n",
" m_ = K.shape[0]\n",
" n = M.shape[1]\n",
" n_ = K.shape[1]\n",
" \n",
" output_shape = (((int)((m - m_)/s[0] + 1), (int)((n - n_)/s[1] + 1)))\n",
" \n",
" C = np.zeros((output_shape))\n",
" for i in range(output_shape[0]):\n",
" for j in range(output_shape[1]):\n",
" value = 0\n",
" \n",
" for v in range(K.shape[0]):\n",
" for w in range(K.shape[1]):\n",
" value += K[v][w] * M[i*s[0] + v][j*s[1]+w]\n",
" C[i][j] = value\n",
" return C"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def conv_im2col(M, K, s = (1, 1)):\n",
" m = M.shape[0]\n",
" m_ = K.shape[0]\n",
" n = M.shape[1]\n",
" n_ = K.shape[1]\n",
" \n",
" output_shape = (((m - m_)//s[0] + 1), ((n - n_)//s[1] + 1))\n",
" total_output_size = output_shape[0] * output_shape[1]\n",
" \n",
" \"\"\" \n",
" create our im2col Matrix\n",
" view_as_windows returns a shape of (output_w, output_h, filter_w, filter_h) which we transform into\n",
" new Matrix of the form: Rows = total output flattened, Cols = filter shape flattened\n",
" \"\"\"\n",
" out = skimage.util.view_as_windows(M, (m_, n_)).reshape((total_output_size, m_, n_))\n",
"\n",
" IM = out.reshape((total_output_size, m_*n_))\n",
" \n",
" # Flatten our filter\n",
" K_ = K.reshape(n_*m_)\n",
" \n",
" conv = np.dot(IM, K_).reshape(output_shape)\n",
" \n",
" return conv"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"number_of_tests = 10"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### This might take a while"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"9.54 µs ± 320 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n",
"43.7 µs ± 6.08 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"74.3 µs ± 2.81 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"42.9 µs ± 2.15 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"198 µs ± 3.25 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"41.8 µs ± 424 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"378 µs ± 3.08 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n",
"43.2 µs ± 2.41 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"626 µs ± 8.01 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n",
"43.8 µs ± 686 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"929 µs ± 4.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n",
"47.3 µs ± 3.2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"1.3 ms ± 7.34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n",
"47.4 µs ± 1.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"1.73 ms ± 9.69 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n",
"48.3 µs ± 204 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"2.33 ms ± 149 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"50.5 µs ± 489 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
"2.77 ms ± 36.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"54.1 µs ± 1.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n"
]
}
],
"source": [
"res_conv_loop = np.empty(10)\n",
"res_conv_im2col = np.empty(10)\n",
"y_axis = np.empty(10)\n",
"for i in range(number_of_tests):\n",
" M = np.random.rand(3+i*2, 3+i*2)\n",
" K = np.random.rand(3, 3)\n",
" y_axis[i] = (3+i*2)**2\n",
" \n",
" res1 = %timeit -o conv_loop(M, K)\n",
" res2 = %timeit -o conv_im2col(M, K)\n",
" res_conv_loop[i] = res1.average\n",
" res_conv_im2col[i] = res2.average"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1c194cd2e8>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(res_conv_loop, y_axis, label=\"loop\")\n",
"plt.plot(res_conv_im2col, y_axis, label=\"im2col\")\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([-3.41984353e-05, 3.14417863e-05, 1.56017442e-04, 3.34874282e-04,\n",
" 5.82244855e-04, 8.81751136e-04, 1.25072390e-03, 1.68122070e-03,\n",
" 2.27461555e-03, 2.71739581e-03])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res_conv_loop - res_conv_im2col"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment