Chapter 3: DeepChem과 머신러닝

이 장에서는 생명과학 분야의 머신러닝 작업을 위해 DeepChem을 사용하는 기본적인 방법들을 소개합니다.

MNIST 필기체 숫자 인식

이 예제는 MNIST 데이터셋의 필기체 숫자를 인식하는 합성곱 신경망(CNN)을 구축하기 위해 Keras와 함께 DeepChem을 사용하는 방법을 설명합니다.

import deepchem as dc
import tensorflow as tf
import tensorflow.keras.layers as layers

# 데이터셋을 로드하고 라벨을 원-핫(one-hot) 벡터로 변환합니다.
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
y_train = tf.one_hot(y_train, 10).numpy()
y_test = tf.one_hot(y_test, 10).numpy()
train_dataset = dc.data.NumpyDataset(x_train, y_train)
test_dataset = dc.data.NumpyDataset(x_test, y_test)

# 모델을 구축합니다.
features = tf.keras.Input(shape=(28, 28, 1))
conv2d_1 = layers.Conv2D(filters=32, kernel_size=5, activation=tf.nn.relu)(features)
conv2d_2 = layers.Conv2D(filters=64, kernel_size=5, activation=tf.nn.relu)(conv2d_1)
flatten = layers.Flatten()(conv2d_2)
dense1 = layers.Dense(units=1024, activation=tf.nn.relu)(flatten)
dense2 = layers.Dense(units=10, activation=None)(dense1)
output = layers.Activation(tf.math.softmax)(dense2)
keras_model = tf.keras.Model(inputs=features, outputs=[output, dense2])
model = dc.models.KerasModel(
    keras_model,
    loss=dc.models.losses.SoftmaxCrossEntropy(),
    output_types=["prediction", "loss"],
    model_dir="mnist",
)

# 모델을 학습시킵니다.
model.fit(train_dataset, nb_epoch=10)

# 학습 데이터와 테스트 데이터에서 모델 성능을 평가합니다.
metric = dc.metrics.Metric(dc.metrics.accuracy_score)
train_scores = model.evaluate(train_dataset, [metric])
test_scores = model.evaluate(test_dataset, [metric])
print(train_scores)
print(test_scores)

Tox21을 이용한 독성 예측

Tox21 데이터셋에는 수천 가지 화합물에 대한 독성 데이터가 포함되어 있습니다. 이 예제는 멀티태스크 분류기(Multitask Classifier)를 사용하여 분자의 독성을 예측합니다.

import numpy as np
import deepchem as dc

# 데이터를 로드합니다.
tox21_tasks, tox21_datasets, transformers = dc.molnet.load_tox21()
train_dataset, valid_dataset, test_dataset = tox21_datasets

# 모델을 생성하고 학습시킵니다.
model = dc.models.MultitaskClassifier(n_tasks=12, n_features=1024, layer_sizes=[1000])
model.fit(train_dataset, nb_epoch=10)

# 학습 데이터와 테스트 데이터에서 모델 성능을 평가합니다.
metric = dc.metrics.Metric(dc.metrics.roc_auc_score, np.mean)
train_scores = model.evaluate(train_dataset, [metric], transformers)
test_scores = model.evaluate(test_dataset, [metric], transformers)
print(train_scores)
print(test_scores)