日々、学ぶ https://take-tech-engineer.com Study Life Mon, 19 Dec 2022 08:11:26 +0000 ja hourly 1 https://wordpress.org/?v=6.1.1 https://take-tech-engineer.com/wp-content/uploads/2021/12/cropped-DSCF4956-scaled-1-32x32.jpg 日々、学ぶ https://take-tech-engineer.com 32 32 【PyTorch】モデルの重みに初期値を設定する方法 https://take-tech-engineer.com/pytorch-parameters-init/ https://take-tech-engineer.com/pytorch-parameters-init/#respond Mon, 19 Dec 2022 08:11:22 +0000 https://take-tech-engineer.com/?p=1481 PyTorchモデルの重みに初期値を設定する方法について記載していきます。今回、対象とするモデルはシンプル構造の下記コードとします。

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(3, 3)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.linear(x)
        x = self.relu(x)     
        return x

model = Model()
print(model)
# Model(
#   (linear): Linear(in_features=3, out_features=3, bias=True)
#   (relu): ReLU()
# )

## 重みとバイアスの初期値を確認
for param in model.parameters():
  print(param)

# Parameter containing:
# tensor([[ 0.2242, -0.3569,  0.1490],
#         [-0.2229, -0.1892,  0.3646],
#         [-0.1613, -0.3112,  0.4168]], requires_grad=True)
# Parameter containing:
# tensor([-0.3672, -0.3400, -0.2994], requires_grad=True)

モデルの重みに初期値を設定する

torch.nn.initの利用する方法

torch.nn.initを利用することで、重みの初期値を簡単に設定することができます。

例えば、重みの初期値を全て0にするには、torch.nn.init.zeros_()を用います。また、バイアスの初期値にはtorch.nn.init.ones_()を用いて全て1にします。全ての重みとバイアスが指定した値になっていることが確認できます。

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(3, 3)
        nn.init.zeros_(self.linear.weight) # 重みの初期値を設定
        nn.init.ones_(self.linear.bias)    # バイアスの初期値を設定

        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.linear(x)
        x = self.relu(x)     
        return x

model = Model()
for param in model.parameters():
  print(param)
# Parameter containing:
# tensor([[0., 0., 0.],
#         [0., 0., 0.],
#         [0., 0., 0.]], requires_grad=True)
# Parameter containing:
# tensor([1., 1., 1.], requires_grad=True)

初期値の指定方法には、他にも様々な方法があります。

torch.nn.init.uniform_()は、最小値a、最大値bの範囲の一様分布から初期化します。

torch.nn.init.uniform_(tensor, a=0.0, b=1.0)

torch.nn.init.normal_()は、平均mean、標準偏差stdの正規分布から初期化します。

torch.nn.init.normal_(tensor, mean=0.0, std=1.0)

torch.nn.init.constant_()は、定数valで初期化します。

torch.nn.init.constant_(tensor, val)

Xavier、Heの方法もtorch.nn.init.xavier_normal_()やtorch.nn.init.kaiming_normal_()を用いることで使うことができます。

任意の値を指定する方法

torch.nn.initを使う方法の場合は、一括で重みの値を変えることができますが、任意の値を指定することはできない。任意の値を指定するには、nn.Parameterを用いてTensor配列を定義し、モデルの重みやバイアスに値を代入することで指定できる。

model = Model()

weight_new = nn.Parameter(torch.tensor([[1., 2., 3.],
                                          [4., 5., 6.],
                                          [7., 8., 9.]])) 

bias_new = nn.Parameter(torch.tensor([[10., 11., 12.]])) 

model.linear.weight = weight_new
model.linear.bias = bias_new

for param in model.parameters():
  print(param)
# Parameter containing:
# tensor([[1., 2., 3.],
#         [4., 5., 6.],
#         [7., 8., 9.]], requires_grad=True)
# Parameter containing:
# tensor([[10., 11., 12.]], requires_grad=True)

関連記事、参考資料

]]>
https://take-tech-engineer.com/pytorch-parameters-init/feed/ 0
PyTorchで最頻値を算出するtorch.mode https://take-tech-engineer.com/pytorch-mode/ https://take-tech-engineer.com/pytorch-mode/#respond Wed, 07 Dec 2022 04:52:40 +0000 https://take-tech-engineer.com/?p=1455 PyTorchで最頻値を算出するにはtorch.modeを使う。

torch.modeの使い方

torch.modeの第一引数inputにTensor配列を指定すると、出力にタプル[値、インデックス]が返ってくる。下記のようなTensor配列aを入力すると、valuesに最頻値である4、indicesに最頻値4のインデックスがTensor配列で返ってくる。.valuesで最頻値を値として取り出すことができる。

import torch

a = torch.tensor([1, 2, 3, 3, 4, 4, 4, 4])
print(a.shape)
# torch.Size([8])

print(torch.mode(input=a))
# torch.return_types.mode(values=tensor(4),indices=tensor(7))

print(torch.mode(input=a).values)
# tensor(4)

二次元配列以上の場合は、第二引数dimを指定することで、各軸に沿った最頻値を算出することができる。

b = torch.tensor([[1, 2, 3, 3, 4, 4, 4, 4],
                  [1, 1, 2, 3, 4, 5, 6, 7]])

print(b.shape)
# torch.Size([2, 8])

print(torch.mode(input=b, dim=0))
# torch.return_types.mode(values=tensor([1, 1, 2, 3, 4, 4, 4, 4]),indices=tensor([1, 1, 1, 1, 1, 0, 0, 0]))

print(torch.mode(input=b, dim=1))
# torch.return_types.mode(values=tensor([4, 1]),indices=tensor([7, 1]))
]]>
https://take-tech-engineer.com/pytorch-mode/feed/ 0
【初心者】Amazon SageMaker Studio Labに登録して、PyTorchをGPUで動かす【機械学習】 https://take-tech-engineer.com/amazon-sagemaker-studio-lab-pytorch-gpu/ https://take-tech-engineer.com/amazon-sagemaker-studio-lab-pytorch-gpu/#respond Sat, 03 Dec 2022 05:04:45 +0000 https://take-tech-engineer.com/?p=1437 誰でも無料でGPUを利用できるAmazon SageMaker Studio Lab(Studio Lab)の始め方の手順を記載していきます。また、GPUでPyTorchを動作させるところまで見ていきます。
Studio Labは、AWSのアカウントは必要ないため、クレジットカードを登録する必要もなく、メールアドレスのみで使用できます。

Amazon SageMaker Studio Labのアカウント作成

Studio Labを始めるためには、まずアカウントを作成する必要があります。下記URLにアクセスし、「Request free account」をクリックします。

Request accountでは、入力欄がいくつかありますが、必須項目は「Enter your email」の欄だけですので、emailのみ入力して「Submit request」をクリックします。

入力したメールアドレスにVerifyのためのメールが届いたら、24時間以内に「Verify your email」をクリックします。

「Verify your email」をクリック後、Account request confirmedのメールが届き、「wait list」に追加されたことが確認できます。アカウント承認までは、何日かかかるため待ちます。それまでは、Studio Labでなにかすることは出来ません。

数日後に、以下のようなAccount request approvedが届くので、「Create account」をクリックします。私の場合は、次の日にメールが来ました。またこのメールが来てから7日以内にアカウントを作成する必要があるので、注意が必要です。

クリックすると、Create accountのページに飛ぶので、メールアドレス、パスワードとユーザー名を記入して、「Create account」をクリックします。そうするとverifyのメールが届くので、「Verify your email」をクリックしたアカウントの作成は完了です。

Amazon SageMaker Studio LabでPyTorchをGPUで動かす

以下リンクをクリックして、Amazon SageMaker Studio Labの「Sign in」ページに進み、ユーザー名とパスワードを入力して、サインインします。

SageMaker Studio Lab

サインすると以下の画面が表示されるので、Compute typeで「GPU」を選択し、「Start runtime」をクリックします。

ruuntimeが起動すると、「Open project」がクリックできるようになるので、クリックします。アクセスが沢山あると、「The server currently has too many requests. Please try again later」と表示され、runtimeが起動できないことがありますが、少し待てば起動できるので、何回か試してみてください。

JupyterLabが起動するので、Notebook>default:Pythonをクリックします。Pytorchをimportしてみます。ModuleNotFoundErrorがでており、PyTorchがインストールされていないことが分かります。

import torch

# ---------------------------------------------------------------------------
# ModuleNotFoundError                       Traceback (most recent call last)
# /tmp/ipykernel_182/4265195184.py in <cell line: 1>()
# ----> 1 import torch
# 
# ModuleNotFoundError: No module named 'torch'

pipコマンドでPyTorchをインストールします。

!pip3 install torch torchvision torchaudio --extra-index-url <https://download.pytorch.org/whl/cu116>

インストール後、torch.cuda.is_availableでGPUが使用可能か確認します。「Using cuda device」を表示されたのでGPUが使用できそうです。

import torch

device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using {device} device")
# Using cuda device

関連記事、参考資料

]]>
https://take-tech-engineer.com/amazon-sagemaker-studio-lab-pytorch-gpu/feed/ 0
Pythonで分散、標準偏差、不偏分散、不偏分散の平方根を算出する【Numpy、SciPy】 https://take-tech-engineer.com/numpy-var-std-tvar-tstd/ https://take-tech-engineer.com/numpy-var-std-tvar-tstd/#respond Thu, 20 Oct 2022 09:02:41 +0000 https://take-tech-engineer.com/?p=1317 Pythonで分散、分散、標準偏差、不偏分散、不偏分散の平方根を算出するには、Numpyのnumpy.varnumpy.stdを用いる。また、SciPyのscipy.stats.tvarscipy.stats.tstdを用いることでも不偏分散、不偏分散の平方根を算出できる。

numpy.varnumpy.stdscipy.stats.tvarscipy.stats.tstdの使い方

2次元のndarray配列を生成し確認する。

import numpy as np


a = np.array([[6, 8, 3, 0],
              [3, 2, 1, 7],
              [8, 1, 8, 4],
              [5, 3, 0, 5],
              [4, 7, 5, 9]])
print(a.shape)
# (5, 4)

分散の算出方法

numpy.varの引数に配列を指定すると、すべての要素を使い分散が算出される。引数axisを指定すると、指定した軸に沿って分散が算出される。

print(np.var(a))
# 7.547500000000001

print(np.var(a, axis=0))
# [2.96 7.76 8.24 9.2 ]
print(np.var(a, axis=1))
# [9.1875 5.1875 8.6875 4.1875 3.6875]

不偏分散の算出方法

numpy.varに配列を指定し、引数ddofに1を指定することで、不偏分散が算出される。またscipy.stats.tvarの引数に配列を指定するとことでも算出できる。軸に沿って算出したい場合は、引数axisを指定する。

print(np.var(a, ddof=1))
# 7.944736842105264

from scipy import stats
print(stats.tvar(a, axis=None))
# 7.944736842105264


print(np.var(a, ddof=1, axis=1))
# [12.25        6.91666667 11.58333333  5.58333333  4.91666667]

print(stats.tvar(a, axis=1))
# [12.25        6.91666667 11.58333333  5.58333333  4.91666667]

標準偏差の算出方法

分散と同様の使い方で、numpy.stdの引数に配列を指定し、軸に沿って計算したい場合は、引数axisを指定する。

print(np.std(a))
# 2.747271373563231

print(np.std(a, axis=0))
# [1.72046505 2.78567766 2.87054002 3.03315018]

print(np.std(a, axis=1))
# [3.03108891 2.27760839 2.94745653 2.04633819 1.92028644]

不偏分散の平方根の算出方法

np.stdの引数ddofに1を指定することで、不偏分散の平方根の算出できる。またstats.tstdの引数に配列を指定することで同様に算出できる。

print(np.std(a, ddof=1))
# 2.8186409565791215

print(stats.tstd(a, axis=None))
# 2.8186409565791215


print(np.std(a, ddof=1, axis=1))
# [3.5        2.62995564 3.40342964 2.36290781 2.21735578]

print(stats.tstd(a, axis=1))
# [3.5        2.62995564 3.40342964 2.36290781 2.21735578]

関連記事、参考資料

]]>
https://take-tech-engineer.com/numpy-var-std-tvar-tstd/feed/ 0
【PyTorch】共分散行列と相関係数行列を算出するtorch.cov, torch.corrcoef https://take-tech-engineer.com/torch-cov-t-corrcoef/ https://take-tech-engineer.com/torch-cov-t-corrcoef/#respond Sun, 16 Oct 2022 05:27:14 +0000 https://take-tech-engineer.com/?p=1296 PyTorchで共分散行列と相関係数行列を算出するには、torch.covtorch.corrcoefを使う。

torch.covの使い方

torch.covの引数に2次元配列を指定すると、列を一つの変数として共分散行列が算出される。

import torch

x = torch.tensor([-2.1, -1,  4.3, 5])
y = torch.tensor([3,  1.1,  0.12, -3])

X = torch.stack((x, y), axis=0)

print(torch.cov(X))
# tensor([[13.0967, -7.9250],
#        [-7.9250,  6.2841]])

torch.corrcoefの使い方

torch.covと同様で、torch.corrcoefの引数に2次元配列を指定すると、相関係数行列が算出される。

print(torch.corrcoef(X))
# tensor([[ 1.0000, -0.8736],
#        [-0.8736,  1.0000]])

関連記事、参考資料

]]>
https://take-tech-engineer.com/torch-cov-t-corrcoef/feed/ 0
【Numpy】共分散行列と相関係数行列を算出するnumpy.cov, numpy.corrcoef https://take-tech-engineer.com/numpy-cov-corrcoef/ https://take-tech-engineer.com/numpy-cov-corrcoef/#respond Sun, 16 Oct 2022 05:09:09 +0000 https://take-tech-engineer.com/?p=1293 Numpyで共分散行列と相関係数行列を算出するには、numpy.cov, numpy.corrcoefを使う。

numpy.covの使い方

numpy.covの引数に、2つの1次元配列を指定すると、共分散行列が算出されます。

import numpy as np

x = [-2.1, -1,  4.3]
y = [3,  1.1,  0.12]

print(np.cov(x, y))
# [[11.71       -4.286     ]
# [-4.286       2.14413333]]

2次元配列を指定すると、各列にが一つの変数として、共分散行列が算出されます。

X = np.stack((x, y), axis=0)
print(np.cov(X))
# [[11.71       -4.286     ]
# [-4.286       2.14413333]]

numpy.corrcoefの使い方

numpy.covと同様で、numpy.corrcoefの引数に2つの1次元配列を指定するか、2次元配列を指定すると、相関係数行列が算出されます。

print(np.corrcoef(x, y))
# [[ 1.         -0.85535781]
#  [-0.85535781  1.        ]]

X = np.stack((x, y), axis=0)
print(np.corrcoef(X))
# [[ 1.         -0.85535781]
#  [-0.85535781  1.        ]]

関連記事、参考資料

]]>
https://take-tech-engineer.com/numpy-cov-corrcoef/feed/ 0
Pythonで代表値(平均値、中央値、最頻値)を算出するstatistics.mean、median、mode https://take-tech-engineer.com/python-statistics-mean-median-mode/ https://take-tech-engineer.com/python-statistics-mean-median-mode/#respond Sat, 15 Oct 2022 12:18:21 +0000 https://take-tech-engineer.com/?p=1241 Pythonの組み込みモジュールstatisticsで、代表値(平均値、中央値、最頻値)を算出する方法について記載する。平均値はstatistics.mean、中央値はstatistics.median、最頻値はstatistics.modeを用いる。

statistics.meanの使い方

statistics.meanの引数にdataを指定することで、平均値が算出される。dataが空の場合は、StatisticsErrorが返ってくる。

l = [1, 2, 3, 4, 4, 10, 1, 3, 7, 1]

print(statistics.mean(l))
# 3.6

b = []
print(statistics.mean(b))
# StatisticsError: mean requires at least one data point

statistics.medianの使い方

statistics.medianの引数にdataを指定することで、中央値が算出される。dataが偶数の場合は、中央値に近い2つの値の平均値で補間される。

print(statistics.median(l))
# 3.0

l2 = [1, 2]
print(statistics.median(l2))
# 1.5

statistics.modeの使い方

statistics.modeの引数にdataを指定することで、最頻値が算出される。最頻値が1つでない場合は、StatisticsErrorが返ってくる。

print(statistics.mode(l))
# 1

l2 = [1, 2]
print(statistics.mode(l2))
# StatisticsError: no unique mode; found 2 equally common values

関連記事、参考資料

]]>
https://take-tech-engineer.com/python-statistics-mean-median-mode/feed/ 0
【SciPy】正規分布からランダムに値を生成するstats.norm.rvs https://take-tech-engineer.com/scipy-stats-norm-rvs/ https://take-tech-engineer.com/scipy-stats-norm-rvs/#respond Sat, 15 Oct 2022 05:36:44 +0000 https://take-tech-engineer.com/?p=1235 PythonのSciPyライブラリで正規分布からランダムに値を生成するには、stats.norm.rvsを用いる。

stats.norm.rvsの使い方

stats.norm.rvsの引数locに平均、引数scaleに標準偏差を指定すると、その値に応じた正規分布からランダムに値が1つ生成される。

from scipy import stats

print(stats.norm.rvs(loc=0, scale=1))
# 0.2266770764720358
print(stats.norm.rvs(loc=10, scale=2))
# 9.194304203126878

引数sizeを指定すると、指定した数に値が生成される。

print(stats.norm.rvs(loc=1, scale=3, size=3))
# [1.34680918 5.05441921 0.10882441]

print(stats.norm.rvs(loc=-1, scale=2, size=5))
# [ 0.85238602  0.25547611 -0.19558616 -1.21010082 -1.3517654 ]

正規分布に従った値が生成されいるか確認するために、平均10、標準偏差2の正規分布からランダムに10000個値を生成する。

import seaborn as sns

v = stats.norm.rvs(loc=10, scale=2, size=10000)
sns.displot(v)

関連記事、参考資料

]]>
https://take-tech-engineer.com/scipy-stats-norm-rvs/feed/ 0
NumPyで代表値(平均値、中央値、最頻値)を算出する https://take-tech-engineer.com/numpy-mean-median-mode/ https://take-tech-engineer.com/numpy-mean-median-mode/#respond Wed, 12 Oct 2022 12:05:57 +0000 https://take-tech-engineer.com/?p=1230 Numpyで代表値(平均値、中央値や最頻値)を算出する方法について記載する。平均値はnumpy.mean、中央値はnumpy.median、最頻値はSciPyのscipy.stats.modeを用いる。

平均値:numpy.meanの使い方

5行4列のndarray配列を対象とする。numpy.meanの引数にndarray配列をを指定すると、全要素からの平均値が算出される。

import numpy as np

a = np.array([[6, 8, 3, 0],
              [3, 2, 1, 7],
              [8, 1, 8, 4],
              [5, 3, 0, 5],
              [4, 7, 5, 9]])
print(a.shape)
# (5, 4)

print(np.mean(a))
# 4.45

引数axisを指定すると軸に沿った平均値が算出される。

print(np.mean(a, axis=0))
# [5.2 4.2 3.4 5. ]

print(np.mean(a, axis=1))
# [4.25 3.25 5.25 3.25 6.25]

中央値:numpy.medianの使い方

平均値と同様でnumpy.medianにndarray配列を指定すると、全要素からの中央値が算出される。引数axisを指定すると、軸に沿った中央値が算出される。

print(np.median(a))
# 4.5

print(np.median(a, axis=0))
# [5. 3. 3. 5.]

print(np.median(a, axis=1))
# [4.5 2.5 6.  4.  6. ]

最頻値:scipy.stats.modeの使い方

Numpyには直接最頻値を求める方法はないので、SciPyのscipy.stats.modeを用いる。scipy.stats.modeの引数にndarray配列を指定する。引数axisにNoneを指定すれば全要素から、axisに軸を指定すれば軸に沿った最頻値が算出される。

from scipy import stats

print(stats.mode(a, axis=None))
# ModeResult(mode=array([3]), count=array([3]))

print(stats.mode(a, axis=None).mode)
# [3]

print(stats.mode(a, axis=None).count)
# [3]

print(stats.mode(a, axis=0))
# ModeResult(mode=array([[3, 1, 0, 0]]), count=array([[1, 1, 1, 1]]))

print(stats.mode(a, axis=1))
# ModeResult(mode=array([[0],
#        [1],
#        [8],
#        [5],
#        [4]]), count=array([[1],
#        [1],
#        [2],
#        [2],
#        [1]]))

関連記事、参考資料

]]>
https://take-tech-engineer.com/numpy-mean-median-mode/feed/ 0
【SciPy】一様分布からランダムに値を生成するstats.randint.rvs/stats.uniform.rvs https://take-tech-engineer.com/scipy-stats-randint-uniform-rvs/ https://take-tech-engineer.com/scipy-stats-randint-uniform-rvs/#respond Tue, 11 Oct 2022 13:00:54 +0000 https://take-tech-engineer.com/?p=1223 PythonのSciPyライブラリで一様分布からランダムに値を生成するには、stats.randint.rvs/stats.uniform.rvsを用いる。整数を生成した場合はstats.randint.rvs、連続値を生成したい場合は、stats.uniform.rvsを用いる。

stats.randint.rvs/stats.uniform.rvsの使い方

stats.randint.rvsの使い方

stats.randint.rvsの第一引数lowに生成する整数の最小値を、第二引数のhighに生成する整数の「最大値-1」を指定する。[low, high-1]の範囲から整数が生成される。

from scipy import stats

print(stats.randint.rvs(low=-5, high=5))
# -2

print(stats.randint.rvs(low=10, high=20))
# 17

引数sizeを指定することで、生成する値の数を変えることができる。

print(stats.randint.rvs(low=-5, high=5, size=2))
# [ 4 -5]

print(stats.randint.rvs(low=-5, high=5, size=5))
# [ 0  4 -4 -5  2]

整数が一様分布から生成されているか確認するため、1~10の範囲の値を10000個生成し、確認する。

import seaborn as sns

v = stats.randint.rvs(low=1, high=11, size=10000)
sns.displot(v)

stats.uniform.rvs

stats.uniform.rvsの第一引数locに生成する連続値の最小値を、第二引数のscaleに生成する連続値の範囲「loc+scale」を指定する。[low, loc+scale]の範囲から連続値が生成される。

print(stats.uniform.rvs(loc=0, scale=1))
# 0.6409290782947632

print(stats.uniform.rvs(loc=10, scale=50))
# 55.231159631919645

引数sizeを指定することで、生成する値の数を変えることができる。

print(stats.uniform.rvs(loc=0, scale=1, size=3))
# [0.73455082 0.31483708 0.98581969]

print(stats.uniform.rvs(loc=10, scale=50, size=6))
# [38.14807871 32.45504149 55.58068201 21.27074808 58.91817297 27.91614516]

一様分布から生成されているか確認するため、1~10の範囲の値を10000個生成し、確認する。

v = stats.uniform.rvs(loc=0, scale=1, size=10000)
sns.displot(v)

関連記事、参考記事

]]>
https://take-tech-engineer.com/scipy-stats-randint-uniform-rvs/feed/ 0