質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1495閲覧

chainerでvalidationが実装できません。

ih_hakase

総合スコア4

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/22 08:54

編集2019/10/24 13:19

前提・実現したいこと

Chainerを使い、超解像画像生成のためのCNNを作成しています。
作成中のプログラムにvalidationを実装しようとしましたが、エラーが出てしまいました。
エラー文を調べたところ、int型にすべき所にImageが入っている、とのことでしたが、どこをどう直したら良いのか分かりません。(「#追加」がついている部分に原因があるのだと思います)
解決方法が分かる方がいましたら、是非教えて下さい。

発生している問題・エラーメッセージ

Exception in main training loop: int() argument must be a string, a bytes-like object or a number, not 'Image' Traceback (most recent call last):###########################.] 99.93% File "/usr/local/lib/python3.5/dist-packages/chainer/training/trainer.py", line 319, in run entry.extension(self)imated time to finish: 0:31:41.206374. File "/usr/local/lib/python3.5/dist-packages/chainer/training/extensions/evaluator.py", line 161, in __call__ result = self.evaluate() File "/usr/local/lib/python3.5/dist-packages/chainer/training/extensions/evaluator.py", line 216, in evaluate self.converter, batch, self.device) File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 73, in _call_converter return converter(batch, device) File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 58, in wrap_call return func(*args, **kwargs) File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 239, in concat_examples return to_device(device, _concat_arrays(batch, padding)) File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 246, in _concat_arrays arrays = numpy.asarray(arrays) File "/usr/local/lib/python3.5/dist-packages/numpy/core/numeric.py", line 501, in asarray return array(a, dtype, copy=False, order=order) Will finalize trainer extensions and updater before reraising the exception. Traceback (most recent call last): File "train.py", line 201, in <module> trainer.run() File "/usr/local/lib/python3.5/dist-packages/chainer/training/trainer.py", line 349, in run six.reraise(*exc_info) File "/usr/lib/python3/dist-packages/six.py", line 686, in reraise raise value File "/usr/local/lib/python3.5/dist-packages/chainer/training/trainer.py", line 319, in run entry.extension(self) File "/usr/local/lib/python3.5/dist-packages/chainer/training/extensions/evaluator.py", line 161, in __call__ result = self.evaluate() File "/usr/local/lib/python3.5/dist-packages/chainer/training/extensions/evaluator.py", line 216, in evaluate self.converter, batch, self.device) File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 73, in _call_converter return converter(batch, device) File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 58, in wrap_call return func(*args, **kwargs) File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 239, in concat_examples return to_device(device, _concat_arrays(batch, padding)) File "/usr/local/lib/python3.5/dist-packages/chainer/dataset/convert.py", line 246, in _concat_arrays arrays = numpy.asarray(arrays) File "/usr/local/lib/python3.5/dist-packages/numpy/core/numeric.py", line 501, in asarray return array(a, dtype, copy=False, order=order) TypeError: int() argument must be a string, a bytes-like object or a number, not 'Image'

該当のソースコード

import chainer import chainer.functions as F import chainer.links as L from chainer import training, datasets, iterators, optimizers from chainer import report from chainer.training import extensions from chainer.datasets import LabeledImageDataset import numpy as np import os import math from PIL import Image from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True batch_size = 128 uses_device = 0 # GPU#0を使用 # GPU使用時とCPU使用時でデータ形式が変わる if uses_device >= 0: import cupy as cp import chainer.cuda else: cp = np class SuperResolution_NN(chainer.Chain): def __init__(self): # 重みデータの初期値を指定する w1 = chainer.initializers.Normal(scale=0.0378, dtype=None) w2 = chainer.initializers.Normal(scale=0.3536, dtype=None) w3 = chainer.initializers.Normal(scale=0.1179, dtype=None) w4 = chainer.initializers.Normal(scale=0.189, dtype=None) w5 = chainer.initializers.Normal(scale=0.0001, dtype=None) super(SuperResolution_NN, self).__init__() # 全ての層を定義する with self.init_scope(): self.c1 = L.Convolution2D(1, 56, ksize=5, stride=1, pad=0, initialW=w1) self.l1 = L.PReLU() self.c2 = L.Convolution2D(56, 12, ksize=1, stride=1, pad=0, initialW=w2) self.l2 = L.PReLU() self.c3 = L.Convolution2D(12, 12, ksize=3, stride=1, pad=1, initialW=w3) self.l3 = L.PReLU() self.c4 = L.Convolution2D(12, 12, ksize=3, stride=1, pad=1, initialW=w3) self.l4 = L.PReLU() self.c5 = L.Convolution2D(12, 12, ksize=3, stride=1, pad=1, initialW=w3) self.l5 = L.PReLU() self.c6 = L.Convolution2D(12, 12, ksize=3, stride=1, pad=1, initialW=w3) self.l6 = L.PReLU() self.c7 = L.Convolution2D(12, 56, ksize=1, stride=1, pad=1, initialW=w4) self.l7 = L.PReLU() self.c8 = L.Deconvolution2D(56, 1, ksize=9, stride=3, pad=4, initialW=w5) def __call__(self, x, t=None, train=True): h1 = self.l1(self.c1(x)) h2 = self.l2(self.c2(h1)) h3 = self.l3(self.c3(h2)) h4 = self.l4(self.c4(h3)) h5 = self.l5(self.c5(h4)) h6 = self.l6(self.c6(h5)) h7 = self.l7(self.c7(h6)) h8 = self.c8(h7) loss = F.mean_squared_error(h8, t) report ({ 'loss' : loss }, self ) # 損失か結果を返す return F.mean_squared_error(h8, t) if train else h8 # カスタムUpdaterのクラス class SRUpdater(training.StandardUpdater): def __init__(self, train_iter, optimizer, device): super(SRUpdater, self).__init__( train_iter, optimizer, device=device ) def update_core(self): # データを1バッチ分取得 batch = self.get_iterator('main').next() # Optimizerを取得 optimizer = self.get_optimizer('main') # バッチ分のデータを作る x_batch = [] # 入力データ y_batch = [] # 正解データ for img in batch: # 高解像度データ hpix = np.array(img, dtype=np.float32) / 255.0 y_batch.append([hpix[:,:,0]]) # Yのみの1chデータ # 低解像度データを作る low = img.resize((16, 16), Image.NEAREST) lpix = np.array(low, dtype=np.float32) / 255.0 x_batch.append([lpix[:,:,0]]) # Yのみの1chデータ # numpy or cupy配列にする x = cp.array(x_batch, dtype=cp.float32) y = cp.array(y_batch, dtype=cp.float32) # ニューラルネットワークを学習させる optimizer.update(optimizer.target, x, y) # ニューラルネットワークを作成 model = SuperResolution_NN() if uses_device >= 0: # GPUを使う chainer.cuda.get_device_from_id(0).use() chainer.cuda.check_cuda_available() # GPU用データ形式に変換 model.to_gpu() images_train = [] # 全てのファイル fs = os.listdir('images/train') for fn in fs: # 画像を読み込み img = Image.open('images/train/' + fn).resize((320, 320)).convert('YCbCr') cur_x = 0 while cur_x <= 320 - 40: cur_y = 0 while cur_y <= 320 - 40: # 画像から切りだし rect = (cur_x, cur_y, cur_x+40, cur_y+40) cropimg = img.crop(rect).copy() # 配列に追加 images_train.append(cropimg) # 次の切りだし場所へ cur_y += 20 cur_x += 20 images_val = [] #追加 # 全てのファイル fs = os.listdir('images/val') for fn in fs: # 画像を読み込み img = Image.open('images/val/' + fn).resize((320, 320)).convert('YCbCr') cur_x = 0 while cur_x <= 320 - 40: cur_y = 0 while cur_y <= 320 - 40: # 画像から切りだし rect = (cur_x, cur_y, cur_x+40, cur_y+40) cropimg = img.crop(rect).copy() # 配列に追加 images_val.append(cropimg) # 次の切りだし場所へ cur_y += 20 cur_x += 20 # 繰り返し条件を作成する train_iter = iterators.SerialIterator(images_train, batch_size, shuffle=True) val_iter = iterators.SerialIterator(images_val, batch_size, shuffle=False, repeat=False) #追加 # 誤差逆伝播法アルゴリズムを選択する optimizer = optimizers.Adam() optimizer.setup(model) # デバイスを選択してTrainerを作成する updater = SRUpdater(train_iter, optimizer, device=uses_device) trainer = training.Trainer(updater, (2000, 'epoch'), out="result") # 学習の進展を表示するようにする trainer.extend(extensions.ProgressBar()) # モデルのtrainプロパティをFalseに設定してvalidationするextension trainer.extend(extensions.Evaluator(val_iter, model,device=uses_device)) #追加 trainer.extend(extensions.PrintReport(['epoch', 'main/loss', 'validation/main/loss', 'elapsed_time'])) #追加 #学習のlogを保存する trainer.extend(extensions.LogReport()) # 損失関数の値をグラフにする機能 if extensions.PlotReport.available(): trainer.extend(extensions.PlotReport(['main/loss'], x_key='epoch', file_name='loss.png')) trainer.extend(extensions.PlotReport(['validation/main/loss'], x_key='epoch', file_name='val_loss.png')) #追加 # 中間結果を保存する n_save = 0 @chainer.training.make_extension(trigger=(1000, 'epoch')) def save_model(trainer): # NNのデータを保存 global n_save n_save = n_save+1 chainer.serializers.save_hdf5( 'net/fsrcnn-'+str(n_save)+'.hdf5', model ) trainer.extend(save_model) # 機械学習を実行する trainer.run() # 学習結果を保存する chainer.serializers.save_hdf5( 'net/fsrcnn.hdf5', model )

試したこと

補足情報(FW/ツールのバージョンなど)

Python 3.5.2
chainer 6.4.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

int型にすべき所にImageが入っている

いえ、int() の引数はstringかbyteの様なオブジェクトか、numberであってimageではありません。

投稿2019/10/22 11:46

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ih_hakase

2019/10/22 13:34

自分の解釈が間違っていたようです。ご指摘ありがとうございます。 ただ、それを踏まえた上でも、プログラムをどのように直して良いのか分かりません。 申し訳ありませんが、プログラムの改善点についてご指摘いただけたら幸いです。
Q71

2019/10/22 21:51

該当箇所がわからなかったので、書きませんでした。iPhoneで見ているのですが、その様なエラーはどこで発生するのでしょう? トレーナーができているなら、バリデーターも同じように作成できるのでは?
ih_hakase

2019/10/23 10:56

私も、エラーがどこで発生しているのか分からず手が止まっています。 validationを実装しようと思い、元々動いていたプログラムに「#追加」とコメントした部分を追加しましたところ、上記のようなエラーが出た次第です。 個人的には、バリデーションデータを読み込むところでエラーが発生しているのではないか、と当たりをつけているのですが、未だに改善出来ていません……
Q71

2019/10/23 12:17

エラー文は、ここに書いてあるものが全てですか?実行のスタックトーレスは出ていませんか?
ih_hakase

2019/10/24 13:23 編集

のせているエラー文が全文ではなかったため、「発生している問題・エラーメッセージ」の欄に追記させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問