우 엔다의 심층 학습 첫 번째 수업 두 번째 주 숙제 --- 낮은 버전으로 인한 원래 숙제의 다양한 버그를 해결했습니다(수정된 전체 코드 및 숙제 데이터 세트 첨부)

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 함수가 포함되어 있지 않습니다. 공식 웹사이트에서 제공하는 설명과 해결 방법은 다음과 같습니다.

'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()).

pip install XXX 명령을 통해 직접 설치했기 때문에 명령줄 창 cmd의 pip 목록을 통해 직접 설치한 각 모듈의 버전을 확인할 수 있으므로 설치된 버전이 최신 버전입니다.

(당시 문제가 있어서 인터넷에 몇몇 블로거들이 scipy 버전이 너무 높다고 해서 scipy 버전을 낮췄습니다)

공식 웹 사이트의 지침에 따라 scipy가 제거되고 imageio로 대체되었으며 나중에 사용 방법을 살펴 보겠습니다.

2. RuntimeWarning 해결: 로그에서 발생하는 0으로 나누기; RuntimeWarning: 곱하기 등에서 잘못된 값이 발생하면 결과는 nan 값으로 나타납니다.

이러한 버그는 모두 로그 함수를 사용하여 발생하는 것으로, 학습 과정에서 로그 함수의 매개변수가 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