目次

ディープラーニング入門

Day 1 (2025/03/11)

Zoomの録画: https://u-tokyo-ac-jp.zoom.us/rec/share/W1nkxWnGjoe0znUDavFXNV5gIr_CvR2YfooayiYdTAKFWjZR3lP4tuV2H23e4UW5.bg9UUku-NFJAx9cj

Pythonについて

Pythonの主な特徴

Python 2系と3系について

https://and-engineer.com/articles/YKUFOxQAACgAq_Z-

ターミナルでの操作の準備

今回の勉強会の内容であれば、ターミナルを開かなくてもできるのだけど、知っておいたほうが良いので一応やります。

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

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/

練習問題 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

練習問題 2-1

引数に5を足す関数plus5を定義し、引数に3を与えて呼び出してみる。

配列

https://atmarkit.itmedia.co.jp/ait/articles/1905/31/news015_2.html

https://utokyo-ipp.github.io/2/2-2.html#%E3%82%BF%E3%83%97%E3%83%AB-(tuple)

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(“文字列”)で取得可能です。平均リード長=合計リード長/リード数

解答例

1.

f = open("3-eDNA.fq","r")
data = f.read()
mylist = data.split("\n") #プログラミングの分野では"\n"が改行文字を意味する
cnt = 0
for line in mylist:
  cnt = cnt + 1
print((cnt - 1)/4) #最後の改行後の1行を削って、4行で1リードなので4で割ったものがリード数

2.

f = open("3-eDNA.fq","r")
data = f.read()
mylist = data.split("\n") #プログラミングの分野では"\n"が改行文字を意味する
cnt = 0
total = 0
for line in mylist:
  cnt = cnt + 1
  if cnt % 4 == 2: #2行目のみ下記の処理を行いたい
    total = total + len(line) #2行目のシーケンスデータの文字列長(=塩基数)をtotal変数に加算する
print((cnt - 1)/4) #最後の改行後の1行を削って、4行で1リードなので4で割ったものがリード数
print(total/((cnt - 1)/4)) #合計塩基数をリード数で割ると平均リード長になる

Day 3 (2025/03/24?)

クラス、インスタンス、モジュール、Colabのランタイム変更、手書き数字の認識

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://zenn.dev/yutabeee/articles/3512fe4001d8d3

クラス、インスタンス

https://utokyo-ipp.github.io/6/6-3.html

練習問題3-1

A) `'Hello.\n'` ではなくて、readline("xxx")と呼び出すと、`'Hello xxx.\n'`という文字列を返すメソッドに変更してください。
B) 初期化するときにHelloForEver('ようこそ')として初期化された場合、readline("xxx")と呼び出すと、`'ようこそ xxx.\n'`という文字列を返すようにクラスを変更してください。また、何も指定しないで初期化された場合は`'Hello xxx.\n'`のままにしてください。

モジュール

https://qiita.com/niwaka_dev/items/6e3d9ff6d797243c77c3

練習問題3-2

先ほどのHelloForEverクラスをhello.pyファイルとして保存して、Google Colabにアップロードし、自作helloモジュールを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のランタイム変更

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カードのお値段

畳み込みニューラルネットワーク(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を利用して手書き文字を認識するプログラムを作る。いくつか手書き文字を作成し、実際の正答率を調べてみる。