我訓練了一個模型來對 7 種不同型別的圖片進行分類。我的模型只能做一個特定的預測(在我的例子中是 numpy.ndarray),但我有興趣做一個更像概率的預測(例如 90% class1 和 80% class2 ...等)。我現在應該更改的代碼部分在哪里?我如何使用每個類的訓練模型獲得正確的概率值
import tensorflow as tf
from tensorflow.keras.layers import Input, Lambda, Dense,Flatten
from tensorflow.keras.models import Model
from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications.inception_v3 import preprocess_input
from tensorflow.keras.preprocessing import image
from tensorflow.keras.preprocessing.image import ImageDataGenerator,load_img
from tensorflow.keras.models import Sequential
import numpy as np
from glob import glob
from google.colab import drive
from google.colab import drive
drive.mount('/content/drive')
IMAGE_SIZE = [244,244]
train_path = '/content/drive/MyDrive/Programs/Datasets/Train'
test_path = '/content/drive/MyDrive/Programs/Datasets/Test'
folders = glob('/content/drive/MyDrive/Programs/Datasets/Train/*')
7個類別
['/content/drive/MyDrive/Programs/Datasets/Train/Circle', '/content/drive/MyDrive/Programs/Datasets/Train/Grapes', '/content/drive/MyDrive/Programs/Datasets/Train/Sun ', '/content/drive/MyDrive/Programs/Datasets/Train/Tree', '/content/drive/MyDrive/Programs/Datasets/Train/Square', '/content/drive/MyDrive/Programs/Datasets/Train/三角形'、'/content/drive/MyDrive/Programs/Datasets/Train/Leaf'、'/content/drive/MyDrive/Programs/Datasets/Train/Pencil']
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(30, (4, 4), activation='relu', input_shape=(224, 224, 3)),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Conv2D(60, (2, 2), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(20, activation='relu'),
tf.keras.layers.Dense(len(folders), activation='softmax')])
model.summary()
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory(train_path,
target_size = (224,224),
batch_size = 16,
class_mode = 'categorical')
test_set = test_datagen.flow_from_directory(test_path,
target_size = (224, 224),
batch_size = 16,
class_mode = 'categorical')
model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
#Traning
r = model.fit_generator(
training_set,
validation_data=test_set,
epochs=5,
steps_per_epoch=len(training_set),
validation_steps=len(test_set)
)
from tensorflow.keras.models import load_model
model.save('my_model.h5')
```
Model prediction Part
```
y_pred = model.predict(test_set)
import numpy as np
y_pred = np.argmax(y_pred, axis=1)
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image
model=load_model('my_model.h5')
img=image.load_img('/content/drive/MyDrive/Programs/Datasets/circle604.jpg',target_size=
(224,224))
x=image.img_to_array(img)
x=x/255
import numpy as np
x=np.expand_dims(x,axis=0)
img_data=preprocess_input(x)
img_data.shape
model.predict(img_data)
```
out put of model.predict(img_data)
array([[6.1735226e-09, 5.3491673e-11, 1.6549424e-09, 9.9484622e-01,
5.1531033e-03, 7.3390618e-07, 2.1824545e-16, 4.2561878e-11]],
dtype=float32)
```
# Predict with test data
predictions = model.predict(img_data)
# getting the highet probable digit
predicted_value = np.argmax(model.predict(img_data))
print("The set of predicted values")
print(model.predict(img_data))
print("\nPredicted Class : ", predicted_value)
print("Probability of the Class being ", predicted_value, " is : ",
max(model.predict(img_data)), "\n")
print(type(model.predict(img_data)))
```
#I want get class name and Probability vale for prediction
#But output results is
The set of predicted values
[[6.1735226e-09 5.3491673e-11 1.6549424e-09 9.9484622e-01 5.1531033e-03
7.3390618e-07 2.1824545e-16 4.2561878e-11]]
Predicted Class : 3
Probability of the Class being 3 is : [6.1735226e-09 5.3491673e-11 1.6549424e-09
9.9484622e-01 5.1531033e-03
7.3390618e-07 2.1824545e-16 4.2561878e-11]
<class 'numpy.ndarray'>
uj5u.com熱心網友回復:
首先有8個類別。其次,預測的輸出具有形狀 (1,8),從技術上講,它是單個串列(一行列資料)的串列,因此通過傳入,model.predict(img_data)您將取回該行。你需要做的是max(model.predict(img_data)[0])獲得最高的價值。
要獲取類名,這與標簽上使用的編碼方法有關。
此外,如果您希望,如您所說,每個類的概率為這種形式,90% 類 1 和 80% 類 2 ......等等,您應該使用sigmoid而不是softmax作為輸出層中的激活函式。softmax強制對于每個樣本,所有類別概率的總和為 1(當類別排他時使用它 - 例如:60 % 概率下雨,40 % 概率不下雨),這不是您想要的。
uj5u.com熱心網友回復:
predictions持有每個班級的“概率”。該argmax位正在選擇具有最大“概率”的類
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470222.html
