{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# SYA-KE Deep Learning Training"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Parent Repository URL "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[https://github.com/oreilly-japan/deep-learning-from-scratch](https://github.com/oreilly-japan/deep-learning-from-scratch)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pythonに慣れる"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python 3.6.5\n"
]
}
],
"source": [
"!python --version"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"#もう何年もやってるので省略"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Numpyに慣れる"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 参考URL"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[http://www.sist.ac.jp/~kanakubo/research/hosoku/gyoretu.html](http://www.sist.ac.jp/~kanakubo/research/hosoku/gyoretu.html)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 配列、行列"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1.14.3'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.__version__"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"x = np.array([1.0,2.0,3.0])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"y = np.array([2.0,4.0,6.0])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([3., 6., 9.])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x + y"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([-1., -2., -3.])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x - y"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 2., 8., 18.])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x * y"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.5, 0.5, 0.5])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x / y"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.5, 1. , 1.5])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x / 2.0"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"A = np.array([[1,2],[3,4]])"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 2]\n",
" [3 4]]\n"
]
}
],
"source": [
"print(A)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2, 2)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A.shape"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dtype('int32')"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A.dtype"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"B = np.array([[3,0],[0,6]])"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 4, 2],\n",
" [ 3, 10]])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A + B"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 3, 0],\n",
" [ 0, 24]])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A * B"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[10, 20],\n",
" [30, 40]])"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A*10"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[参考](http://www.scipy-lectures.org/intro/numpy/operations.html)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[51, 55],\n",
" [14, 19],\n",
" [ 0, 4]])"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X = np.array([[51,55],[14,19],[0,4]])\n",
"X"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([51, 55])"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X[0] #0行目"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"55"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X[0][1] #(0,1) =>(0行1列)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[51 55]\n",
"[14 19]\n",
"[0 4]\n"
]
}
],
"source": [
"for row in X:\n",
" print(row)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([51, 55, 14, 19, 0, 4])"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"AX = X.flatten() #行列を配列に\n",
"AX"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([51, 55, 19])"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"AX[AX>15]#配列から条件の値を抽出"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ True, True],\n",
" [False, True],\n",
" [False, False]])"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X>15"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([51, 55, 19])"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X[X>15]#行列でもできる。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ニューラルネットワークにおいては行列は 行数=入力数 列数=重み数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Matplotlibに慣れる"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[参考URL](http://qiita.com/hik0107/items/de5785f680096df93efa)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"