[카테고리:] tensorflow

tensorflow 테스트

  • tag 형식 제한기 작성 후기

    최근 몇 일간 태그를 제한하는 스크립트, 코드를 작성했다. 프로세스는 좀 복잡하다. 시운전자마다 태그를 지멋대로 작성한다. 태그를 잘 분석하면 좋은데, 지 멋대로라 의미있는 정보를 쉽게 얻어내기 어렵다. 오타도 많고 단어도 지 멋대로 순서로 작성한다. 그나마 잘못한 부분을 보아야 하는데 잘 보이지도 않는다. 없던 작업이라 대부분 고민해서 직접 만들었다. 시간이 정말 많은 사람이라면 취미로 프로그램 작성을 가져봄을 추천한다. 이건 뭐 정확한 법칙도 없어 모두 케바케다. stack overflow가 셧다운 되었을 때 사람들이 그 난리를 쳤는지 이해된다.

    위치,원래 태그,수정한 태그
    ***,****_UM_PRS_***_***,***_UM_PRS_***_***
    ***,****_UM_PRS_***_***,****_UM_PRS_***_***
    ***,***_PRS_UM_***_***_***,***_UM_PRS_***_***_***
    ***,***_PRS_UM_***_***_***,***_UM_PRS_***_***_***

    위 결과를 보면 원래 태그가 UM_PRS, PRS_UM 두 방식으로 표현된다. 두 방식을 모두 UM_PRS로 수정했다. 틀려도 같이 틀린다. 대충 잘 동작한다고 믿고 싶다. 몇 만개 중에서 30%만 수정한 태그에 답을 달았다. %를 올릴려면 한참 입력해야 한다. 현실은 시궁창이니…

  • CarpPole Deep Q Network 이해

    강아지 책에 나온 예제를 실행했다. 책 실행 환경과 내 그것이 달라 실행할 수 없었다. 나는 docker로 tensorflow를 사용한다. 그것도 cpu가 avx 등 을 지원하지 않아 직접 컴파일했다. openAi gym은 GUI 환경에서 실행되어 docker로 구동하기 힘들다. 데스크탑을 거실에 설치하여 다른 노트북에서 ssh로 접속하여 사용한다. 이런 모든 문제를 jypyter notebook로 해결했다. 전 글에 설명한대로 docker를 아래 명령으로 구동한다.

    docker run -it -v /run/user/1000:/run/user/1000 -v /dev:/dev -v /tmp/.X11-unix:/tmp/.X11-unix:ro --privileged --ipc=host --shm-size=256m --net=host -e DISPLAY=$DISPLAY -e XDG_RUNTIME_DIR=/run/user/1000 --runtime=nvidia -e LC_ALL=C.UTF-8 -v /home/now0930/tensorflow/:/home/mnt tensorflow/tensorflow:1.12.0-rc2-gpu-py3-keras /bin/bash

    jupyter notebook을 실행한다. uid 1000으로 실행하는 방법을 모르겠다.

    docker exec -w /home/mnt/gym vibrant_banach /usr/bin/xvfb-run -s "-screen 0 1400x600x24" jupyter notebook --allow-root

    책 코드를 실행하기 위해 아래와 같이 수정했다.

    import sys
    import gym
    import pylab
    import random
    import numpy as np
    from collections import deque
    from keras.layers import Dense
    from keras.optimizers import Adam
    from keras.models import Sequential
    from gym import wrappers
    
    EPISODES = 300
    
    
    # 카트폴 예제에서의 DQN 에이전트
    class DQNAgent:
        def __init__(self, state_size, action_size):
            self.render = False
            self.load_model = False
    
            # 상태와 행동의 크기 정의
            self.state_size = state_size
            self.action_size = action_size
            print("self.state_size는", self.state_size)
            print("self.action_size는", self.action_size)
            # DQN 하이퍼파라미터
            self.discount_factor = 0.99
            self.learning_rate = 0.001
            self.epsilon = 1.0
            self.epsilon_decay = 0.999
            self.epsilon_min = 0.01
            self.batch_size = 64
            #self.batch_size = 1
            self.train_start = 1000
    
            # 리플레이 메모리, 최대 크기 2000
            self.memory = deque(maxlen=2000)
    
            # 모델과 타깃 모델 생성
            self.model = self.build_model()
            self.target_model = self.build_model()
    
            # 타깃 모델 초기화
            self.update_target_model()
    
            if self.load_model:
                self.model.load_weights("./save_model/cartpole_dqn_trained.h5")
    
        # 상태가 입력, 큐함수가 출력인 인공신경망 생성
        def build_model(self):
            model = Sequential()
            model.add(Dense(24, input_dim=self.state_size, activation='relu',
                            kernel_initializer='he_uniform'))
            model.add(Dense(24, activation='relu',
                            kernel_initializer='he_uniform'))
            model.add(Dense(self.action_size, activation='linear',
                            kernel_initializer='he_uniform'))
            model.summary()
            model.compile(loss='mse', optimizer=Adam(lr=self.learning_rate))
            return model
    
        # 타깃 모델을 모델의 가중치로 업데이트
        def update_target_model(self):
            self.target_model.set_weights(self.model.get_weights())
    
        # 입실론 탐욕 정책으로 행동 선택
        def get_action(self, state):
            if np.random.rand() <= self.epsilon:
                return random.randrange(self.action_size)
            else:
                q_value = self.model.predict(state)
                #print("q_value는", q_value)
                #print("argamx(q_value)는", np.argmax(q_value[0]))
                #print("State는", state)
                return np.argmax(q_value[0])
    
        # 샘플 <s, a, r, s'>을 리플레이 메모리에 저장
        def append_sample(self, state, action, reward, next_state, done):
            self.memory.append((state, action, reward, next_state, done))
    
        # 리플레이 메모리에서 무작위로 추출한 배치로 모델 학습
        def train_model(self):
            if self.epsilon > self.epsilon_min:
                self.epsilon *= self.epsilon_decay
    
            # 메모리에서 배치 크기만큼 무작위로 샘플 추출
            mini_batch = random.sample(self.memory, self.batch_size)
            states = np.zeros((self.batch_size, self.state_size))
            next_states = np.zeros((self.batch_size, self.state_size))
            actions, rewards, dones = [], [], []
    
            for i in range(self.batch_size):
                states[i] = mini_batch[i][0]
                actions.append(mini_batch[i][1])
                rewards.append(mini_batch[i][2])
                next_states[i] = mini_batch[i][3]
                dones.append(mini_batch[i][4])
    
            # 현재 상태에 대한 모델의 큐함수
            # 다음 상태에 대한 타깃 모델의 큐함수
            target = self.model.predict(states)
            target_val = self.target_model.predict(next_states)
    
            # 벨만 최적 방정식을 이용한 업데이트 타깃
            for i in range(self.batch_size):
                #print("target은", target[i])
                if dones[i]:
                    target[i][actions[i]] = rewards[i]
                else:
                    target[i][actions[i]] = rewards[i] + self.discount_factor * (
                        np.amax(target_val[i]))
    
            self.model.fit(states, target, batch_size=self.batch_size,
                           epochs=10, verbose=0)
    
    
    if __name__ == "__main__":
        # CartPole-v1 환경, 최대 타임스텝 수가 500
        env = gym.make('CartPole-v1')
        env = wrappers.Monitor(env, "./gym-results-Cart", force=True, video_callable=lambda episode_id: episode_id%20==0)
    
        state_size = env.observation_space.shape[0]
        action_size = env.action_space.n
    
        # DQN 에이전트 생성
        agent = DQNAgent(state_size, action_size)
    
        scores, episodes = [], []
    
        for e in range(EPISODES):
            done = False
            score = 0
            # env 초기화
            #env = wrappers.Monitor(env, "./gym-results-Cart", force=True)
            state = env.reset()
            state = np.reshape(state, [1, state_size])
            #print("state reshape는",state)
    
            while not done:
                
                if agent.render:
                    env.render()
    
                # 현재 상태로 행동을 선택
                action = agent.get_action(state)
                # 선택한 행동으로 환경에서 한 타임스텝 진행
                next_state, reward, done, info = env.step(action)
                next_state = np.reshape(next_state, [1, state_size])
                # 에피소드가 중간에 끝나면 -100 보상
                reward = reward if not done or score == 499 else -100
    
                # 리플레이 메모리에 샘플 <s, a, r, s'> 저장
                agent.append_sample(state, action, reward, next_state, done)
                # 매 타임스텝마다 학습
                if len(agent.memory) >= agent.train_start:
                    agent.train_model()
    
                score += reward
                state = next_state
    
                if done:
                    # 각 에피소드마다 타깃 모델을 모델의 가중치로 업데이트
                    agent.update_target_model()
    
                    score = score if score == 500 else score + 100
                    # 에피소드마다 학습 결과 출력
                    scores.append(score)
                    episodes.append(e)
                    #pylab.plot(episodes, scores, 'b')
                    #pylab.savefig("./save_graph/cartpole_dqn.png")
                    print("episode:", e, "  score:", score, "  memory length:",
                          len(agent.memory), "  epsilon:", agent.epsilon)
    
                    # 이전 10개 에피소드의 점수 평균이 490보다 크면 학습 중단
                    if np.mean(scores[-min(10, len(scores)):]) > 490:
                        agent.model.save_weights("./save_model/cartpole_dqn.h5")
                        sys.exit()
    

    다음 내용을 수정했다.

    • 10 행: from gym import wrappers: wrappers 사용.
    • 120 행: env = wrappers.Monitor(env, “./gym-results-Cart”, force=True, video_callable=lambda episode_id: episode_id%20==0): 20번마다 동영상으로 저장. 여기를 설정하지 않으면 64번째 에피소드 동영상을 저장하고, 1,000번째 에피소드로 넘어간다. 학습 과정을 알 수 없다.

    cartPole-v1은 10초 동안 막대기가 넘어지지 않으면 끝나는 모델이다. 10초 전 막대기가 12도 넘게 기울어지면 끝난다. Q-learning은 아래 식으로 정의된다. \alpha 는 learning rate, \gamma 는 discount factor.

    Q(S_{t},A_{t})\leftarrow Q(S_{t},A_{t})+\alpha \left [R_{t+1}+\gamma\max_{a}Q(S_{t+1},a)-Q(S_{t},A_{t}) \right ]

    위 식에서 Q(S_{t},A_{t})R_{t+1}+\gamma \max_{a}Q(S_{t+1},a) 로 오차를 줄여 나간다. 오차는 MSE = ( 정답 – 예측 ) ^{2} = (R_{t+1} + \gamma Q(S_{t+1},A_{t+1}) - Q(S_{t},A_{t}) 로 정의한다. keras.fit에서 state에 따른 예측Q(S_{t},A_{t}) 과 정답인 target[i]로 학습한다. keras.fit을 부르기 전에 miniBatch 크기 모든 target[size]를 업데이트한다. print로 taget[i]값을 확인할 수 있다.

    episode: 73   score: 64.0   memory length: 2000   epsilon: 0.2699131774597243
    update전 target[20] [41.376812 37.715374]
    update후 target[20] [41.376812 40.977367]
    #action에 따른 정확한 Q 값을 수정.
    ##여기에서 무작위로 다시 뽑음.
    update전 target[20] [46.597427 39.114082]
    update후 target[20] [46.597427 42.882465]
    ...
    episode: 132   score: 419.0   memory length: 2000   epsilon: 0.009998671593271896
    update전 target[20] [113.11228 112.72044]
    update후 target[20] [113.11228 113.5387 ]
    update전 target[20] [109.97069 109.24642]
    update후 target[20] [109.97069 109.48601]
    update전 target[20] [112.96742 112.18164]
    update후 target[20] [112.92011 112.18164]
    # 132번 episode가 73번 episode보다 정답에 더 근접하여 업데이트 량이 줄었다.

    이렇게 10개 평균 score가 490 이상이면 학습을 중단한다. 적당한 Q 값을 찾는 문제라 value based Reinforce Learning이라 한다. 모델을 정의할 때 Q 값을 제한하지 않으려 activation을 linear로 설정했다.

    300번 학습 결과,스코어 vs 횟수.

    정책을 직접 근사하는 방법은 policy based Reinforce Learning인데, 마지막에 softmax 로 확율을 나오도록 해야 한다.

    Sutton & Barto 가 쓴 책을 보면 잘 이해가지 않는데, 직접 돌려 확인하면 이해했다 착각한다.

  • openai gym cart pole 설정

    openai gym cart pole 설정

    PC를 거실에 설치하고 docker로 tensorflow를 설정했다. docker가 쉽고 간편하여 다 좋은데 그래픽 사용자 인터페이스를 지원하지 않는다. gym을 설정하기 어렵다. 찾다보니 다음 순서로 진행하면 동영상 파일을 만든다. 아직 맛만 보아 뭔지 잘 모르겠으나, 일단 에러없는 화면을 보니 안심된다.

    • pip로 gym 관련 모듈 설치
    • python3-opengl 모듈 설치
    • xvfb 모듈 설치
    • jupyter notebook 설치
    • python에서 wrappers로 실행.

    jupyter notebook을 xvfb-run 아래와 같이 실행한다.

    xvfb-run -s "-screen 0 1400x900x24" jupyter notebook --allow-root

    여기를 웹으로 접속하여 아래 코드를 실행하면 cartPole을 동영상으로 녹화한다.

    import gym
    from gym import wrappers
    
    env = gym.make('CartPole-v1')
    env = wrappers.Monitor(env, "./gym-results-Cart", force=True)
    observation = env.reset()
    for _ in range(1000):
        env.render()
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        if done: break
    env.close()

  • keras로 키워드 분석((5+1)/5)

    정말 간단한 LSTM으로 정확도 80%대까지 올렸다. 23,000개 데이터를 7,000번 학습시겼다. 정확하게 하려면 모든 카테고리 데이터를 동일하게 맞추고, 내부 태그를 정확하게 정리해야 하는데 시간없어 하지 못했다.

    [21:33:28]>cat process | head -100
    로드한 모델 vocab 최대값은 2611
    로드한 모델 vectror 크기는 5
    인티저 값은 ['AUX' 'DATA' 'EMER' 'END_A' 'END_B' 'ERROR' 'PROX_INTLK' 'SOL_A' 'SOL_B']
    출력 크기는 9
    Model: "sequential_1"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    embedding_1 (Embedding)      (None, 10, 5)             13055     
    _________________________________________________________________
    lstm_1 (LSTM)                (None, 32)                4864      
    _________________________________________________________________
    dropout_1 (Dropout)          (None, 32)                0         
    _________________________________________________________________
    dense_1 (Dense)              (None, 16)                528       
    _________________________________________________________________
    dropout_2 (Dropout)          (None, 16)                0         
    _________________________________________________________________
    dense_2 (Dense)              (None, 9)                 153       
    =================================================================
    Total params: 18,600
    Trainable params: 5,545
    Non-trainable params: 13,055
    _________________________________________________________________
    Train on 18757 samples, validate on 4690 samples
    Epoch 1/1000
     - 5s - loss: 2.1842 - acc: 0.0887 - val_loss: 2.1683 - val_acc: 0.0908
    Epoch 00001: acc improved from -inf to 0.08866, saving model to ./saved_network_weightv2.h5
    Epoch 2/1000
     - 4s - loss: 2.1073 - acc: 0.1674 - val_loss: 2.1181 - val_acc: 0.2066
    Epoch 00002: acc improved from 0.08866 to 0.16735, saving model to ./saved_network_weightv2.h5
    Epoch 3/1000
     - 4s - loss: 2.0133 - acc: 0.2660 - val_loss: 2.0448 - val_acc: 0.2652
    Epoch 02019: acc improved from 0.88084 to 0.88122, saving model to ./saved_network_weightv2.h5
    Epoch 02129: acc improved from 0.88122 to 0.88218, saving model to ./saved_network_weightv2.h5
    Epoch 02190: acc improved from 0.88218 to 0.88292, saving model to ./saved_network_weightv2.h5
    Epoch 02542: acc improved from 0.88292 to 0.88394, saving model to ./saved_network_weightv2.h5
    Epoch 02805: acc improved from 0.88394 to 0.88426, saving model to ./saved_network_weightv2.h5
    Epoch 02928: acc improved from 0.88426 to 0.88474, saving model to ./saved_network_weightv2.h5
    Epoch 03050: acc improved from 0.88474 to 0.88607, saving model to ./saved_network_weightv2.h5
    Epoch 03836: acc improved from 0.88607 to 0.88650, saving model to ./saved_network_weightv2.h5
    Epoch 03940: acc improved from 0.88650 to 0.88762, saving model to ./saved_network_weightv2.h5
    Epoch 04337: acc improved from 0.88762 to 0.88810, saving model to ./saved_network_weightv2.h5
    

    전에 텍스트 0이 인덱스 번호 47번인가 그랬다. 아무래도 이상하여 확이해보니 zero padding에는 0으로 넣었다. 0을 숫자로 처리할지, zero padding 값으로 처리할 지 결정해야 한다. 일단 검증할 경우에는 0을 강제로 입력했다.

    입력한 단어는 ['M', 'YD', '4', 'PIN', 'SHIFT', '1', '전진', '단', 'ZERO!!', 'ZERO!!']
    내 예상은 이번 텍스트가 0.87확율로 [4]임.
    인티저 값은 ['AUX' 'DATA' 'EMER' 'END_A' 'END_B' 'ERROR' 'PROX_INTLK' 'SOL_A' 'SOL_B']
    출력 크기는 9
    1/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    M
    69
    [69]
    2/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    YD
    1
    [69, 1]
    3/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    4
    11
    [69, 1, 11]
    4/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    10
    21
    [69, 1, 11, 21]
    5/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    ST
    0
    [69, 1, 11, 21, 0]
    6/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    PIN
    154
    [69, 1, 11, 21, 0, 154]
    7/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    후진
    42
    [69, 1, 11, 21, 0, 154, 42]
    8/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    단
    13
    [69, 1, 11, 21, 0, 154, 42, 13]
    9/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    ZERO!!
    zero index는 0
    [69, 1, 11, 21, 0, 154, 42, 13, 0]
    10/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 1, 11, 21, 0, 154, 42, 13, 0, 0]
    입력한 단어는 ['M', 'YD', '4', '10', 'ST', 'PIN', '후진', '단', 'ZERO!!', 'ZERO!!']
    내 예상은 이번 텍스트가 0.84확율로 [4]임.
    인티저 값은 ['AUX' 'DATA' 'EMER' 'END_A' 'END_B' 'ERROR' 'PROX_INTLK' 'SOL_A' 'SOL_B']
    출력 크기는 9
    1/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    M
    69
    [69]
    2/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    OTR
    91
    [69, 91]
    3/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    랙
    28
    [69, 91, 28]
    4/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    10
    21
    [69, 91, 28, 21]
    5/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    번방
    121
    [69, 91, 28, 21, 121]
    6/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    차종
    6
    [69, 91, 28, 21, 121, 6]
    7/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    20
    51
    [69, 91, 28, 21, 121, 6, 51]
    8/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    이상
    8
    [69, 91, 28, 21, 121, 6, 51, 8]
    9/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    ZERO!!
    zero index는 0
    [69, 91, 28, 21, 121, 6, 51, 8, 0]
    10/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 91, 28, 21, 121, 6, 51, 8, 0, 0]
    입력한 단어는 ['M', 'OTR', '랙', '10', '번방', '차종', '20', '이상', 'ZERO!!', 'ZERO!!']
    내 예상은 이번 텍스트가 1.00확율로 [5]임.
    인티저 값은 ['AUX' 'DATA' 'EMER' 'END_A' 'END_B' 'ERROR' 'PROX_INTLK' 'SOL_A' 'SOL_B']
    출력 크기는 9
    1/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    M
    69
    [69]
    2/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    70
    36
    [69, 36]
    3/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    ST
    0
    [69, 36, 0]
    4/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    주변
    292
    [69, 36, 0, 292]
    5/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    설비
    322
    [69, 36, 0, 292, 322]
    6/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    비상
    63
    [69, 36, 0, 292, 322, 63]
    7/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    정지
    73
    [69, 36, 0, 292, 322, 63, 73]
    8/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    ZERO!!
    zero index는 0
    [69, 36, 0, 292, 322, 63, 73, 0]
    9/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 36, 0, 292, 322, 63, 73, 0, 0]
    10/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 36, 0, 292, 322, 63, 73, 0, 0, 0]
    입력한 단어는 ['M', '70', 'ST', '주변', '설비', '비상', '정지', 'ZERO!!', 'ZERO!!', 'ZERO!!']
    내 예상은 이번 텍스트가 1.00확율로 [2]임.
    인티저 값은 ['AUX' 'DATA' 'EMER' 'END_A' 'END_B' 'ERROR' 'PROX_INTLK' 'SOL_A' 'SOL_B']
    출력 크기는 9
    1/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    M
    69
    [69]
    2/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    보조제어
    리스트에 없는 단어 입력함. 다시 입력하세요
    2/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    보조
    26
    [69, 26]
    3/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    제어
    38
    [69, 26, 38]
    4/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    GP
    228
    [69, 26, 38, 228]
    5/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    동작
    29
    [69, 26, 38, 228, 29]
    6/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    선택
    14
    [69, 26, 38, 228, 29, 14]
    7/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    16
    448
    [69, 26, 38, 228, 29, 14, 448]
    8/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    ZERO!!
    zero index는 0
    [69, 26, 38, 228, 29, 14, 448, 0]
    9/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 26, 38, 228, 29, 14, 448, 0, 0]
    10/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 26, 38, 228, 29, 14, 448, 0, 0, 0]
    입력한 단어는 ['M', '보조', '제어', 'GP', '동작', '선택', '16', 'ZERO!!', 'ZERO!!', 'ZERO!!']
    내 예상은 이번 텍스트가 1.00확율로 [0]임.
    인티저 값은 ['AUX' 'DATA' 'EMER' 'END_A' 'END_B' 'ERROR' 'PROX_INTLK' 'SOL_A' 'SOL_B']
    출력 크기는 9
    1/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    M
    69
    [69]
    2/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    70
    36
    [69, 36]
    3/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    RH
    9
    [69, 36, 9]
    4/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    피더
    457
    [69, 36, 9, 457]
    5/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    전후진
    리스트에 없는 단어 입력함. 다시 입력하세요
    5/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    LS
    75
    [69, 36, 9, 457, 75]
    6/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    이상
    8
    [69, 36, 9, 457, 75, 8]
    7/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    ZERO!!
    zero index는 0
    [69, 36, 9, 457, 75, 8, 0]
    8/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 36, 9, 457, 75, 8, 0, 0]
    9/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 36, 9, 457, 75, 8, 0, 0, 0]
    10/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 36, 9, 457, 75, 8, 0, 0, 0, 0]
    입력한 단어는 ['M', '70', 'RH', '피더', 'LS', '이상', 'ZERO!!', 'ZERO!!', 'ZERO!!', 'ZERO!!']
    내 예상은 이번 텍스트가 1.00확율로 [5]임.
    인티저 값은 ['AUX' 'DATA' 'EMER' 'END_A' 'END_B' 'ERROR' 'PROX_INTLK' 'SOL_A' 'SOL_B']
    출력 크기는 9
    1/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    M
    69
    [69]
    2/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    80
    209
    [69, 209]
    3/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    LH
    5
    [69, 209, 5]
    4/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    카울
    리스트에 없는 단어 입력함. 다시 입력하세요
    4/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    PIN
    154
    [69, 209, 5, 154]
    5/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    LS
    75
    [69, 209, 5, 154, 75]
    6/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    이상
    8
    [69, 209, 5, 154, 75, 8]
    7/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    ZERO!!
    zero index는 0
    [69, 209, 5, 154, 75, 8, 0]
    8/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 209, 5, 154, 75, 8, 0, 0]
    9/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 209, 5, 154, 75, 8, 0, 0, 0]
    10/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 209, 5, 154, 75, 8, 0, 0, 0, 0]
    입력한 단어는 ['M', '80', 'LH', 'PIN', 'LS', '이상', 'ZERO!!', 'ZERO!!', 'ZERO!!', 'ZERO!!']
    내 예상은 이번 텍스트가 1.00확율로 [5]임.
    인티저 값은 ['AUX' 'DATA' 'EMER' 'END_A' 'END_B' 'ERROR' 'PROX_INTLK' 'SOL_A' 'SOL_B']
    출력 크기는 9
    1/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    M
    69
    [69]
    2/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    60
    134
    [69, 134]
    3/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    RH
    9
    [69, 134, 9]
    4/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    CAM
    179
    [69, 134, 9, 179]
    5/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    YD
    1
    [69, 134, 9, 179, 1]
    6/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    제품
    50
    [69, 134, 9, 179, 1, 50]
    7/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    감지
    53
    [69, 134, 9, 179, 1, 50, 53]
    8/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    1
    7
    [69, 134, 9, 179, 1, 50, 53, 7]
    9/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    ZERO!!
    zero index는 0
    [69, 134, 9, 179, 1, 50, 53, 7, 0]
    10/10 단어 입력
    끝내려면 END!!를 입력
    마지막까지 0을 채우려면 ZERO!!를 입력
    zero index는 0
    [69, 134, 9, 179, 1, 50, 53, 7, 0, 0]
    입력한 단어는 ['M', '60', 'RH', 'CAM', 'YD', '제품', '감지', '1', 'ZERO!!', 'ZERO!!']
    내 예상은 이번 텍스트가 1.00확율로 [6]임.
    인티저 값은 ['AUX' 'DATA' 'EMER' 'END_A' 'END_B' 'ERROR' 'PROX_INTLK' 'SOL_A' 'SOL_B']
    출력 크기는 9
  • keras로 키워드 분석(5/5)

    간단한 데이터(1,200개)로 태그 분류기를 만들었다. validation을 0.2로 설정하면 val_acc가 0.3에서 움직이지 않는다. 그러나 0.1로 바꾸면 0.99까지 올라가는 마법을 볼수있다. 데이터가 적어 많이 입력하면 어떨지 잘 모르겠다. 똥을 먹으면 똥을 싼다. 똥을 음식으로 바꾸려면 물, 비료도 주고 햇빛도 잘 쬐여야한다. 농사나 손가락 노가다나 별 차이없어 보인다.

    모델을 저장해서, 다시 불러오는 방식으로 바꾸었다. 하도 많이 수정하다 보니 이 방식이 유리하다. 덕분에 디멘전 틀림을 찾았다. 16개 vector를 입력하는 구조에 6개만 입력해도 불만없이 잘? 예측했다. 저장한 모델을 불러오면 여기에서 체크를 한다.