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
繰り返すほど、損失が小さくなり、精度(精度)が高くなります.
ここの精度は訓練精度が高ければいいというものではない.発生する可能性のある問題
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()
ロスの値が反復回数とともにどれだけ減少するかを確認した.
勉強すればするほど、ロスの価格は低くなります.
しかし,学習率が高いほど検証損失値が高くなる.
=>損失値が下がって上昇した点が適切であることを確認する
#정확도 그래프 그리기
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()
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)
学習後期
今日はニューラルネットワークモデルを作りました.作り方は異なるが,目的は同じで,適合を阻止した場合に最高精度のモデルを探すことである.
今は繰り返しの概念を知っていますが、まだ分からないところがたくさんあります.毎日余分な資料を調べていますが、勉強には不足が多く、一日が足りません.しかし、問題が発生したり、探したりする過程が役に立つと思います.がんばってください.
Reference
この問題について(AI-Deep Learning 2日目), 我々は、より多くの情報をここで見つけました
https://velog.io/@hanss1122/AI-Deep-Learning-2일차
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(AI-Deep Learning 2日目), 我々は、より多くの情報をここで見つけました https://velog.io/@hanss1122/AI-Deep-Learning-2일차テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol