C1W2 - ニューラル ネットワークの考え方によるロジスティック回帰
宿題の要件: ニューラル ネットワークの考え方を使用してロジスティック回帰分類器を構築し、写真が猫かどうかを識別し、自分の写真を使用して猫であるかどうかを検出します。
1. 使用する必要があるさまざまなモジュールをインポートします
元のコード:
import numpy as np
import matplotlib.pyplot as plt
import h5py
import scipy
from PIL import Image
from scipy import ndimage
from lr_utils import load_dataset
%matplotlib inline
編集後:
import numpy as np
import matplotlib.pyplot as plt
import h5py
from PIL import Image
import imageio
from lr_utils import load_dataset
%matplotlib inline
scipyのバージョンの問題のため。scipy>=1.0.0 には関数 imread 、imresize が含まれなくなりました。公式 Web サイトの説明と解決策は次のとおりです。
`imread` は SciPy 1.0.0 で非推奨となり、1.2.0 で削除される予定です。代わりに「 imageio.imread」を使用してください。
imresize is deprecated! imresize is deprecated in SciPy 1.0.0, and will be removed in 1.3.0. Use Pillow instead: numpy.array(Image.fromarray(arr).resize()).
自分でインストールした各モジュールのバージョンは、コマンド ライン ウィンドウの cmd の pip リストで確認できます。私は pip install XXX コマンドで直接インストールしたため、インストールされているバージョンは最新バージョンです。
(当時問題があったため、インターネット上の一部のブロガーがscipyのバージョンが高すぎるという意見を出していたため、scipyのバージョンを下げました)
公式ウェブサイトの説明によると、scipy は削除され、imageio に置き換えられました。使い方は後ほど説明します。
2. RuntimeWarning: ログでゼロによる除算が発生した、RuntimeWarning: 乗算で無効な値が発生したなどを解決し、結果が nan 値で表示される
これらのバグはすべて log 関数の使用に起因しており、学習処理中に log 関数のパラメータが 0 になる場合があり、このとき計算結果が無限大になる、つまりコストがオーバーフローする傾向があります。は nan の値です。警告は、ログ パラメーターが大きすぎるか小さすぎることを示します。そのため、ログ関数を最適化するだけで、これらの問題は解決されます。
解決:
#正向传播和反向传播
def propagate(w,b,X,Y):
m = X.shape[1]
A = sigmoid(np.dot(w.T,X)+b)
cost = (-1/m)*np.sum(Y*np.log(A+1e-5)+(1-Y)*(np.log(1-A)))
cost = np.squeeze(cost)
assert(cost.shape == ())
dw = (1/m)*np.dot(X,(A-Y).T)
db = (1/m)*np.sum(A-Y)
assert(dw.shape == w.shape)
assert(db.dtype == float)
grads = {"dw":dw,"db":db}
return grads,cost
ここで追加した np.log 関数のかっこ内に小さな値を追加します。
3. imread、imresize の代替手段
- 読んだ
元のコード:
my_image = "my_image.jpg"
fname = "images/" + my_image
image = np.array(ndimage.imread(fname, flatten=False))
変更後:
image = np.array(imageio.imread(r"cat.jpg"))
- 羨ましい
元のコード:
my_image = scipy.misc.imresize(image, size=(num_px, num_px)).reshape((1, num_px * num_px * 3)).T
変更後:
my_image = np.array(Image.fromarray(image).resize((num_px, num_px),Image.ANTIALIAS)) #ANTIALIAS表示保留图片所有像素,不丢失原有像素
my_image = my_image.reshape((1, num_px * num_px * 3)).T
コードを添付して、独自のダウンロード イメージをテストします。
d = model(train_set_x, train_set_y, test_set_x, test_set_y, num_iterations = 2000, learning_rate = 0.5, print_cost = True)
image = np.array(imageio.imread(r"cat.jpg"))
num_px=64
my_image = np.array(Image.fromarray(image).resize((num_px, num_px),Image.ANTIALIAS))
my_image = my_image.reshape((1, num_px * num_px * 3)).T
#print(image)
#plt.imshow(my_image)
my_predicted_image = predict(d["w"], d["b"], my_image)
print("y = " + str(np.squeeze(my_predicted_image)) + ", your algorithm predicts a \"" + classes[int(np.squeeze(my_predicted_image)),].decode("utf-8") + "\" picture.")
最終結果: