python - 网络学的不多
问题描述
我正在我的 RGB 图像数据集上训练一个非常简单的网络,但似乎网络并没有学到很多东西,val 准确度从一开始就没有提高,训练准确度提高了但很少。我究竟做错了什么?这是一个简单的网络,所以我不确定发生了什么可怕的错误。
import cv2
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGenerator
import os
from keras import layers
from keras import models
from keras import optimizers
from keras.layers import Dropout
from keras.preprocessing.image import img_to_array, load_img
os.environ["CUDA_VISIBLE_DEVICES"]="0"
train_dir = '/home/d/Desktop/Bl/data/train'
eval_dir = '/home/d/Desktop/Bl/data/eval'
test_dir = '/home/d/Desktop/Bl/data/test'
# create a data generator
train_datagen = ImageDataGenerator(rescale=1./255, #Scale the image between 0 and 1
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,)
val_datagen = ImageDataGenerator(rescale=1./255) #We do not augment validation data. we only perform rescale
test_datagen = ImageDataGenerator(rescale=1./255) #We do not augment validation data. we only perform rescale
# load and iterate training dataset
train_generator = train_datagen.flow_from_directory(train_dir, class_mode='categorical', batch_size=16, shuffle='True', seed=42)
# load and iterate validation dataset
val_generator = val_datagen.flow_from_directory(eval_dir, class_mode='categorical', batch_size=16, shuffle='True', seed=42)
# load and iterate test dataset
test_generator = test_datagen.flow_from_directory(test_dir, class_mode=None, batch_size=1, shuffle='False', seed=42)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', input_shape=(256, 256, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(layers.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5)) #Dropout for regularization
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(3, activation='softmax')) #Sigmoid function at the end because we have just two classes
#Lets see our model
model.summary()
model.compile(loss='categorical_crossentropy', optimizer=optimizers.SGD(lr=1e-7, momentum=0.9), metrics=['acc'])
#Adam(lr=0.000001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0), metrics=['acc'])
#The training part
history = model.fit_generator(train_generator,
steps_per_epoch=train_generator.n // train_generator.batch_size,
epochs=200,
validation_data=val_generator,
validation_steps=val_generator.n // val_generator.batch_size)
#Save the model
model.save_weights('/home/d/Desktop/Bl/model_weights.h5')
model.save('/home/d/Desktop/Bl/model_keras.h5')
#lets plot the train and val curve
#get the details form the history object
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
#Train and validation accuracy
plt.plot(epochs, acc, 'b', label='Training accuracy')
plt.plot(epochs, val_acc, 'r', label='Validation accuracy')
plt.title('Training and Validation accurarcy')
plt.legend()
plt.figure()
#Train and validation loss
plt.plot(epochs, loss, 'b', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and Validation loss')
plt.legend()
plt.show()
解决方案
推荐阅读
- python - 如何检测数据在 DataFrame 中线性变化的连续跨度?
- node.js - 运行 express 应用程序时无法连接到 mongodb
- ruby-on-rails - 仅编辑 Rails 中的某些字段
- image-processing - Xamarin.Forms 如何保存具有 8 位色深的 JPG?
- c# - EF6 Table-per-Hierarchy (TPH) - 具有抽象属性的抽象基类不会生成迁移
- excel - Excel VBA:如果工作表受到保护,则无法使用特殊单元格
- php - 如何使用 PHP 获取表单提交的所有组合框值
- c# - 通过 c# forrm app 将 xml 文件中的值相乘
- marklogic-9 - MarkLogic:关于 search.search 与 CTS API 的设计问题
- java - WatchService 没有正确轮询