前提・実現したいこと
dncnn(denoising cnn)のネットワークを使って画像データのノイズ除去を行いたいです。
実際に学習を行って、結果を出力させていますが、理想とは程遠い画像が出来上がります。
原因が全く分からないため、考えられうることをご教示頂きたいです。
(画像データは、サイズが63×85の数値データでcsvファイルになっており、そのまま学習を行い、最後にmatplotlibのcontourfで等高線画像として保存しています。)
発生している問題・エラーメッセージ
645枚分のデータを用いて学習を行ったのち、
model.predictで結果を出力させたところ、学習させたものとは全く違うのっぺりした画像が出来上がります。
該当のソースコード
python
1#モジュールの読み込み 2import numpy as np 3import glob 4import pandas as pd 5from sklearn.model_selection import train_test_split 6 7#ファイルの読み込み 8labelfiles = glob.glob("c:/keraslab/dataset/label/*.csv") 9label110_csv=[] 10for labelfile in labelfiles: 11 label110_csv.append(np.loadtxt(labelfile,delimiter=",")) 12label110_csv = np.array(label110_csv) 13 14inputfiles = glob.glob("c:/keraslab/dataset/input/*.csv") 15input18_csv=[] 16for inputfile in inputfiles: 17 input18_csv.append(np.loadtxt(inputfile,delimiter=",")) 18input18_csv = np.array(input18_csv) 19 20#logスケールに変更 21label110_csv=label110_csv.clip(0.0001,1) 22input18_csv=input18_csv.clip(0.0001,1) 23 24label110_csv=np.log10(label110_csv) 25input18_csv=np.log10(input18_csv) 26 27#正規化 28input18_csv=(input18_csv-np.min(input18_csv))/(np.max(input18_csv)-np.min(input18_csv)) 29label110_csv=(label110_csv-np.min(label110_csv))/(np.max(label110_csv)-np.min(label110_csv)) 30 31#次元調整 32input18_csv= np.expand_dims(input18_csv, axis=-1) 33label110_csv = np.expand_dims(label110_csv, axis=-1) 34 35#train,testの作成 36i_train, i_test = train_test_split(input18_csv) 37l_train, l_test = train_test_split(label110_csv) 38 39#モジュールの読み込み 40from keras.layers import Input,Conv2D,BatchNormalization,Activation 41from keras.models import Model 42 43 44#DnCNN 45def network_dncnn(): 46 input_img= Input(shape=(65,80,1)) 47 48 x= Conv2D(64,kernel_size=3,activation='relu',padding='same')(input_img) 49 50 for i in range(15): 51 x= Conv2D(64,kernel_size=3,padding='same')(x) 52 x= BatchNormalization()(x) 53 x= Activation('relu')(x) 54 55 x =Conv2D(1,kernel_size=3,activation='tanh',padding='same')(x) 56 57 model=Model(input_img,x) 58 59 return model 60 61model=network_dncnn() 62 63#モデルの表示 64print(model.summary()) 65 66import keras.optimizers as optimizers 67from tensorflow.python.keras import backend as K 68 69#training 70adam=optimizers.Adam(lr=1e-3) 71model.compile(loss='mean_squared_error',optimizer='adam') 72 73#trainingパラメータ- 74training =model.fit(i_train,l_train,epochs=50,batch_size=128,shuffle=True,validation_data=(i_test,l_test),verbose=1) 75 76import matplotlib.pyplot as plt 77 78#学習履歴の表示 79def plot_history(history): 80 plt.plot(history.history['loss']) 81 plt.plot(history.history['val_loss']) 82 plt.title('model loss') 83 plt.xlabel('epoch') 84 plt.ylabel('loss') 85 plt.legend(['loss','val_loss'],loc='lower right') 86 plt.show() 87 88plot_history(training) 89 90#検証 91results = model.predict(i_test,verbose=1) 92results=np.squeeze(results) 93results
試したこと
データ数を増やしていますが、結果にほとんど影響はでていませんし、エポック数を増やしても、変わりませんでした。
補足情報(FW/ツールのバージョンなど)
画像データは、場の放射線の分布図を表すものです。
もともと0-1の範囲に表されていたものが、0.4-0.6ぐらいにおさまる、のっぺりした画像になっていしまいます。
あなたの回答
tips
プレビュー