0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DeepLearningで数字の識別をしたい

Posted at

現在、DeepLearningの勉強をしています。mnistサンプルコードを応用(?)して、自分で取り込んだ画像に書いてある数字を当てるモノを作ることを目的としました。
参考にしたサイトは[https://book.mynavi.jp/manatee/detail/id=89558]です。
この、「2018番目の画像データを推論してみる」の入力を自分で入手した画像の変えれば目的を達成できるのかと思い、以下のコードを作成しました。
以下が作成したコードです。

Deeplearning.py
from sklearn.datasets import fetch_mldata
 
mnist = fetch_mldata('MNIST original', data_home=".")
X = mnist.data / 255 
y = mnist.target
import matplotlib.pyplot as plt

 
plt.imshow(X[0].reshape(28, 28), cmap='gray')
print("This is {:.0f}".format(y[0]))
import torch
from torch.utils.data import TensorDataset, DataLoader
 
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=1/7, random_state=0)
 
X_train = torch.Tensor(X_train)
X_test = torch.Tensor(X_test)
y_train = torch.LongTensor(y_train)
y_test = torch.LongTensor(y_test)
 
ds_train = TensorDataset(X_train, y_train)
ds_test = TensorDataset(X_test, y_test)
 
loader_train = DataLoader(ds_train, batch_size=64, shuffle=True)
loader_test = DataLoader(ds_test, batch_size=64, shuffle=False)

from torch import nn
 
model = nn.Sequential()
model.add_module('fc1', nn.Linear(28*28, 100))
model.add_module('relu1', nn.ReLU())
model.add_module('fc2', nn.Linear(100, 100))
model.add_module('relu2', nn.ReLU())
model.add_module('fc3', nn.Linear(100, 10))
 
print(model)
from torch import optim
 
loss_fn = nn.CrossEntropyLoss()  

optimizer = optim.Adam(model.parameters(), lr=0.01)

from torch.autograd import Variable
 
def train(epoch):
    model.train()  
    for data, target in loader_train:
        data, target = Variable(data), Variable(target)  
        optimizer.zero_grad() 
        output = model(data)  
        loss = loss_fn(output, target) 
        loss.backward() 
        optimizer.step()  
    print("epoch{}:end\n".format(epoch))

def test():
    model.eval() 
    correct = 0
    for data, target in loader_test:
        data, target = Variable(data), Variable(target)  
        output = model(data)          
        pred = output.data.max(1, keepdim=True)[1]  
        correct += pred.eq(target.data.view_as(pred)).sum() 
    data_num = len(loader_test.dataset)  
    print('\n answer: {}/{} ({:.0f}%)\n'.format(correct,data_num, 100. * correct / data_num))
    
for epoch in range(3):
    train(epoch)
 
test()

import cv2
img1 = cv2.imread('awa.jpg')
gray = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)  
data = Variable(gray)
output = model(data)  
pred = output.data.max(0, keepdim=True)[1]  
print("I think {}".format(pred))

動かしたところ、以下のエラーが検出されました。
variable data has to be a tensor, but got numpy.ndarray

使用した画像はPNGイメージで、画像の大きさは225×225、サイズは1.63 KBです。

入力データがテンソルではないといわれているのだと思いますが、どのように形を合わせればよいかわかりません。
データセットの画像ではなく自分が用意した画像をDeepLearningにかけるというような内容のもので、よい文献等教えていただきたいです。
また、上記のエラーについても教えていただけると助かります。
まだプログラミング初心者であるため分かりずらい表記が多々あると思います。申し訳ありません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?