[파이톤] 신경망을 통해 소라 아가씨의 가위바위보를 예측합니다.

카탈로그

  • 개시하다
  • 소스 코드
  • 간단히 설명하다
  • 결실
  • 최후
  • 참조 링크
  • 개시하다


    나는 방금'LSTM의 소라 아가씨에 대한 가위바위보 예측'이라는 제목의 글을 썼는데 바로 다른 모델을 시도했기 때문에 결과를 썼다.

    소스 코드

    import numpy as np
    import pandas as pd
    from keras.layers import Activation, Dense
    from keras.models import Sequential
    
    data_file = 'サザエさんじゃんけん.tsv'
    res_file = 'small_neural'
    
    
    def shuffle_lists(list1, list2):
        '''リストをまとめてシャッフル'''
        seed = np.random.randint(0, 1000)
        np.random.seed(seed)
        np.random.shuffle(list1)
        np.random.seed(seed)
        np.random.shuffle(list2)
    
    
    def get_data():
        '''データ作成'''
        df = pd.read_csv(data_file, sep='\t',
                         usecols=['rock', 'scissors', 'paper'])
        X_data = [[0, 0, 0]]
        for row in df.values:
            data = [d + 1 for d in X_data[-1]]
            data[row.argmax()] = 0
            X_data.append(data)
    
        # numpy.array型に変換
        # X_data = np.array(X_data[:-1])
        # y_data = np.array(df.values)
        X_data = np.array(X_data[-501:-1])
        y_data = np.array(df.values[-500:])
    
        last_data = np.array(X_data[-1:])
    
        # 正規化
        X_data = X_data.astype(np.float32)
        last_data = last_data.astype(np.float32)
        X_data /= 255.0
        last_data /= 255.0
    
        # シャッフル
        shuffle_lists(X_data, y_data)
    
        return X_data, y_data, last_data
    
    
    def get_model():
        '''モデルを構築'''
        model = Sequential()
        model.add(Dense(32, input_shape=(3,)))
        model.add(Activation('relu'))
        model.add(Dense(32))
        model.add(Activation('relu'))
        model.add(Dense(32))
        model.add(Activation('relu'))
        model.add(Dense(3))
        model.add(Activation('softmax'))
        model.compile(optimizer='adam',
                      loss='categorical_crossentropy',
                      metrics=['accuracy'])
        return model
    
    
    def pred(model, X, Y, label):
        '''正解率 出力'''
        predictX = model.predict(X)
        correct = 0
        for real, predict in zip(Y, predictX):
            if real.argmax() == predict.argmax():
                correct += 1
        correct = correct / len(Y)
        print(label + '正解率 : %02.2f ' % correct)
    
    
    def main():
        X_data, y_data, last_data = get_data()
    
        # データ分割
        mid = int(len(y_data) * 0.7)
        train_X, train_y = X_data[:mid], y_data[:mid]
        test_X, test_y = X_data[mid:], y_data[mid:]
    
        # 学習
        model = get_model()
        hist = model.fit(train_X, train_y, epochs=1000, batch_size=8,
                         validation_data=(test_X, test_y))
    
        # 正解率出力
        pred(model, train_X, train_y, 'train')
        pred(model, test_X, test_y, 'test')
    
        # 来週の手
        next_hand = model.predict(last_data)
        print(next_hand[0])
        hands = ['グー', 'チョキ', 'パー']
        print('来週の手 : ' + hands[next_hand[0].argmax()])
    
    
    if __name__ == '__main__':
        main()
    

    간단히 설명하다


    이번에는 간단한 신경 모형으로 공부를 해 보았다.
    데이터는 각자의 손이 나오지 않은 횟수다.
    소라 가위바위보.tsv는 다음과 같은 형식으로 데이터를 총결하였다.
    소라 가위바위보.tsv
    year    month   day rock    scissors    paper
    1991    11  10  0   1   0
    1991    11  17  1   0   0
    1991    11  24  1   0   0
    ...
    
    그리고 데이터를 다음과 같이 성형한다
    [[0 0 0] <- 最初はすべて0
     [1 0 1] <- チョキが出たので1番目を0に。ほかは+1
     [0 1 2] <- グーが出たので0番目を0に。ほかは+1
     ...
    
    데이터를 모두 사용하면 왠지 정밀도가 떨어지기 때문에 최근의 100회만 사용했다.

    결실


    매개 변수와 층수를 바꾸어 보아라. 가장 좋은 결과는 바로 이것이다.
  • 출력
  • train正解率 : 0.61
    test正解率 : 0.58
    [0.17965864 0.07733747 0.7430039 ]
    来週の手 : パー
    
  • 차트

  • 최후


    정밀도와LSTM 시는 큰 변화가 없지만 다음 주 손은'파라'가 된다.다만, 매개 변수를 만지작거리면 때때로'돌'이 나오기도 한다.어느 것을 믿으면 좋을까 orz)
    사용한 내력에 따라 개선할 여지가 있다고 생각합니다. 꼭 도전해 주십시오.
    어쨌든 이번 주 소라 아가씨가 기대됩니다.

    추기


    (18/08/19)
    아쉽게도 이번에는 없어요.(정답은'돌')

    참조 링크


    LSTM의 소라 아가씨에 대한 가위바위보 예측

    좋은 웹페이지 즐겨찾기