現在、DeepLearningの勉強をしています。mnistサンプルコードを応用(?)して、自分で取り込んだ画像に書いてある数字を当てるモノを作ることを目的としました。
参考にしたサイトは[https://book.mynavi.jp/manatee/detail/id=89558]です。
この、「2018番目の画像データを推論してみる」の入力を自分で入手した画像の変えれば目的を達成できるのかと思い、以下のコードを作成しました。
以下が作成したコードです。
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にかけるというような内容のもので、よい文献等教えていただきたいです。
また、上記のエラーについても教えていただけると助かります。
まだプログラミング初心者であるため分かりずらい表記が多々あると思います。申し訳ありません。