見出し画像

PythonでDeepLearning - フレームワーク

TensorFlowPytorchを並べてみてみましょう。TensorFlowの方がスッキリしている感じがして使い印象を受けます。以下比較されているサイトです。

今現在はPytorchがよく使われている印象です。柔軟性が高いのがポイントでしょうか。


TensorFlow

Googleが開発していて使い方も比較的簡単に使えるようになっています。チュートリアルも日本語の解説もあります。

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
  loss='sparse_categorical_crossentropy',
  metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

クイックスタートとしてコードもトップページに紹介されておりすぐColabで試せるようになっています。

まず必要なライブラリ、データを取り込みます。

import tensorflow as tf
mnist = tf.keras.datasets.mnist

試すのに必要なデータを使えるように変数に入れていきまします。

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

次にモデルの作成。入力層、隠れ層、出力層を作ります。

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
]) 

最適化していきます。

model.compile(optimizer='adam',
  loss='sparse_categorical_crossentropy',
  metrics=['accuracy'])

最後に学習します。正解のデータを使ってパラメータを決めていきます。

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

実行すると

Epoch 1/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8583 - loss: 0.4848
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9537 - loss: 0.1555
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9671 - loss: 0.1097
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 6s 2ms/step - accuracy: 0.9740 - loss: 0.0881
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9764 - loss: 0.0755
313/313 - 1s - 3ms/step - accuracy: 0.9777 - loss: 0.0739
[0.0738915503025055, 0.9776999950408936]

テストの結果97%の確率で正解を出しているとの分析が出てきます。

Pytorch

チュートリアルで紹介されて入りものをColabで実行してみます。
まず必要なライブラリを取り込みます。

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms

初期のパラメータを決めます。

input_size = 784
hidden_size = 500
num_classes = 10
num_epochs = 5
batch_size = 100
learning_rate = 0.001

使うデータの準備。PytorchではTensorFlowではないデータローダーの作成をします。

train_dataset = datasets.MNIST(root='./data',
                               train=True,
                               transform=transforms.ToTensor(),
                               download=True)

test_dataset = datasets.MNIST(root='./data',
                              train=False,
                              transform=transforms.ToTensor())

データローダーの作成。参考サイト。

train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                           batch_size=batch_size,
                                           shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
                                          batch_size=batch_size,
                                          shuffle=False)

モデルの作成。

class Net(nn.Module):
    def __init__(self, input_size, hidden_size, num_classes):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        return out

作ったモデルを使って最適化

model = Net(input_size, hidden_size, num_classes)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

最後に学習します。正解のデータを使ってパラメータを決めていきます。

total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        # 画像を1次元ベクトルに変換
        images = images.reshape(-1, 28*28)

        # 順伝播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 逆伝播と最適化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{total_step}], Loss: {loss.item():.4f}')

評価

model.eval()
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.reshape(-1, 28*28)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print(f'Accuracy of the network on the 10000 test images: {100 * correct / total}%')

実行すると

Epoch [1/5], Step [100/600], Loss: 0.3624
Epoch [1/5], Step [200/600], Loss: 0.1881
Epoch [1/5], Step [300/600], Loss: 0.2672
・
・
Epoch [4/5], Step [500/600], Loss: 0.0098
Epoch [4/5], Step [600/600], Loss: 0.0282
Epoch [5/5], Step [100/600], Loss: 0.0385
Epoch [5/5], Step [200/600], Loss: 0.0343
Epoch [5/5], Step [300/600], Loss: 0.0090
Epoch [5/5], Step [400/600], Loss: 0.0931
Epoch [5/5], Step [500/600], Loss: 0.0508
Epoch [5/5], Step [600/600], Loss: 0.0984
Accuracy of the network on the 10000 test images: 98.11%

テストの結果98.11%の確率で正解を出しているとの分析が出てきます。


参考 Keras


この記事が気に入ったらサポートをしてみませんか?