训练数据
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import glob
from skimage import transform
import os
os.environ['TF_FORCE_GPU_ALLOW_GROWTH']='true'
gpuf = tf.test.is_gpu_available()
img_path = glob.glob('/root/AI-Challenge/train-val*.png')
label=[]
for path in img_path:
l = ord(path.split('/')[4])
if l in range(48,58):
label.append(l-48)
if l in range(65,73):
label.append(l-65+10)
if l in range(74,79):
label.append(l-65+10-1)
if l in range(80,91):
label.append(l-65+10-2)
np.random.seed(2021)
index = np.random.permutation(len(img_path))
img_path = np.array(img_path)[index]
label = np.array(label)[index]
label_onehot = tf.one_hot(label,depth=34)
train_count = int(len(img_path)*0.8)
val_count = len(img_path) - train_count
img_path_train = img_path[:train_count]
img_path_val = img_path[train_count:]
label_train = label_onehot[:train_count]
label_val = label_onehot[train_count:]
dataset_train = tf.data.Dataset.from_tensor_slices((img_path_train,label_train))
dataset_val = tf.data.Dataset.from_tensor_slices((img_path_val,label_val))
def pre_image(path,label):
img = tf.io.read_file(path)
img = tf.image.decode_png(img,channels=3)
img = tf.image.resize(img,[90,90])
angle = np.random.uniform(low=-5.0, high=5.0)
img = transform.rotate(img.numpy(),angle,mode = 'reflect')
img = tf.image.random_brightness(img,0.5)
img = tf.image.random_contrast(img,0.2,0.6)
img = tf.cast(img,tf.float32)
img = img/255
return img,label
def pre_image_(path,label):
img, label = tf.py_function(pre_image, inp=[path, label],
Tout=[tf.float32, tf.float32])
img = tf.reshape(img,[90,90,3])
label = tf.reshape(label,[34])
return img,label
def pre_image_val(path,label):
img = tf.io.read_file(path)
img = tf.image.decode_png(img,channels=3)
#img = tf.image.resize_with_pad(img,90,90,method='bilinear')
img = tf.image.resize(img,[90,90])
img = tf.cast(img,tf.float32)
img = img/255
return img,label
BATCH = 64
AUTOTUNE = tf.data.experimental.AUTOTUNE
dataset_train = dataset_train.map(pre_image_).shuffle(30).repeat(-1).batch(BATCH)
dataset_train = dataset_train.prefetch(buffer_size=AUTOTUNE)
dataset_val = dataset_val.map(pre_image_val).batch(BATCH)
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), padding='same',input_shape=(90,90,3), activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Conv2D(64, (3, 3), padding='same',activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(128, (3, 3), padding='same', activation='relu'),
tf.keras.layers.BatchNormalization(),
# tf.keras.layers.Dropout(0.5),
# tf.keras.layers.MaxPooling2D(),
# tf.keras.layers.Conv2D(256, (3, 3), padding='same',activation='relu'),
# tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(34,activation = 'softmax')
])
# base_model = tf.keras.applications.MobileNetV2(input_shape=(90,90,3),include_top=False)
# model1 = tf.keras.Sequential([
# base_model,
# tf.keras.layers.GlobalAveragePooling2D(),
# tf.keras.layers.Dense(1024, activation='relu'),
# tf.keras.layers.Dropout(0.5),
# tf.keras.layers.Dense(512, activation='relu'),
# tf.keras.layers.Dropout(0.5),
# tf.keras.layers.Dense(34,activation = 'softmax'),
# ])
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss = 'categorical_crossentropy',
metrics=['acc'])
history=model.fit_generator(dataset_train,
epochs=5,
steps_per_epoch=len(img_path_train)//BATCH,
validation_data=dataset_val,
validation_steps=len(img_path_val)//BATCH,
shuffle=False,
use_multiprocessing = True,workers=4)
model.save('model1.h5')



