最近一直被同一個問題困擾 想詢問一下
如果同時有照片又有數值 怎麼一起訓練模型?
因為照片轉成RPG矩陣後會變成很大的矩陣
不知道該怎麼加入變數列 一起成為輸入資料進去模型
如
csv檔裡面含有照片路徑、性別、年齡等數值
照片切割成50x50,照片總共有100張
那進去訓練的資料大小就會是(100,50,50,3)
要怎麼再加入excel上的數值資料(像是年紀啊、性別啊)一起訓練啊
數據使用:https://www.kaggle.com/andrewmvd/ocular-disease-recognition-odir5k
讀取函式庫
import pandas as pd
import numpy as np
from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input
from tensorflow.keras import layers
from tensorflow.keras.models import Model
%pylab inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from tensorflow.keras.applications.vgg16 import preprocess_input
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, InputLayer
from keras.models import Sequential
from keras import optimizers
from imblearn.over_sampling import RandomOverSampler
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
讀取csv資料
data = pd.read_csv(r"/content/drive/MyDrive/full_df.csv")
data.head()
設定Y
df_label = data[['N','D','G','C','A','H','M','O']]
y = np.array(df_label)
*** 影像模型 ***
讀取照片並轉成RPG (6392, 50, 50, 3)
# Read images and merge them into the training data X.
len_data = len(data)
X = np.array([])
path = '/content/drive/MyDrive/ODIR-5K/ODIR-5K/Training Images/'
for i in range(len_data):
input_path = path + data['filename'][i]
# Load image and Resize into (50, 50)
img = image.load_img(input_path, target_size=(50, 50))
# Add one dimension and Become to (1, 224, 224, 3), which the last dimension is color.
img2 = image.img_to_array(img)
img2 = np.expand_dims(img2, axis=0)
#print(img2.shape)
if len(X.shape) == 1:
X = img2
else:
# Combine the pixels of all images
X = np.concatenate((X, img2), axis=0)
X = preprocess_input(X)
使用VGG16模型訓練照片
# Set VGG16 Model
base_model = VGG16(weights='imagenet', include_top=False)
# Connect My Layer
x = base_model.output
#x = layers.Flatten()(x)
x = layers.GlobalAveragePooling2D()(x)
#x = layers.Dropout(0.2)(x)
x = layers.Dense(256, activation='relu')(x)
#x = layers.Dropout(0.2)(x)
x = layers.Dense(64, activation='relu')(x)
x = layers.Dense(7, activation='sigmoid')(x)
# Set New Model inputs/outputs
model = Model(inputs=base_model.input, outputs=x)
# Original layers of VGG16 are not retrained
for layer in base_model.layers:
layer.trainable = False
model.compile(optimizer='adam', loss='binary_crossentropy')
訓練照片模型
pic_output = model.fit(X, y, epochs=5, validation_split=0.2, verbose=2)
*** 數值模型 ***
資料輸入格式是 (6392, 3)
# X:病人性別
# 把Patient Sex轉成dummy code
label_encoder = preprocessing.LabelEncoder()
data['Patient Sex'] = label_encoder.fit_transform(data["Patient Sex"])
# X:病人年紀
data['Patient Age']
# X:眼睛左邊/右邊
for i in range(len_data):
if 'right' in data['filename'][i]:
data.loc[i,'side'] = 0
else:
data.loc[i,'side'] = 1
# 數值部分的dataframe
X_Numerical = data[['Patient Sex','Patient Age','side']]
X_Numerical_array = np.array(X_Numerical)
數值使用KNN模型(?)
knn = KNeighborsClassifier()
numerical_output = knn.fit(X_Numerical_array,y)
*** 我想要合併,但會出錯 ***
output_combined = concatenate([pic_output, numerical_output])
影像模型的參考網站大概如下,模型是參考他的,但因為自己還有數值資料,想加入一起分析,不知道該怎麼做,所以來求助
https://ithelp.ithome.com.tw/m/articles/10237020?sc=iThomeR
再麻煩指教!萬分感激!