徹底的な学習の最初のレッスンの 2 週目の Wu Enda の宿題 --- バージョンが低いため、元の宿題のさまざまなバグを解決しました (修正された完全なコードと宿題データ セットが添付されました)

C1W2 - ニューラル ネットワークの考え方によるロジスティック回帰

参考記事リンク:https://github.com/Kulbear/deep-learning-coursera/blob/master/Neural%20Networks%20and%20Deep%20Learning/Logistic%20Regression%20with%20a%20Neural%20Network%20mindset.ipynb

宿題の要件: ニューラル ネットワークの考え方を使用してロジスティック回帰分類器を構築し、写真が猫かどうかを識別し、自分の写真を使用して猫であるかどうかを検出します。

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 関数のかっこ内に小さな値を追加します10^-5

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.")

最終結果:

 

おすすめ

転載: blog.csdn.net/weixin_42149550/article/details/99876301