我在特森福罗验证了AI能否击败希卡金邦·贾肯。

如果你因为年收入或个性而输给他,
我希望你至少能赢。

因此,
这一次,我们将使用TensorFlow,使AI赢得希卡金邦邦肯与
图像分类器。

要做什么准备

如何使AI赢得希卡金邦邦肯

让AI学习健健

首先,下载一个 zip 文件,该文件中有 Janken 的图像。

!wget --no-check-certificate 
    https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps.zip 
    -O /tmp/rps.zip

!wget --no-check-certificate 
    https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps-test-set.zip 
    -O /tmp/rps-test-set.zip

`
–2022-09-19 05:51:56– https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps.zip
Resolving storage.googleapis.com (storage.googleapis.com)… 172.217.194.128, 142.251.10.128, 142.251.12.128, …
Connecting to storage.googleapis.com (storage.googleapis.com)|172.217.194.128|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: 200682221 (191M) [application/zip]
Saving to: ‘/tmp/rps.zip’

/tmp/rps.zip 100%[===================>] 191.38M 40.7MB/s in 4.7s

2022-09-19 05:52:02 (40.7 MB/s) – ‘/tmp/rps.zip’ saved [200682221/200682221]

–2022-09-19 05:52:02– https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps-test-set.zip
Resolving storage.googleapis.com (storage.googleapis.com)… 172.217.194.128, 142.251.10.128, 142.251.12.128, …
Connecting to storage.googleapis.com (storage.googleapis.com)|172.217.194.128|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: 29516758 (28M) [application/zip]
Saving to: ‘/tmp/rps-test-set.zip’

/tmp/rps-test-set.z 100%[===================>] 28.15M –.-KB/s in 0.1s

2022-09-19 05:52:02 (204 MB/s) – ‘/tmp/rps-test-set.zip’ saved [29516758/29516758]
`

解压缩 zip 并将其保存到 /tmp/目录。

import os
import zipfile

local_zip = '/tmp/rps.zip'
zip_ref = zipfile. ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp/')
zip_ref.close()

local_zip = '/tmp/rps-test-set.zip'
zip_ref = zipfile. ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp/')
zip_ref.close()

将学习用的 Janken 图像分类为
“古”、“乔基”和“Pper”。

rock_dir = os.path.join('/tmp/rps/rock')
paper_dir = os.path.join('/tmp/rps/paper')
scissors_dir = os.path.join('/tmp/rps/scissors')

print('total training rock images:', len(os.listdir(rock_dir)))
print('total training paper images:', len(os.listdir(paper_dir)))
print('total training scissors images:', len(os.listdir(scissors_dir)))

rock_files = os.listdir(rock_dir)
print(rock_files[:10])

paper_files = os.listdir(paper_dir)
print(paper_files[:10])

scissors_files = os.listdir(scissors_dir)
print(scissors_files[:10])

total training rock images: 840 total training paper images: 840 total training scissors images: 840 ['rock01-027.png', 'rock05ck01-108.png', ' rock05ck01-090.png', 'rock01-040.png', 'rock02-108.png', 'rock02-022.png', 'rock01-060.png', 'rock07-k03-061.png', 'rock06ck02-032.png', 'rock03-069.png'] ['paper05-114.png', 'paper03-099.png', 'paper06-011.png', 'paper07-053.png ', 'paper03-040.png', 'paper07-040.png', 'paper05-082.png', 'paper07-116.png', 'paper01-041.png', ' paper07-035.png'] ['scissors04-034.png', 'testscissors01-033.png', 'testscissors03-058.png', 'testscissors01-087.png', ' testscissors03-044.png', 'testscissors01-040.png', 'scissors04-080.png', 'scissors03-069.png', 'testscissors03-088.png', 'scissors04-038.png']

绘制。

%matplotlib inline

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

pic_index = 2

next_rock = [os.path.join(rock_dir, fname) 
                for fname in rock_files[pic_index-2:pic_index]]
next_paper = [os.path.join(paper_dir, fname) 
                for fname in paper_files[pic_index-2:pic_index]]
next_scissors = [os.path.join(scissors_dir, fname) 
                for fname in scissors_files[pic_index-2:pic_index]]

for i, img_path in enumerate(next_rock+next_paper+next_scissors):
  img = mpimg.imread(img_path)
  plt.imshow(img)
  plt.axis('Off')
  plt.show()

学习。

import tensorflow as tf
import keras_preprocessing
from keras_preprocessing import image
from keras_preprocessing.image import ImageDataGenerator

TRAINING_DIR = "/tmp/rps/"
training_datagen = ImageDataGenerator(
      rescale = 1./255,
        rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')

VALIDATION_DIR = "/tmp/rps-test-set/"
validation_datagen = ImageDataGenerator(rescale = 1./255)

• 创建学习数据
train_generator = training_datagen.flow_from_directory(
    TRAINING_DIR,
    target_size=(150,150),
    class_mode='categorical',
  batch_size=126
)

• 创建验证数据
validation_generator = validation_datagen.flow_from_directory(
    VALIDATION_DIR,
    target_size=(150,150),
    class_mode='categorical',
  batch_size=126
)

• 定义神经网络
model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(3, activation='softmax')
])

• 摘要
model.summary()

• 编译神经网络
model.compile(loss = 'categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

• 学习
history = model.fit(train_generator, epochs=25, steps_per_epoch=20, validation_data = validation_generator, verbose = 1, validation_steps=3)

model.save("rps.h5")

学习结束了。

与希卡金合作,让 AI 获胜

现在上传文件,并输出你的手赢得希卡金。

import numpy as np
from google.colab import files
from keras.preprocessing import image

uploaded = files.upload()

for fn in uploaded.keys():
  path = fn
  img = image.load_img(path, target_size=(150, 150))
  x = image.img_to_array(img)
  x = np.expand_dims(x, axis=0)

images = np.vstack([x])
  classes = model.predict(images, batch_size=10)
  hikakin_result = np.array(classes[0])
  paper = np.array([1, 0, 0])
  rock =  np.array([0, 1, 0])
  scissors =  np.array([0, 0, 1])
  if hikakin_result[0] == paper[0]:
    print("✌")
  if hikakin_result[1] == rock[1]:
    print("🖐")
  if hikakin_result[2] == scissors[2]:
    print("✊")

让我们做上述。
我试着在第十轮中打架。

Round 1

✊ AI 已发出。
因此,第一个赔根是AI的胜利。

Round 2

🖐 AI 已发出。
因此,第二场是AI的胜利。

Round 3

🖐 AI 已发出。
因此,第3号是爱子。

Round 4

✊ AI 已发出。
因此,第 4 个角色是 AI 的失败者。

当 AI 被打出来时,它很弱吗?

Round 5

第三次诚实?

✌ AI 已发出。
因此,第 5 行是 AI 的胜利。

最后,我们赢得了标准杆。

Round 6

🖐 AI 已发出。
因此,第 6 行是 AI 的胜利。

Round 7

✌ AI 已发出。
因此,第 7 行是 AI 的胜利。

Round 8

✌ AI 已发出。
因此,第 8 行是 AI 的失败。

我不应该被陨石撞倒。

Round 9

✌ AI 已发出。
因此,第9号是AI的胜利。

Round 10

🖐 AI 已发出。
因此,第 10 个角色是 AI 的失败者。

结果

RoundAI希卡金
1是的,我是
2是的,我是
三。
4个是的,我是
5是的,我是
六。是的,我是
七。是的,我是
八。是的,我是
九。是的,我是
十。是的,我是

AI 以 70% 的赔率赢得希卡金邦肯。


深度技术杂志在这里“深度杂志”

https://deep-recommend.com/magazine