# ディープラーニング入門 ## Day 1 (2025/03/11) Zoomの録画: https://u-tokyo-ac-jp.zoom.us/rec/share/W1nkxWnGjoe0znUDavFXNV5gIr_CvR2YfooayiYdTAKFWjZR3lP4tuV2H23e4UW5.bg9UUku-NFJAx9cj ### Pythonについて #### Pythonの主な特徴 - インデント(字下げ)によってブロックを定義するため、コードが見やすい。 - 外部ライブラリをpipコマンドで簡単にインストール可能。 - 動的型付け言語。変数の型を明示的に宣言する必要がなく、コードが柔軟。 - インタープリタ言語。一行ずつ実行される。 #### Python 2系と3系について [[https://and-engineer.com/articles/YKUFOxQAACgAq_Z-]] ### ターミナルでの操作の準備 {{:pasted:20250309-144148.png}} 今回の勉強会の内容であれば、ターミナルを開かなくてもできるのだけど、知っておいたほうが良いので一応やります。 #### Windowsの人 Windowsの人は仮想Linux環境をインストールしておくと後々良いので、まずターミナル(管理者)を開いて {{:pasted:20250310-030101.png}} 下記のコマンドを入力してEnterを押してください。PCを再起動するようにメッセージが出ると思うので、再起動してください。 ``` wsl --install ``` 再起動したらスタートメニューに「Ubuntu」というのが入っていると思うので、それを実行する。 {{:pasted:20250309-150006.png}} Ubuntuのターミナルが開いたら、下記を入力してpipとIPythonをインストールしておく。 ``` sudo apt update #リポジトリの更新 sudo apt install python3-pip #pipのインストール sudo apt install ipython3 #ipython3のインストール ``` #### Macの人 Linuxのコマンドを簡単にインストールできるHomebrewをインストールしておく。Launchpadを開いて、「その他」→「ターミナル」を開いて {{:pasted:20250309-151924.png}} 下記のコマンドを入力して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」で実行する。 https://colab.research.google.com/ ### Python入門 東京大学における「Pythonプログラミング入門」の教材 https://utokyo-ipp.github.io/ - セルにコマンドを書いて実行する場合は「Shift + Enter」 - 変数の定義、代入 https://utokyo-ipp.github.io/1/1-2.html#%E5%A4%89%E6%95%B0 - 変数の型について https://ai-inter1.com/python-data_type/  文字列、整数、浮動小数点 - if文 https://utokyo-ipp.github.io/1/1-3.html#if%E6%96%87%E3%81%AB%E3%82%88%E3%82%8B%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90 https://note.nkmk.me/python-if-elif-else/ ### 練習問題 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 ``` [[https://utokyo-ipp.github.io/1/1-2.html#%E9%96%A2%E6%95%B0%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%A8%E8%BF%94%E5%80%A4]] - 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 }` [[https://utokyo-ipp.github.io/3/3-1.html]] ### 練習問題 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のサーバにファイルをアップロード [[https://www.kikagaku.co.jp/kikagaku-blog/google-colab-file/]] #### Pythonのファイル読み取り [[https://utokyo-ipp.github.io/4/4-1.html#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%A8%E4%BD%93%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF]] ### 練習問題 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("文字列")で取得可能です。平均リード長=合計リード長/リード数 {{:pasted:20201026-181800.png}} ## Day 3 (2025/03/24?) クラス、インスタンス、モジュール、Colabのランタイム変更、手書き数字の認識 [[https://colab.research.google.com/|Google Colab]]で「手書き文字を認識するプログラムを書いて」と入力してAIにコードを生成してもらいましょう。 ### コメント [[https://utokyo-ipp.github.io/1/1-1.html#%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88]] ### 関数のデフォルト値 [[https://www.javadrive.jp/python/userfunc/index5.html#google_vignette]] ### クラス、インスタンス [[https://utokyo-ipp.github.io/6/6-3.html]] ### 練習問題3-1 ``` A) `'Hello.\n'` ではなくて、「ようこそ"引数"」と出力するaisatsuメソッドを作ってください。 B)「初期化時に指定された文字列+何回呼び出されたか」を文字列で返す aisatsu メソッドを持つ新しいクラス SayCount を定義してください。ヒント:数字から文字列への変換はstr(数字)で行います。 ``` ### モジュール [[https://qiita.com/niwaka_dev/items/6e3d9ff6d797243c77c3]] ### 練習問題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) ``` {{:pasted:20250320-165737.png}} Mac用のペイントソフト: [[https://paintbrush.sourceforge.io/downloads/|Paintbrush]] {{2.png}} 手書き文字は黒字に白文字で書くこと! ### Colabのランタイム変更 [[https://qiita.com/skillup_ai/items/7fa5359330a6c572d7ce#3tensorflow%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95]] 参考:T4のGPUカードのお値段 {{:pasted:20250319-191452.png}} ### 畳み込みニューラルネットワーク(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を利用して手書き文字を認識するプログラムを作る。いくつか手書き文字を作成し、実際の正答率を調べてみる。