ディープラーニング入門
Day 1 (2025/03/11)
Pythonについて
Pythonの主な特徴
- インデント(字下げ)によってブロックを定義するため、コードが見やすい。
- 外部ライブラリをpipコマンドで簡単にインストール可能。
- 動的型付け言語。変数の型を明示的に宣言する必要がなく、コードが柔軟。
- インタープリタ言語。一行ずつ実行される。
Python 2系と3系について
ターミナルでの操作の準備
Windowsの人
Windowsの人は仮想Linux環境をインストールしておくと後々良いので、まずターミナル(管理者)を開いて
下記のコマンドを入力してEnterを押してください。PCを再起動するようにメッセージが出ると思うので、再起動してください。
wsl --install
再起動したらスタートメニューに「Ubuntu」というのが入っていると思うので、それを実行する。
Ubuntuのターミナルが開いたら、下記を入力してpipとIPythonをインストールしておく。
sudo apt update #リポジトリの更新 sudo apt install python3-pip #pipのインストール sudo apt install ipython3 #ipython3のインストール
Macの人
Linuxのコマンドを簡単にインストールできるHomebrewをインストールしておく。Launchpadを開いて、「その他」→「ターミナル」を開いて
下記のコマンドを入力してEnterを押してください。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
homebrewのインストールが終わったら、下記を入力してIPythonをインストールしておく。
brew install ipython
良く使うコマンドを実行してみる
ls #フォルダ(ディレクトリ)の中にあるファイルを表示する pwd #今いるディレクトリがどこかを表示する cd / #一番上(ルートフォルダ)に移動する
IPythonとは
https://qiita.com/5t111111/items/7852e13ace6de288042f
- 強力な補完機能
- Pythonの言語としては使えない便利な機能が実装されている。例えば先頭に「!」を付けるとシェルのコマンドを実行可能だったり、変数の最後に「?」を付けると型名などを教えてくれたり。
Jupyter Notebookとは
https://freelance.shiftinc.jp/column/ipython
ブラウザ上でNotebookにプログラムを打ち込み、実行する。もしくは、データなどの保存や共有をするためのツール。サーバとしてのIPythonは別に動いていて(カーネルと呼ぶ)、ウェブブラウザからサーバのIPythonにスクリプトを実行してもらっている。
Google Colabとは
Jupyter Notebook をベースに Google が独自進化させた環境です。Google アカウントがあれば、自身の PC に Python をインストールしなくてもブラウザから直ぐに利用可能です。GPU付きのサーバ上で動いているカーネルを無料で使わせてもらえる。ただし、無料版ゆえに数時間で接続が切れる。コードを入力したら「Shift+Enter」で実行する。
Python入門
東京大学における「Pythonプログラミング入門」の教材
- セルにコマンドを書いて実行する場合は「Shift + Enter」
- 変数の型について https://ai-inter1.com/python-data_type/ 文字列、整数、浮動小数点
練習問題 1
1.以下の結果はどうなるでしょうか?
val1=1+1 val2=1+"1" val3="1"+"1"
計算が終わった後の変数の中身を確認し、変数の型を確認すること。
2.valの値はプラスかマイナスの数字が入っているとします。この時、valの中身を絶対値にする(マイナスの場合はプラスに変換する)if文を書いてください。
Day 2 (2025/03/18?)
関数、配列、for文、ファイル読み取り
Google Colab https://colab.research.google.com/
関数
def myfunction(x, y): return x + y
- returnは関数の戻り値を指定する
- 関数内部で定義した変数は関数内部でしか使用できない(ローカル変数)
- 逆に関数の外で定義した変数(グローバル変数)にはアクセス可能
練習問題 2-1
引数に5を足す関数plus5を定義し、引数に3を与えて呼び出してみる。
配列
- リスト
[ 1, 50, 3, ... ]
https://atmarkit.itmedia.co.jp/ait/articles/1905/31/news015_2.html
- タプル
( 1, 50, 3, ... )
https://utokyo-ipp.github.io/2/2-2.html#%E3%82%BF%E3%83%97%E3%83%AB-(tuple)
- 辞書 (dictionary)
{ 'apple' : 3, 'pen' : 5 }
練習問題 2-2
名前:大谷翔平、生年月日:1994年7月5日、出身地:岩手県水沢市 というデータを適切なデータ構造に保存せよ。
for文
https://techplay.jp/column/1703
fruits = ['apple', 'banana', 'orange'] for fruit in fruits: print(fruit)
Pythonのfor文は、入れた順番のとおりに取り出される。
ファイル読み取り
Google Colabのサーバにファイルをアップロード
Pythonのファイル読み取り
練習問題 2-3
1.下記のファイルは2024年度の学生実験で得られたナノポアのシーケンスデータ(FASTQファイル)です。これをGoogle Colabにアップロードし、ファイルを読み取り、リード数を調べてみる。(リード数=行数/4) read()で読み込んだ文字列を改行で分割してリストにするにはsplit("\n")
を使う。Macの人は「\」を入力するにはAlt+「\(¥)」を押す。
https://suikou.fs.a.u-tokyo.ac.jp/yosh_data/2024jissyu/fastq/3-eDNA.fq
2.FASTQファイルは4行で1リードの情報が書かれていて、2行目に塩基配列の情報が記載されています。塩基配列の長さの合計値を記録し、最後にリード数で割って平均リード長を求めてください。ヒント:10割る3の余りは1ですよね。そのように余りを求める演算子は「%」で、「10 % 3」の結果は「1」です。文字列の長さはlen(“文字列”)で取得可能です。平均リード長=合計リード長/リード数
Day 3 (2025/03/24?)
クラス、インスタンス、モジュール、Colabのランタイム変更、手書き数字の認識
Google Colabで「手書き文字を認識するプログラムを書いて」と入力してAIにコードを生成してもらいましょう。
コメント
関数のデフォルト値
クラス、インスタンス
練習問題3-1
A) `'Hello.\n'` ではなくて、「ようこそ"引数"」と出力するaisatsuメソッドを作ってください。 B)「初期化時に指定された文字列+何回呼び出されたか」を文字列で返す aisatsu メソッドを持つ新しいクラス SayCount を定義してください。ヒント:数字から文字列への変換はstr(数字)で行います。
モジュール
練習問題3-2
先ほどのSayCountクラスをsay.pyファイルとして保存して、Google Colabにアップロードし、自作sayモジュールをimportで読み込んで、適当な引数で初期化して使ってみる。
手書き文字認識
# prompt: 手書き文字を認識するプログラムを書いて !pip install tensorflow !pip install keras !pip install pillow import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers from PIL import Image import numpy as np # MNISTデータセットをロード (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() # データの前処理 x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 y_train = keras.utils.to_categorical(y_train, num_classes=10) y_test = keras.utils.to_categorical(y_test, num_classes=10) # モデルの構築 model = keras.Sequential([ layers.Flatten(input_shape=(28, 28)), layers.Dense(128, activation='relu'), layers.Dense(10, activation='softmax') ]) # モデルのコンパイル model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # モデルの学習 model.fit(x_train, y_train, epochs=5) # モデルの評価 test_loss, test_acc = model.evaluate(x_test, y_test) print('Test accuracy:', test_acc) # 手書き文字の認識 def recognize_handwritten_digit(image_path): img = Image.open(image_path).convert('L').resize((28, 28)) img_array = np.array(img) img_array = img_array.astype('float32') / 255.0 img_array = np.expand_dims(img_array, axis=0) prediction = model.predict(img_array) digit = np.argmax(prediction) return digit # 手書き文字画像のパスを指定して認識 image_path = 'path/to/your/handwritten_digit.png' # 手書き文字画像のパスに置き換えてください recognized_digit = recognize_handwritten_digit(image_path) print('Recognized digit:', recognized_digit)
Mac用のペイントソフト: Paintbrush
手書き文字は黒字に白文字で書くこと!
Colabのランタイム変更
参考:T4のGPUカードのお値段
畳み込みニューラルネットワーク(CNN)
動物の脳が光情報を処理するメカニズム https://ja.wikipedia.org/wiki/%E8%A6%96%E8%A6%9A%E9%87%8E
CNNについて https://tech.nkhn37.net/tensorflow-keras-cnn-basic-mnist/, https://ndk.co.jp/wp-content/uploads/2023/08/tp_20230810-2.pdf
最終課題
CNNを利用して手書き文字を認識するプログラムを作る。いくつか手書き文字を作成し、実際の正答率を調べてみる。