AI-Deep Learning 2日目

41088 ワード

学習内容


基本ニューラルネットワークの作成

from keras import models
from keras import layers

network = models.Sequential() #하나의 신경망을 시작하기 위한 준비
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,))) #덴스레이어를 만든다
#512개의 신경을 생성
network.add(layers.Dense(10, activation='softmax', input_shape=(28 * 28,)))#10개의 신경을 생성
#네트워크를 완성
#네트워크를 마무리
network.compile(optimizer='rmsprop',
               loss='categorical_crossentropy',
               metrics=['accuracy'])
#optimizer : 가중치를 조절해주는 역할
#loss : 손실값을 계산하는 역할
#분류할 때는 손실함수 중 categorical_crossentropy를 가장 많이 사용
#둘 중 하나를 판볗할 때는 binary_crossentropy를 많이 사용한다
train_images = train_images.reshape(60000, 28*28) #모양을 바꾼다
#(60000, 28, 28)을 (60000, 784)로 바꾼다 28x28=784 일자로 펴서 컴퓨터가 계산하기 좋게 변경
#쓰기 좋게 실수형으로 변경
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape(10000, 28*28) #테스트 데이터는 1만개이다
test_images = test_images.astype('float32') / 255
#카테고리컬 데이터로 만들기 위한 준비
from tensorflow.keras.utils import to_categorical

#카테고리컬 데이터로 바꿔준다
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
#네트워크 이용
#사이킷런이랑 명령어는 같다, 학습시킬 때 fit을 쓴다
network.fit(train_images, train_labels, epochs=5, batch_size=128) #epochs 반복횟수, batch_size 한 번 돌릴 때 데이터 사이즈

결과)
Epoch 1/5
469/469 [==============================] - 9s 9ms/step - loss: 0.2596 - accuracy: 0.9246
Epoch 2/5
469/469 [==============================] - 4s 8ms/step - loss: 0.1040 - accuracy: 0.9691
Epoch 3/5
469/469 [==============================] - 4s 8ms/step - loss: 0.0674 - accuracy: 0.9797
Epoch 4/5
469/469 [==============================] - 4s 8ms/step - loss: 0.0497 - accuracy: 0.9847
Epoch 5/5
469/469 [==============================] - 4s 8ms/step - loss: 0.0367 - accuracy: 0.9890
繰り返すほど、損失が小さくなり、精度(精度)が高くなります.
ここの精度は訓練精度が高ければいいというものではない.発生する可能性のある問題
  • 評価
    実際にテストデータを加えてテストを行います.
  • test_loss, test_acc = network.evaluate(test_images, test_labels)
    
    print('test_acc:',test_acc)
    
    결과)
    test_acc: 0.979200005531311
    #테스트 정확도도 높게 나왔다.

    映画評論分類:バイナリ分類例


    IMDBデータセットを使用して実際のデータを分類します.
    ネット映画データベースから持ってきた楊根丹評論は50000個あり、xデータは評論の単語であり、yデータは単語の正負のラベルである.
    from keras.datasets import imdb #영화 리뷰 데이터 가져옴
    (train_data, train_label),(test_data, test_label) = imdb.load_data(num_words=10000) 
    #다 가져오면 데이터가 많아서 안에 있는 데이터 중 중요한 데이터 일부만 가져오겠다는 뜻
    #그냥 load_data()하면 전체 데이터를 가지고 온다
    #학습용 데이터 개수 확인
    len(train_data)
    
    결과)
    25000
    #테스트용 데이터 개수 확인
    len(test_data)
    
    결과)
    25000
    #학습용 데이터의 첫번째 데이터 확인
    train_data[0]
    #전처리되어 있어 단어들이 모두 숫자로 변환되어 있음
    
    결과)
    [1,
     14,
     22,
     16,
     43,
     530,
     973,
     ... 중략 ...
     178,
     32]
    #positive인지 negative인지 라벨링을 확인
    train_label[0]
    
    결과)
    1
    # word_index는 단어와 정수 인덱스를 매핑한 딕셔너리
    word_index = imdb.get_word_index()
    # 정수 인덱스와 단어를 매핑하도록 뒤집는다
    reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
    # 리뷰를 디코딩
    # 0, 1, 2는 '패딩', '문서 시작', '사전에 없음'을 위한 인덱스이므로 3을 뺀다
    decoded_review = ' '.join([reverse_word_index.get(i - 3, '?') for i in train_data[0]])
    import numpy as np
    
    def vectorize_sequences(sequences, dimension=10000): #vecorize_sequences(시퀀스,차원을 받아들이는 함수)
        results = np.zeros((len(sequences),dimension))
        #0으로 초기화됨 10000개짜리 배열 생성, 튜플타입으로 생성해야 됨
        #단어의 길이의 수만큼 생성
        
        for i, sequence in enumerate(sequences):
            results[i, sequence] = 1.
        return results
        
    x_train = vectorize_sequences(train_data)
    x_test = vectorize_sequences(test_data)
    
    #정수형 데이터를 실수형을 바꿔준다.
    y_train = np.array(train_label).astype('float32')
    y_test = np.array(test_label).astype('float32')
    # 신경망 만들기
    from keras import models
    from keras import layers
    
    model = models.Sequential() #신경 생성
    model.add(layers.Dense(16, activation='relu', input_shape=(10000,))) #input_shape는 첫번째 데이터에만 주면 됨
    model.add(layers.Dense(16, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))
    from keras import losses
    from keras import metrics
    from tensorflow.keras import optimizers
    
    # model.compile(optimizer='rmsprop',
    model.compile(optimizer=optimizers.RMSprop(lr=0.001),
                  loss='binary_crossentropy',
                  metrics='accuracy')
    #신경망 준비 완료
    x_val = x_train[:10000] #2만5천개 중에 서 앞에서 부터 만개까지 가져옴
    partial_x_train = x_train[10000:]
    
    y_val = y_train[:10000] #2만5천개 중에 서 앞에서 부터 만개까지 가져옴
    partial_y_train = y_train[10000:]
  • 実際に動作が正しいかどうかを学習し検証する
  • history = model.fit(partial_x_train,
                        partial_y_train,
                        epochs=3,
                        batch_size=512,
                        validation_data=(x_val, y_val))
    
    #epochs 학습을 얼마나 할지 지정
    #batch_size 데이터의 단위
    #validation_data 검증 작업
    
    결과)
    Epoch 1/3
    30/30 [==============================] - 2s 34ms/step - loss: 0.4950 - accuracy: 0.7893 - val_loss: 0.3804 - val_accuracy: 0.8606
    Epoch 2/3
    30/30 [==============================] - 1s 19ms/step - loss: 0.2954 - accuracy: 0.9037 - val_loss: 0.3026 - val_accuracy: 0.8854
    Epoch 3/3
    30/30 [==============================] - 1s 18ms/step - loss: 0.2155 - accuracy: 0.9303 - val_loss: 0.3274 - val_accuracy: 0.8616
    history_dict = history.history
    history_dict.keys()
    
    결과)
    dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])
    # 그래프로 그려서 확인
    import matplotlib.pyplot as plt
    
    acc = history.history['accuracy']
    val_acc = history.history['val_accuracy'] #validation 정확도 가져오기
    loss = history.history['loss'] #loss값 저장
    val_loss = history.history['val_loss'] #validation loss값 가져오기
    
    epochs = range(1,len(acc) + 1)
    #손실 그래프 그리기
    plt.plot(epochs, loss, 'bo', label='Training loss') #x에는 반복횟수, y에는 로스값, 파란 동그라미로 표시
    plt.plot(epochs, val_loss, 'r-', label='Validation loss')#x에는 반복횟수, y에는 밸리데이션로스값, 빨간선으로 표시
    plt.title('Training and validation loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()
  • 図面説明
  • xはループ回数,yはループ回数である.
    ロスの値が反復回数とともにどれだけ減少するかを確認した.
    勉強すればするほど、ロスの価格は低くなります.
    しかし,学習率が高いほど検証損失値が高くなる.
    =>損失値が下がって上昇した点が適切であることを確認する
    #정확도 그래프 그리기
    plt.plot(epochs, acc, 'bo', label='Training acc')
    plt.plot(epochs, val_acc, 'r-', label='Validation acc')
    plt.title('Training and validation accuracy')
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.legend()
  • 図面説明
  • 同様に,繰返し回数が増えるにつれて学習正解率は上昇するが,検証正解率は2回目の繰返しで最良である.
  • 型番評価
  • results = model.evaluate(x_test, y_test) 
    
    결과)
    782/782 [==============================] - 2s 3ms/step - loss: 0.3404 - accuracy: 0.8582
    #정확도 0.8582
    #예측
    model.predict(x_test)
    
    결과)
    array([[0.3295951 ],
           [0.99504805],
           [0.99003863],
           ...,
           [0.27628434],
           [0.35289758],
           [0.81273484]], dtype=float32)

    学習後期


    今日はニューラルネットワークモデルを作りました.作り方は異なるが,目的は同じで,適合を阻止した場合に最高精度のモデルを探すことである.
    今は繰り返しの概念を知っていますが、まだ分からないところがたくさんあります.毎日余分な資料を調べていますが、勉強には不足が多く、一日が足りません.しかし、問題が発生したり、探したりする過程が役に立つと思います.がんばってください.