import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline
from sklearn.model_selection import train_test_split

conda install scikit-learn

pandas读取树叶csv纹理数据

1
data = pd.read_csv('./leaf/train.csv')

查看每列的数据类型

1
data.info()
1
2
3
4
5
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 990 entries, 0 to 989
Columns: 194 entries, id to texture64
dtypes: float64(192), int64(1), object(1)
memory usage: 1.5+ MB

生产对应的数字编码( pd.factorize)

1
labels = pd.factorize(data.species)[0]# 生产对应的数字编码

pd.factorize(data.species)# 生产对应的数字编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 4, 21, 22, 23, 24, 25, 26, 25, 15, 27, 28, 3, 29,
30, 31, 32, 33, 34, 35, 4, 2, 36, 14, 37, 38, 39, 40, 6, 41, 42,
43, 44, 45, 20, 27, 14, 32, 45, 34, 46, 29, 47, 48, 49, 50, 34, 51,
17, 4, 27, 52, 53, 35, 54, 53, 40, 13, 6, 55, 56, 39, 43, 57, 58,
59, 60, 34, 61, 62, 63, 62, 64, 62, 41, 65, 34, 49, 66, 11, 51, 6,
67, 68, 69, 63, 4, 38, 23, 68, 23, 70, 36, 17, 56, 56, 3, 27, 71,
46, 72, 73, 74, 52, 33, 75, 70, 76, 47, 77, 62, 78, 79, 67, 64, 77,
32, 56, 18, 45, 12, 61, 34, 59, 41, 5, 35, 15, 20, 13, 54, 80, 81,
22, 62, 16, 82, 37, 2, 4, 75, 69, 65, 11, 72, 31, 30, 83, 19, 38,
66, 18, 84, 75, 80, 82, 81, 57, 30, 46, 0, 20, 45, 24, 85, 17, 59,
65, 4, 71, 54, 82, 24, 38, 86, 15, 10, 5, 87, 56, 11, 88, 89, 90,
59, 36, 90, 54, 91, 7, 86, 52, 33, 57, 71, 58, 41, 74, 19, 35, 21,
86, 92, 21, 91, 75, 39, 35, 7, 48, 56, 78, 7, 84, 56, 81, 86, 52,
69, 32, 58, 24, 48, 77, 5, 23, 51, 87, 67, 54, 48, 28, 7, 23, 93,
35, 32, 77, 27, 1, 12, 80, 94, 15, 50, 78, 11, 20, 89, 91, 88, 26,
12, 8, 23, 19, 43, 65, 3, 38, 87, 51, 73, 23, 67, 73, 91, 63, 69,
30, 56, 92, 49, 95, 36, 11, 72, 89, 20, 76, 30, 8, 62, 80, 70, 72,
27, 88, 68, 41, 40, 63, 24, 26, 90, 15, 56, 59, 16, 18, 96, 73, 90,
83, 78, 51, 10, 27, 22, 42, 25, 25, 49, 64, 84, 32, 33, 28, 60, 39,
19, 78, 5, 91, 89, 34, 52, 70, 58, 28, 33, 52, 63, 82, 32, 59, 66,
24, 93, 7, 13, 6, 59, 67, 61, 69, 49, 63, 66, 16, 70, 37, 87, 77,
22, 77, 9, 87, 33, 15, 2, 68, 74, 90, 14, 88, 69, 73, 94, 67, 58,
8, 51, 86, 68, 3, 58, 58, 44, 19, 12, 81, 60, 26, 55, 97, 64, 96,
83, 11, 16, 65, 98, 73, 31, 50, 96, 44, 82, 48, 31, 4, 95, 78, 85,
47, 79, 29, 9, 82, 74, 29, 84, 69, 58, 98, 84, 86, 10, 31, 74, 27,
95, 12, 79, 40, 95, 88, 22, 26, 21, 19, 98, 8, 26, 11, 5, 5, 31,
95, 24, 35, 94, 37, 11, 13, 66, 1, 41, 39, 76, 89, 35, 93, 31, 81,
15, 85, 22, 29, 89, 20, 44, 83, 21, 47, 28, 94, 27, 53, 66, 98, 26,
2, 54, 22, 55, 51, 72, 18, 71, 57, 59, 80, 45, 76, 82, 65, 45, 50,
89, 76, 6, 52, 90, 33, 73, 83, 68, 14, 63, 31, 9, 6, 40, 85, 97,
36, 58, 71, 94, 71, 50, 42, 12, 40, 12, 76, 41, 43, 4, 98, 30, 83,
50, 44, 79, 5, 25, 92, 55, 27, 97, 37, 31, 69, 18, 16, 72, 55, 43,
8, 64, 46, 46, 91, 64, 81, 0, 29, 59, 61, 25, 38, 32, 57, 38, 75,
97, 20, 46, 65, 43, 93, 29, 83, 88, 37, 19, 75, 50, 1, 89, 73, 3,
36, 6, 57, 49, 16, 30, 13, 57, 40, 48, 17, 4, 62, 61, 1, 74, 39,
19, 21, 73, 25, 9, 7, 80, 84, 55, 69, 43, 36, 70, 39, 10, 19, 85,
66, 8, 62, 78, 0, 41, 21, 72, 22, 63, 49, 24, 87, 16, 20, 74, 62,
30, 1, 54, 9, 14, 67, 71, 88, 23, 77, 76, 23, 67, 17, 96, 29, 76,
5, 76, 87, 47, 3, 65, 48, 45, 74, 35, 9, 1, 9, 81, 2, 14, 17,
93, 17, 38, 12, 54, 32, 6, 21, 11, 53, 97, 46, 82, 33, 53, 79, 30,
39, 92, 96, 46, 86, 0, 7, 2, 59, 28, 13, 94, 10, 35, 53, 14, 77,
75, 67, 93, 79, 20, 13, 0, 98, 92, 79, 44, 82, 36, 37, 38, 2, 42,
84, 48, 34, 98, 39, 95, 41, 41, 66, 85, 80, 70, 52, 10, 98, 96, 15,
8, 71, 73, 85, 83, 87, 79, 55, 83, 71, 64, 96, 49, 78, 44, 60, 84,
93, 12, 55, 68, 46, 94, 31, 83, 68, 79, 97, 79, 67, 47, 88, 97, 84,
86, 26, 14, 30, 54, 28, 10, 53, 98, 0, 16, 93, 82, 18, 34, 45, 89,
80, 64, 74, 43, 55, 15, 65, 46, 22, 93, 18, 60, 3, 21, 18, 94, 51,
13, 60, 40, 75, 51, 0, 43, 92, 42, 61, 25, 44, 1, 97, 16, 3, 92,
97, 43, 50, 72, 81, 37, 61, 47, 22, 61, 52, 29, 97, 28, 75, 6, 49,
47, 80, 2, 39, 17, 74, 81, 40, 90, 70, 66, 91, 80, 94, 71, 33, 95,
14, 52, 28, 87, 77, 98, 21, 37, 92, 49, 92, 26, 1, 10, 42, 69, 42,
57, 89, 60, 91, 8, 34, 33, 7, 68, 2, 61, 84, 85, 96, 10, 60, 54,
94, 40, 0, 66, 36, 56, 95, 28, 26, 47, 24, 42, 53, 32, 9, 87, 60,
53, 91, 68, 65, 44, 48, 77, 23, 25, 75, 25, 42, 88, 50, 61, 64, 0,
88, 62, 8, 76, 96, 93, 24, 81, 90, 44, 1, 72, 58, 78, 38, 48, 70,
37, 36, 63, 91, 96, 51, 57, 63, 85, 9, 3, 78, 42, 90, 45, 86, 17,
92, 64, 50, 72, 85, 95, 29, 70, 18, 86, 90, 45, 60, 95, 53, 47, 5,
57, 55, 7, 13], dtype=int64),
Index(['Acer_Opalus', 'Pterocarya_Stenoptera', 'Quercus_Hartwissiana',
'Tilia_Tomentosa', 'Quercus_Variabilis', 'Magnolia_Salicifolia',
'Quercus_Canariensis', 'Quercus_Rubra', 'Quercus_Brantii',
'Salix_Fragilis', 'Zelkova_Serrata', 'Betula_Austrosinensis',
'Quercus_Pontica', 'Quercus_Afares', 'Quercus_Coccifera',
'Fagus_Sylvatica', 'Phildelphus', 'Acer_Palmatum', 'Quercus_Pubescens',
'Populus_Adenopoda', 'Quercus_Trojana', 'Alnus_Sieboldiana',
'Quercus_Ilex', 'Arundinaria_Simonii', 'Acer_Platanoids',
'Quercus_Phillyraeoides', 'Cornus_Chinensis', 'Liriodendron_Tulipifera',
'Cytisus_Battandieri', 'Rhododendron_x_Russellianum', 'Alnus_Rubra',
'Eucalyptus_Glaucescens', 'Cercis_Siliquastrum', 'Cotinus_Coggygria',
'Celtis_Koraiensis', 'Quercus_Crassifolia', 'Quercus_Kewensis',
'Cornus_Controversa', 'Quercus_Pyrenaica', 'Callicarpa_Bodinieri',
'Quercus_Alnifolia', 'Acer_Saccharinum', 'Prunus_X_Shmittii',
'Prunus_Avium', 'Quercus_Greggii', 'Quercus_Suber',
'Quercus_Dolicholepis', 'Ilex_Cornuta', 'Tilia_Oliveri',
'Quercus_Semecarpifolia', 'Quercus_Texana', 'Ginkgo_Biloba',
'Liquidambar_Styraciflua', 'Quercus_Phellos', 'Quercus_Palustris',
'Alnus_Maximowiczii', 'Quercus_Agrifolia', 'Acer_Pictum',
'Acer_Rufinerve', 'Lithocarpus_Cleistocarpus',
'Viburnum_x_Rhytidophylloides', 'Ilex_Aquifolium', 'Acer_Circinatum',
'Quercus_Coccinea', 'Quercus_Cerris', 'Quercus_Chrysolepis',
'Eucalyptus_Neglecta', 'Tilia_Platyphyllos', 'Alnus_Cordata',
'Populus_Nigra', 'Acer_Capillipes', 'Magnolia_Heptapeta', 'Acer_Mono',
'Cornus_Macrophylla', 'Crataegus_Monogyna', 'Quercus_x_Turneri',
'Quercus_Castaneifolia', 'Lithocarpus_Edulis', 'Populus_Grandidentata',
'Acer_Rubrum', 'Quercus_Imbricaria', 'Eucalyptus_Urnigera',
'Quercus_Crassipes', 'Viburnum_Tinus', 'Morus_Nigra',
'Quercus_Vulcanica', 'Alnus_Viridis', 'Betula_Pendula', 'Olea_Europaea',
'Quercus_Ellipsoidalis', 'Quercus_x_Hispanica', 'Quercus_Shumardii',
'Quercus_Rhysophylla', 'Castanea_Sativa', 'Ulmus_Bergmanniana',
'Quercus_Nigra', 'Salix_Intergra', 'Quercus_Infectoria_sub',
'Sorbus_Aria'],
dtype='object'))

去掉前两列 id、species

1
x = data[data.columns[2:]]

划分训练和测试数据

1
train_x ,test_x,train_y,test_y = train_test_split(x,labels)#划分训练和测试数据

标准化

1
2
3
4
5
#标准化
mean = train_x.mean(axis=0)
std = train_x.std(axis=0)
np.save(file='mean.npy',arr=mean)
np.save(file='std.npy',arr=std)
1
2
train_x = (train_x - mean)/std
test_x = (test_x - mean)/std

维度扩展

==把每一条数据看出一条序列==

一维卷积或者LSTM:samples,step,feature

1
2
train_x = np.expand_dims(train_x,axis=-1)
test_x = np.expand_dims(test_x,axis=-1)

构建模型

1
2
3
4
5
6
model = keras.Sequential()
model.add(layers.Conv1D(32,7,input_shape=(train_x.shape[1:]),activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Conv1D(32,7,activation='relu',padding='same'))
model.add(layers.GlobalAveragePooling1D())
model.add(layers.Dense(99,activation='softmax'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d (Conv1D) (None, 192, 32) 256
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, 64, 32) 0
_________________________________________________________________
conv1d_1 (Conv1D) (None, 64, 32) 7200
_________________________________________________________________
global_average_pooling1d (Gl (None, 32) 0
_________________________________________________________________
dense (Dense) (None, 99) 3267
=================================================================
Total params: 10,723
Trainable params: 10,723
Non-trainable params: 0
_________________________________________________________________

查看输出 (model.output_shape)

1
model.output_shape

模型配置

1
2
3
4
model.compile(optimizer=keras.optimizers.RMSprop(),
loss=keras.losses.sparse_categorical_crossentropy,
metrics=['acc']
)

模型训练

1
2
3
4
5
history = model.fit(train_x,train_y,
epochs=800,
batch_size=128,
validation_data=(test_x,test_y)
)

绘制模型数据变化

1
2
3
plt.plot(history.epoch,history.history.get('acc'),label='acc')
plt.plot(history.epoch,history.history.get('val_acc'),label='val_acc')
plt.legend()

模型优化 (Dropout)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
model = keras.Sequential()
model.add(layers.Conv1D(32,7,input_shape=(train_x.shape[1:]),activation='relu',padding='same'))
model.add(layers.Conv1D(32,7,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(32,7,activation='relu',padding='same'))
model.add(layers.Conv1D(32,7,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(64,7,activation='relu',padding='same'))
model.add(layers.Conv1D(64,7,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(64,7,activation='relu',padding='same'))
model.add(layers.Conv1D(64,7,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.GlobalAveragePooling1D())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(99,activation='softmax'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d_2 (Conv1D) (None, 192, 32) 256
_________________________________________________________________
conv1d_3 (Conv1D) (None, 192, 32) 7200
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 64, 32) 0
_________________________________________________________________
dropout (Dropout) (None, 64, 32) 0
_________________________________________________________________
conv1d_4 (Conv1D) (None, 64, 32) 7200
_________________________________________________________________
conv1d_5 (Conv1D) (None, 64, 32) 7200
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 21, 32) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 21, 32) 0
_________________________________________________________________
conv1d_6 (Conv1D) (None, 21, 64) 14400
_________________________________________________________________
conv1d_7 (Conv1D) (None, 21, 64) 28736
_________________________________________________________________
max_pooling1d_3 (MaxPooling1 (None, 7, 64) 0
_________________________________________________________________
dropout_2 (Dropout) (None, 7, 64) 0
_________________________________________________________________
conv1d_8 (Conv1D) (None, 7, 64) 28736
_________________________________________________________________
conv1d_9 (Conv1D) (None, 7, 64) 28736
_________________________________________________________________
max_pooling1d_4 (MaxPooling1 (None, 2, 64) 0
_________________________________________________________________
dropout_3 (Dropout) (None, 2, 64) 0
_________________________________________________________________
global_average_pooling1d_1 ( (None, 64) 0
_________________________________________________________________
dropout_4 (Dropout) (None, 64) 0
_________________________________________________________________
dense_1 (Dense) (None, 99) 6435
=================================================================
Total params: 128,899
Trainable params: 128,899
Non-trainable params: 0
_________________________________________________________________

模型配置

1
2
3
4
model.compile(optimizer=keras.optimizers.RMSprop(),
loss=keras.losses.sparse_categorical_crossentropy,
metrics=['acc']
)

模型训练

1
2
3
4
5
history = model.fit(train_x,train_y,
epochs=1000,
batch_size=128,
validation_data=(test_x,test_y)
)

绘制模型数据变化

1
2
3
plt.plot(history.epoch,history.history.get('acc'),label='acc')
plt.plot(history.epoch,history.history.get('val_acc'),label='val_acc')
plt.legend()

模型优化(增加层的核大小)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
model = keras.Sequential()
model.add(layers.Conv1D(32,11,input_shape=(train_x.shape[1:]),activation='relu',padding='same'))
model.add(layers.Conv1D(32,11,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(64,11,activation='relu',padding='same'))
model.add(layers.Conv1D(64,11,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(128,11,activation='relu',padding='same'))
model.add(layers.Conv1D(128,11,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(256,11,activation='relu',padding='same'))
model.add(layers.Conv1D(256,11,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.GlobalAveragePooling1D())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(99,activation='softmax'))

模型配置

1
2
3
4
model.compile(optimizer=keras.optimizers.RMSprop(),
loss=keras.losses.sparse_categorical_crossentropy,
metrics=['acc']
)

模型训练

1
2
3
4
history = model.fit(train_x,train_y,
epochs=1000,
validation_data=(test_x,test_y)
)

绘制模型数据变化

1
2
3
plt.plot(history.epoch,history.history.get('acc'),label='acc')
plt.plot(history.epoch,history.history.get('val_acc'),label='val_acc')
plt.legend()

模型优化(增加层的宽度)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
model = keras.Sequential()
model.add(layers.Conv1D(64,11,input_shape=(train_x.shape[1:]),activation='relu',padding='same'))
model.add(layers.Conv1D(64,11,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(128,11,activation='relu',padding='same'))
model.add(layers.Conv1D(128,11,activation='relu',padding='same'))
model.add(layers.MaxPooling1D(3))
model.add(layers.Dropout(0.5))
model.add(layers.Conv1D(512,11,activation='relu',padding='same'))
model.add(layers.Conv1D(512,11,activation='relu',padding='same'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(256,activation='relu'))
model.add(layers.GlobalAveragePooling1D())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(99,activation='softmax'))

模型配置

1
2
3
4
model.compile(optimizer=keras.optimizers.RMSprop(),
loss=keras.losses.sparse_categorical_crossentropy,
metrics=['acc']
)

模型训练

1
2
3
4
history = model.fit(train_x,train_y,
epochs=1000,
validation_data=(test_x,test_y)
)

绘制模型数据变化

1
2
3
plt.plot(history.epoch,history.history.get('acc'),label='acc')
plt.plot(history.epoch,history.history.get('val_acc'),label='val_acc')
plt.legend()