오전중에는 어제 배운 cnn 활용해서 각자 웹에서 데이터를 찾아 실습해보았다.
워낙적은 데이터를 수작업으로 하나씩 모았고 학습이 실행되는지만 확인했다
정확도를 더 올리고 싶다면 더많은 데이터를 가지고 학습하고 epoch 나 lr등을 조정하면 정확도를 더 올릴수 있을것 같다.
오후에는 단어의 토큰화를 배웠다.
#주어진 문장을 '단어'로 토큰화 하기
# 텍스트 전처리 함수 text_to_word_sequence() 호출
from tensorflow.keras.preprocessing.text import text_to_word_sequence
#전처리할 텍스트를 정합니다
text='해보지 않으면 해낼 수 없다.'
#해당 텍스트를 토큰화 합니다.
result =text_to_word_sequence(text)
print('\n원물:\n',text)
print('\n토큰화:\n',result)
import numpy as np
import tensorflow as tf
from numpy import array
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten,Embedding
# 전처리하려는 세 개의 문장 정하기
docs = ['먼저 텍스트의 각 단어를 나누어 토큰화 합니다.',
'텍스트의 단어로 토큰화 해야 딥러닝에서 인식됩니다.',
'토큰화 한 결과는 딥러닝에서 사용할 수 있습니다.',]
# 토큰화 함수를 이용해 전처리하는 과정
token = Tokenizer() # 토큰화 함수 지정
token.fit_on_texts(docs) # 토큰화 함수에 문장 적용하기
# 각 옵션에 맞춰 단어의 빈도 수를 계산한 결과 출력
print("\n단어 카운트:\n", token.word_counts)
#Tokenizer()의 word_counts 함수는순서를 기억하는 orderdDict 클래스를 사용합니다.
# 출력되는 순서는 랜덤
print("\n문장 카운트: ", token.document_count)
print("\n각 단어가 몇 개의 문장에 포함되어 있는가:\n", token.word_docs)
print("\n각 단어에 매겨진 인덱스 값:\n", token.word_index)
from tensorflow.keras.preprocessing.text import Tokenizer
text = '오랫동안 꿈꾸는 이는 그 꿈을 닮아간다'
token= Tokenizer()
token.fit_on_texts([text])
print(token.word_index)
x=token.texts_to_sequences([text])
print('\텍스트,토큰화 결과:\n',x)
from tensorflow.keras.utils import to_categorical
word_size=len(token.word_index)+1
x=to_categorical(x,num_classes=word_size)
print(x)
#영화 리뷰가 긍정적인지 부정적인지 예측하기
from numpy import array
#텍스트 리뷰자료를 지정합니다.
docs = ['너무 재밌네요','최고예요','참 잘 만든 영화예요','추천하고 싶은 영화입니다.',
'한번 더 보고싶네요','글쎄요','별로예요','생각보다 지루하네요','연기가 어색해요','재미없어요']
#긍정 리뷰는1, 부정리뷰는 0으로 클래스를 지정합니다.
classes=array([1,1,1,1,1,0,0,0,0,0])
from tensorflow.keras.preprocessing.text import Tokenizer
#토큰화
token=Tokenizer()
token.fit_on_texts(docs)
print(token.word_index)
x=token.texts_to_sequences(docs)
print('\n리뷰 텍스트, 토큰화 결과 : \n',x)
from tensorflow.keras.preprocessing.sequence import pad_sequences
#패딩,서로 다른 길이의 데이터를 4로 맞추어 줍니다.
padded_x=pad_sequences(x,4)
print('\n패딩 결과:\n',padded_x)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten,Embedding
from tensorflow.keras.preprocessing.text import Tokenizer
text='I am a boy. My name is Joshua'
#토큰화
token=Tokenizer(
num_words=None,
filters='!"#$%&()*+-,./:;<>=?@[\\]^_`{|}~\t\n',
lower=False, split=' ',char_level=False,oov_token=None,document_count=0)
# num_words:단어 빈도가 많은 수서로 num_words개의단어를 보존한다.
# filters: 걸러낼 문자리스트를 적어준다.
# lower : 입력 받은 문자열을 소문잘 변환 할지를 T,F로 적어준다
# split: 문자열을 적어줘야하고,단어를 분리하는 기준을 적어준다
# char_level:True 인경우 모든 문자가 토큰으로 처리된다.
# oov_token : 값이 지정된 경우 text_to_sequence 호출과정에서 word_index에 추가되서 out of vocabulary words를 대체한다
token.fit_on_texts([text])
print(token.word_index)
import numpy as np
samples=['The cat sat on the mat.','The dog ate my homework.']
token_index={}
for sample in samples:
print(sample)
for word in sample.replace('.',' ').split():
token_index[word] = len(token_index)+1
print(token_index)
# 각 샘플을 벡터로 변환합니다
# 각 샘플에서 max_length 까지 단어만 사용합니다
max_length=10
#결과를 저장할 배열입니다.
results=np.zeros((len(samples),max_length,max(token_index.values())+1))
#results=np.zeros(2,10,11)
for i, sample in enumerate(samples):
print(sample)
for j,word in list(enumerate(sample.replace('.',' ').split()))[:max_length]:
#token_index(위에 만들어진 토큰의인덱스딕셔너리)
index= token_index.get(word)
results[i,j,index]=1
print(results)
#문장 분류해보기
import sys
import string
samples=['The cat sat on the mat.','The dog ate my homework.']
characters=string.printable
token_index=dict(zip(characters, range(1,len(characters)+1)))
print(token_index)
import numpy as np
max_length=50
#결과를 담을 3차원 배열을 0으로 초기화 하여 생성
results=np.zeros((len(samples),max_length,max(token_index.values())+1)) #2,50,101
for i,sample in enumerate(samples):
for j,characters in enumerate(sample[:max_length]):
index= token_index.get(characters)
results[i,j,index]=1 #해당 되는아스키 코드의 index만 1로
import sys
np.set_printoptions(threshold=sys.maxsize)#print에서 생략하지 않고 모든 행/열을 표시
print(results)
#원-핫 인코딩 -해싱 기법
import numpy as np
samples=['The cat sat on the mat.','The dog ate my homework.']
# 단어의 크기가 1,000인 벡터로 저장합니다
# 1000개(또는 그이상)의 단어가 있다면 해싱 충돌이 늘어나고
# 이노딩의 정확도가 감소될 것입니다
dimensionality=1000
max_length=10
results=np.zeros((len(samples),max_length,dimensionality)) #2,50,101
for i,sample in enumerate(samples):
for j,word in enumerate(sample[:max_length]):
#단어를 해싱하여 0,1000사이의 랜덤한 정수 인덱스로 변환합니다
index= abs(hash(word)) % dimensionality
results[i,j,index]=1
print(results)
#IMDB 영화 리뷰 감성 예측 문제 연습하기
from tensorflow.keras.datasets import imdb
from tensorflow.keras import preprocessing
max_features = 10000
maxlen=20
(X_train,Y_train),(X_test,Y_test)= imdb.load_data(num_words=max_features)
X_train = preprocessing.sequence.pad_sequences(X_train, maxlen=maxlen)
X_test = preprocessing.sequence.pad_sequences(X_test, maxlen=maxlen)
print(X_train.shape,Y_train.shape)
print(X_test.shape,Y_test.shape)
print(X_train[0])
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten,Dense,Embedding
print(X_train.shape)
model=Sequential()
#나중에 임베딩된 입력을 플래
model.add(Embedding(10000,8,input_length=maxlen))
model.add(Flatten())
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
model.summary()
history=model.fit(X_train,Y_train,epochs=10,batch_size=32,validation_split=0.2)
loss: 0.3018 - acc: 0.8747 - val_loss: 0.5263 - val_acc: 0.7518
학습을 더한다면 더 좋은 예측치를 얻을수도 있을것 같다.
'First step > AI 기초반' 카테고리의 다른 글
[TIL]21.07.30 reuters 기사 분류 (0) | 2021.07.30 |
---|---|
[TIL]21.07.29 임베딩 (0) | 2021.07.29 |
[TIL]21.07.27 CNN 기초2 (0) | 2021.07.27 |
[TIL]21.07.26 CNN (0) | 2021.07.26 |
[TIL]21.07.23 mnist 사용 기초 (0) | 2021.07.23 |