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

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

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

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

リサイズ

コントロール、ウィンドウ、フォームやスクリーンのサイズ変更を指します。

機械学習

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

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

Q&A

0回答

1623閲覧

ディープラーニングモデルの画像サイズの変更について

tomomina

総合スコア0

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

リサイズ

コントロール、ウィンドウ、フォームやスクリーンのサイズ変更を指します。

機械学習

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

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

0グッド

0クリップ

投稿2020/11/28 03:28

編集2020/11/29 00:20

Pythonを使って深層学習を勉強している初心者です。

resnet101を用いて、ファインチューニングを行いたいと考えています。(resnet101の方は、torchvision で提供されている学習済みのモデルを使用しております。)前処理として、手元にある画像サイズ640×480を、画像サイズ、224×224に変更する必要があります。画像は、音をスペクトログラムにしたものです。そのため、横軸に時間、縦軸に周波数、色は信号の強さを表しており、リサイズを行った場合、画像にある情報が潰れてしまいます。これを避けるために、前処理で画像サイズを変更しない方法や画像にある情報を潰さずに済む方法がありましたら、教えていただけると助かります。

参考させていただいたサイト: https://blog.brainpad.co.jp/entry/2018/04/17/143000

スペクトログラム
イメージ説明
スペクトログラムを224×224にリサイズし、色情報の規格化を行った画像。
イメージ説明

Python

1 2# 入力画像の前処理をするクラス 3# 訓練時と推論時で処理が異なる 4 5 6class ImageTransform(): 7 """ 8 画像の前処理クラス。訓練時、検証時で異なる動作をする。 9 画像のサイズをリサイズし、色を標準化する。 10 訓練時はRandomResizedCropとRandomHorizontalFlipでデータオーギュメンテーションする。 11 12 13 Attributes 14 ---------- 15 resize : int 16 リサイズ先の画像の大きさ。 17 mean : (R, G, B) 18 各色チャネルの平均値。 19 std : (R, G, B) 20 各色チャネルの標準偏差。 21 """ 22 23 def __init__(self, resize, mean, std): 24 self.data_transform = { 25 'train': transforms.Compose([ 26 transforms.Resize((224,224)), 27 #transforms.RandomHorizontalFlip(), # データオーギュメンテーション 28 transforms.ToTensor(), # テンソルに変換 29 transforms.Normalize(mean, std) # 標準化 30 ]), 31 'val': transforms.Compose([ 32 transforms.Resize((224,224)), 33 transforms.ToTensor(), # テンソルに変換 34 transforms.Normalize(mean, std) # 標準化 35 ]), 36 } 37 38 39 def __call__(self, img, phase='train'): 40 """ 41 Parameters 42 ---------- 43 phase : 'train' or 'val' 44 前処理のモードを指定。 45 """ 46 return self.data_transform[phase](img) 47 48# 訓練時の画像前処理の動作を確認 49# 実行するたびに処理結果の画像が変わる 50 51# 1. 画像読み込み 52image_file_path = './data/rockk.00000.jpg' 53img = Image.open(image_file_path) # [高さ][幅][色RGB] 54 55# 2. 元の画像の表示 56plt.imshow(img) 57plt.show() 58 59# 3. 画像の前処理と処理済み画像の表示 60size = 224 61mean = (0.485, 0.456, 0.406) 62std = (0.229, 0.224, 0.225) 63 64transform = ImageTransform(size, mean, std) 65img_transformed = transform(img, phase="train") # torch.Size([3, 224, 224]) 66 67# (色、高さ、幅)を (高さ、幅、色)に変換し、0-1に値を制限して表示 68img_transformed = img_transformed.numpy().transpose((1, 2, 0)) 69img_transformed = np.clip(img_transformed, 0, 1) 70plt.imshow(img_transformed) 71plt.show() 72 73 74 75 76 77#resnet101を用いたファインチューニング 78 79use_pretrained = True # 学習済みのパラメータを使用 80net = models.resnet101(pretrained=use_pretrained) 81 82 83net.fc = nn.Linear(in_features=2048, out_features=10) 84print(net) 85# 訓練モードに設定 86net.train() 87 88print('ネットワーク設定完了:学習済みの重みをロードし、訓練モードに設定しました') 89 90 91# 損失関数の設定 92criterion = nn.CrossEntropyLoss() 93 94 95# ファインチューニングで学習させるパラメータを、変数params_to_updateの1~3に格納する 96 97params_to_update_1 = [] 98params_to_update_2 = [] 99params_to_update_3 = [] 100 101# 学習させる層のパラメータ名を指定 102update_param_names_1 = ["layer"] 103update_param_names_2 = ["downsample"] 104update_param_names_3 = ["fc.weight", "fc.bias"] 105update_param_names_4 = ["bn"] 106update_param_names_5 = ["downsample.1.weight"] 107update_param_names_6 = ["conv1.weight"] 108update_param_names_7 = ["bn1.weight","bn1.bias"] 109 110# パラメータごとに各リストに格納する 111for name, param in net.named_parameters(): 112 print(name) 113 if update_param_names_1[0] in name:# layer:conv 114 if update_param_names_2[0] in name:# downsample:conv 115 param.requires_grad = False 116 print("勾配計算なし。学習しない:", name) 117 else: 118 param.requires_grad = True 119 params_to_update_1.append(param) 120 print("params_to_update_1に格納:", name) 121 122 elif name in update_param_names_6: 123 param.requires_grad = True 124 params_to_update_2.append(param) 125 print("params_to_update_2に格納:", name) 126 127 elif name in update_param_names_7: 128 param.requires_grad = True 129 params_to_update_2.append(param) 130 print("params_to_update_2に格納:", name) 131 132 133 elif name in update_param_names_3:# fc:conv 134 param.requires_grad = True 135 params_to_update_3.append(param) 136 print("params_to_update_3に格納:", name) 137 138 elif name in update_param_names_4: 139 param.requires_grad = False 140 print("bn: 勾配計算なし。学習しない:", name) 141 142 143 else: 144 param.requires_grad = False 145 print("勾配計算なし。学習しない:", name) 146 147 148 149# 最適化手法の設定 150# 1e-4 = 1*10^-4 , 5e-4 = 5*10^-4 151 152optimizer = optim.Adam([ 153 {'params': params_to_update_1, 'lr': 1e-4}, 154 {'params': params_to_update_2, 'lr': 1e-4}, 155 {'params': params_to_update_3, 'lr': 1e-3} 156]) 157

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

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

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

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

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

toast-uz

2020/11/28 04:21

現状のコード、元の画像、つぶれた画像などを、情報提示お願いします。
tomomina

2020/11/28 09:46

コード、元の画像、潰れた画像を載せておきました。よろしくお願いいたします。
toast-uz

2020/11/28 12:28 編集

ありがとうございます。前処理だけでなく、resnet101を用いてファインチューニングしているコードも提示いただけますか? 前処理で解決するのは困難だと思いますので、モデル側でなんとかならないかを考えたいと思います。また、音声をstft変換して画像とみなして2次元CNNにかける、というのは、そもそも手法として有効なのかよくわかっていません。参考となるサイト等があれば教えください。犬とか猫とかの画像を分類するのと、同じ手法で質問者様が示された画像を分類するのって、分類問題の定義にもよりますが、難しそうに思います。
tomomina

2020/11/29 00:35

検証データの正答率はあまり良い数値ではないため、難しいと感じています。 resnet101を用いて、ファインチューニングを行ったコード及び、参考にさせていただいたサイトのURLを載せておきました。また、resnet101の方は、torchvision で提供されている学習済みのモデルを使用しております。よろしくお願いいたします。
toast-uz

2020/11/29 01:10 編集

ありがとうございます。参考リンクとさらにそれが引用している論文を確認しました。CNNの特性から考えて、モヤっとして言語化が難しい、音楽の雰囲気や長調短調の分類などには、有効かと思います。 ただし、いずれも、resnetを用いておらず、conv層・dense層を数層積み重ねているように見えます。質問者様がresnetを使いたい理由は何でしょうか?本分野に対してresnetをファインチューニングしている参考サイトを教えてください。 1つ前にコメントしたとおり、犬とか猫とかを学習済のモデル(resnet)に対して、今回のような特殊画像を使ってファインチューニングするのは、逆効果であるように思います。一般的なCNNが有効である場合がある、というのは参考サイトを見て理解したのですが、resnetをファインチューニングするのが有効とは思えません。224*224にしなければいけない理由がresnetに合わせるためですので、有効ではない手段に捕われて、余計な課題を発生させているように思えました。
tomomina

2020/11/29 02:02

特殊画像のファインチューニングは逆効果になることが良くわかりました、ありがとうございます。今回ファインチューニングを行った経緯といたしましては、データセットの数が少ないため、少量のデータからでもディープラーニングモデルが構築できるファインチューニングを行ない精度の良いものが出来ないかと試してみた次第です。resnet101を使いたい理由といたしましては、データセットをスペクトログラムにして、resnetやVGG、EfficientNet、Vision Transformerの転移学習を行った際、一番精度が良かったため使用しました。また、本分野でのresnetのファインチューニングは参考にさせていただいたサイトはなく、推測でファインチューニングを行いました。
toast-uz

2020/11/29 04:02 編集

resnetを使わずに、参考リンクや論文と同様にCNNを自分で層構成してやってみたのでしょうか? それと、画像を縮小してresnet101+ファインチューニングをされた結果を、比較していましたら、教えてください。 なお、参考リンクでは、1分間隔のデータに分割することで、データセットが少ないのを補った、と書かれています。質問者様がやりたいことのデータ種別と分類が分かっておりませんが、使える手法かもしれません。
tomomina

2020/11/30 02:44

ありがとうございます、参考にさせていただきます。CNNを自分で層構成して行っていません。そのため、比較はできていません。また、resnet101+ファインチューニングでは、音楽ジャンル(ロック、ジャズなど)の判別を行っており、10ジャンルの判別では、検証データの正答率は7割弱ほどになります。
toast-uz

2020/11/30 03:50

なるほど。やりたいこととしては参考リンクと同様ですね。CNNを自分で層構成する基本のやり方は、ベンチマークとして確認したほうがよいです。resnet101を使うやり方で、ベンチマークよりも高性能な方法を編み出せたら、論文が書けますね笑。 発想としては、時間軸・周波数軸をもっと細切れにして224*224におさまるサイズにして学習させ、出た結果をアンサンブルする、というのはどうでしょうか。周波数方向の分割は、学習モデルを別にした方がよいかと思います。
tomomina

2020/11/30 23:17

ありがとうございます、ベンチマークとしてCNNを作成したいと思います。深層学習の勉強を始めたばかりで、出た結果をアンサンブルする方法が思いつかないため、アンサンブル方法について教えていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問