3、大数据情形下的拼接
<pre><code class="language-python">import numpy as np
import cv2
import os
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow.python.keras import backend as K
from tensorflow import keras
from tensorflow.python.keras.layers import Conv2D, MaxPooling2D
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Dropout, Flatten
from tensorflow.python.keras.optimizers import RMSprop</code></pre>
<pre><code class="language-python">images = []
if(os.path.exists("label.txt")):
os.remove("label.txt")
else:
print("nothing")
# 照片目录
file_dir="D:\\work\\jupyterNotebook\\baidu_dianshi\\data\\multi_test_data"
# 读入标签数据
df = pd.DataFrame(pd.read_csv('./data/multi_test_data_lable.csv',header=0))
def read_imgs_labels():
# 获取lables 和img_name
lables = df['lables']
img_name = df['img_name']
# 遍历文件夹内所有图片,读取图片存到img,遍历到名字,在img_name中查找
# 查找到后,获取当前行数,取出对应的label,并替换为1-6的整数存入label_name
list_files = os.listdir(file_dir)
for j in range(1500):
file = list_files[j]
img_path=file_dir+'\\'+file #每个图片的地址
#for file in os.listdir(file_dir):
# print(file)
#img_path=file_dir+'\\'+file #每个图片的地址
# img=Image.open(img_path)
i = 0
for file_name in img_name:
if file_name == file:
label = lables[i]
# print(label)
if label == 'MOUNTAIN':
label_name = 1
elif label == 'OCEAN':
label_name = 2
elif label == 'DESERT': #沙漠
label_name = 3
elif label == 'LAKE':
label_name = 4
elif label == 'FARMLAND': #农田
label_name = 5
elif label == 'CITY':
label_name = 6
# 把标签存入txt文件
label = label_name
# print (label)#ord():查看字符asc码
doc= open('label.txt','a')
print(label,file=doc)
break
else:
i = i+1
images.append(cv2.imread(img_path))
doc.close()
return images</code></pre>
<pre><code class="language-python">images = []
images = read_imgs_labels()</code></pre>
<p><code>X_img = np.array(images)</code>进行这个操作时,发现当images大于1600后会出现报错<code>ValueError: could not broadcast input array from shape (256,256) into shape (256)</code>,目前猜测可能256*256的分辨率过大,所以导入数据时,只选择了1500个样本,需要优化</p>
<pre><code class="language-python">X_img = np.array(images)</code></pre>
<pre><code class="language-python">Y_label = np.loadtxt('label.txt')</code></pre>
<pre><code class="language-python">print(X_img.shape)
print(Y_label.shape)</code></pre>
<pre><code>(1500, 256, 256, 3)
(1500,)</code></pre>
<pre><code class="language-python">x_train, x_test, y_train, y_test = train_test_split(X_img, Y_label, test_size = 0.2, random_state= 30)
print (x_train.shape)
print (x_test.shape)
print (y_train.shape)
print (y_test.shape)</code></pre>
<pre><code>(1200, 256, 256, 3)
(300, 256, 256, 3)
(1200,)
(300,)</code></pre>
<pre><code class="language-python">batch_size = 5
num_classes = 6
epochs = 3
# input image dimensions
img_rows, img_cols = 256, 256
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 3)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 3)
input_shape = (img_rows, img_cols, 3)</code></pre>
<pre><code class="language-python">x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')</code></pre>
<pre><code>x_train shape: (1200, 256, 256, 3)
1200 train samples
300 test samples</code></pre>
<pre><code class="language-python"># convert class vectors to binary class matrices
# 由于之前分六类写为了1-6 这里需要减1 变为 0-5
y_train = keras.utils.to_categorical(y_train-1, num_classes)
y_test = keras.utils.to_categorical(y_test-1, num_classes)
print(y_test[0])</code></pre>
<pre><code>[0. 0. 1. 0. 0. 0.]</code></pre>
<pre><code class="language-python">model = Sequential()
model.add(Conv2D(8, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(16, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))</code></pre>
<pre><code class="language-python">model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])</code></pre>
<pre><code class="language-python">history = model.fit(x_train, y_train,
batch_size=5,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))</code></pre>
<pre><code>Train on 1200 samples, validate on 300 samples
Epoch 1/3
1200/1200 [==============================] - 57s 48ms/step - loss: 1.6809 - acc: 0.4583 - val_loss: 1.2663 - val_acc: 0.6933
Epoch 2/3
1200/1200 [==============================] - 51s 42ms/step - loss: 1.2479 - acc: 0.6017 - val_loss: 0.9451 - val_acc: 0.7367
Epoch 3/3
1200/1200 [==============================] - 51s 42ms/step - loss: 1.1144 - acc: 0.6375 - val_loss: 1.1550 - val_acc: 0.6400</code></pre>
<pre><code class="language-python">model.save('./model.hdf5')</code></pre>
<pre><code class="language-python">model.summary()</code></pre>
<pre><code>_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 254, 254, 8) 224
_________________________________________________________________
conv2d_1 (Conv2D) (None, 252, 252, 16) 1168
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 126, 126, 16) 0
_________________________________________________________________
dropout (Dropout) (None, 126, 126, 16) 0
_________________________________________________________________
flatten (Flatten) (None, 254016) 0
_________________________________________________________________
dense (Dense) (None, 32) 8128544
_________________________________________________________________
dropout_1 (Dropout) (None, 32) 0
_________________________________________________________________
dense_1 (Dense) (None, 6) 198
=================================================================
Total params: 8,130,134
Trainable params: 8,130,134
Non-trainable params: 0
_________________________________________________________________</code></pre>
<pre><code class="language-python">import matplotlib.pyplot as plt
image_arr = np.expand_dims(x_train[1], axis=0)
layer_1 = K.function([model.layers[0].input], [model.layers[0].output])
f1 = layer_1([image_arr])[0]
for _ in range(8):
show_img = f1[:, :, :, _]
show_img.shape = [254, 254]
#plt.subplot(4, 8, _ + 1)
plt.subplot(1, 8, _ + 1)
plt.imshow(show_img, cmap='gray')
plt.axis('off')
plt.show()</code></pre>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/7092bb2f073f22f4987d873209884cad?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python">from tensorflow.python.keras.models import load_model
model = load_model('./model.hdf5')
model.fit(x_train, y_train,
batch_size=5,
epochs=10,
verbose=1,
validation_data=(x_test, y_test))</code></pre>
<pre><code>Train on 1200 samples, validate on 300 samples
Epoch 1/10
1200/1200 [==============================] - 51s 42ms/step - loss: 0.9998 - acc: 0.6850 - val_loss: 0.8985 - val_acc: 0.7267
Epoch 2/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.8694 - acc: 0.7142 - val_loss: 0.7849 - val_acc: 0.7733
Epoch 3/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.8316 - acc: 0.7258 - val_loss: 0.7806 - val_acc: 0.7767
Epoch 4/10
1200/1200 [==============================] - 51s 43ms/step - loss: 0.7685 - acc: 0.7542 - val_loss: 1.0886 - val_acc: 0.6467
Epoch 5/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.6485 - acc: 0.7958 - val_loss: 0.8501 - val_acc: 0.7467
Epoch 6/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.5867 - acc: 0.8108 - val_loss: 0.8261 - val_acc: 0.7700
Epoch 7/10
1200/1200 [==============================] - 50s 41ms/step - loss: 0.5793 - acc: 0.8267 - val_loss: 0.8209 - val_acc: 0.7533
Epoch 8/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.4912 - acc: 0.8483 - val_loss: 1.0650 - val_acc: 0.7833
Epoch 9/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.4236 - acc: 0.8617 - val_loss: 0.8549 - val_acc: 0.7833
Epoch 10/10
1200/1200 [==============================] - 50s 41ms/step - loss: 0.3854 - acc: 0.8642 - val_loss: 1.5621 - val_acc: 0.6400
<tensorflow.python.keras.callbacks.History at 0x253579c9e48></code></pre>
<pre><code class="language-python"># 评估模型
loss,accuracy = model.evaluate(x_test,y_test)
print('\ntest loss',loss)
print('accuracy',accuracy)</code></pre>
<pre><code>300/300 [==============================] - 3s 10ms/step
test loss 1.562104508082072
accuracy 0.6400000007947286</code></pre>
<pre><code class="language-python">model.save('./model.hdf5')</code></pre>
<pre><code class="language-python">model = load_model('./model.hdf5')
model.fit(x_train, y_train,
batch_size=5,
epochs=10,
verbose=1,
validation_data=(x_test, y_test))</code></pre>
<pre><code>Train on 1200 samples, validate on 300 samples
Epoch 1/10
1200/1200 [==============================] - 51s 42ms/step - loss: 0.4052 - acc: 0.8875 - val_loss: 1.1719 - val_acc: 0.7767
Epoch 2/10
1200/1200 [==============================] - 50s 41ms/step - loss: 0.3325 - acc: 0.8933 - val_loss: 0.8946 - val_acc: 0.7833
Epoch 3/10
1200/1200 [==============================] - 49s 41ms/step - loss: 0.2776 - acc: 0.9017 - val_loss: 1.2032 - val_acc: 0.7733
Epoch 4/10
1200/1200 [==============================] - 49s 41ms/step - loss: 0.2930 - acc: 0.9008 - val_loss: 1.1097 - val_acc: 0.7567
Epoch 5/10
1200/1200 [==============================] - 50s 41ms/step - loss: 0.2907 - acc: 0.9042 - val_loss: 1.3922 - val_acc: 0.7533
Epoch 6/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.2656 - acc: 0.9200 - val_loss: 1.8665 - val_acc: 0.7133
Epoch 7/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.2531 - acc: 0.9208 - val_loss: 1.2537 - val_acc: 0.7400
Epoch 8/10
1200/1200 [==============================] - 50s 41ms/step - loss: 0.2445 - acc: 0.9117 - val_loss: 1.5419 - val_acc: 0.7433
Epoch 9/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.2391 - acc: 0.9175 - val_loss: 1.5585 - val_acc: 0.7400
Epoch 10/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.1825 - acc: 0.9317 - val_loss: 1.2357 - val_acc: 0.7567
<tensorflow.python.keras.callbacks.History at 0x2541c52eda0></code></pre>
<pre><code class="language-python"># 评估模型
loss,accuracy = model.evaluate(x_test,y_test)
print('\ntest loss',loss)
print('accuracy',accuracy)</code></pre>
<pre><code>300/300 [==============================] - 2s 5ms/step
test loss 1.2356648842493694
accuracy 0.7566666666666667</code></pre>
<pre><code class="language-python">model.save('./model.hdf5')</code></pre>
<pre><code class="language-python"># 评估模型
loss,accuracy = model.evaluate(x_test,y_test)
print('\ntest loss',loss)
print('accuracy',accuracy)</code></pre>
<pre><code>300/300 [==============================] - 3s 11ms/step
test loss 1.2356648842493694
accuracy 0.7566666666666667</code></pre>
<pre><code class="language-python">model = load_model('./model.hdf5')
model.fit(x_train, y_train,
batch_size=5,
epochs=10,
verbose=1,
validation_data=(x_test, y_test))</code></pre>
<pre><code>Train on 1200 samples, validate on 300 samples
Epoch 1/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.2081 - acc: 0.9300 - val_loss: 1.3258 - val_acc: 0.7600
Epoch 2/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.1961 - acc: 0.9233 - val_loss: 1.2621 - val_acc: 0.7800
Epoch 3/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.1905 - acc: 0.9358 - val_loss: 1.2708 - val_acc: 0.7367
Epoch 4/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.1940 - acc: 0.9267 - val_loss: 1.4250 - val_acc: 0.7367
Epoch 5/10
1200/1200 [==============================] - 50s 41ms/step - loss: 0.1735 - acc: 0.9417 - val_loss: 1.7876 - val_acc: 0.7467
Epoch 6/10
1200/1200 [==============================] - 50s 41ms/step - loss: 0.1955 - acc: 0.9333 - val_loss: 1.8605 - val_acc: 0.7367
Epoch 7/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.1729 - acc: 0.9367 - val_loss: 1.8445 - val_acc: 0.7367
Epoch 8/10
1200/1200 [==============================] - 50s 42ms/step - loss: 0.1786 - acc: 0.9358 - val_loss: 1.8872 - val_acc: 0.7200
Epoch 9/10
1200/1200 [==============================] - 50s 41ms/step - loss: 0.1411 - acc: 0.9408 - val_loss: 1.5552 - val_acc: 0.7233
Epoch 10/10
1200/1200 [==============================] - 50s 41ms/step - loss: 0.1652 - acc: 0.9417 - val_loss: 1.8364 - val_acc: 0.7733
<tensorflow.python.keras.callbacks.History at 0x2541caaa3c8></code></pre>
<pre><code class="language-python"># 评估模型
loss,accuracy = model.evaluate(x_test,y_test)
print('\ntest loss',loss)
print('accuracy',accuracy)</code></pre>
<pre><code>300/300 [==============================] - 2s 5ms/step
test loss 1.836436243057251
accuracy 0.7733333341280619</code></pre>
<pre><code class="language-python">test_app = np.append(X_img,X_img)</code></pre>
<pre><code class="language-python">test_app.shape</code></pre>
<pre><code>(589824000,)</code></pre>
<pre><code class="language-python">X_img.shape</code></pre>
<pre><code>(1500, 256, 256, 3)</code></pre>
<h3>拼接</h3>
<p><code>np.concatenate((a,b),axis=0)</code>
axis = 0进行第一列拼接</p>
<p>axis 第几维进行拼接</p>
<pre><code class="language-python"> test_con = np.concatenate((X_img,X_img),axis=0)</code></pre>
<pre><code class="language-python">test_con.shape</code></pre>
<pre><code>(3000, 256, 256, 3)</code></pre>
<pre><code class="language-python">test_con_h = np.concatenate((X_img,X_img),axis=1)</code></pre>
<pre><code class="language-python">test_con_h.shape</code></pre>
<pre><code>(1500, 512, 256, 3)</code></pre>
<pre><code class="language-python">test_con_h = np.concatenate((X_img,X_img),axis=2)
print(test_con_h.shape)</code></pre>
<pre><code>(1500, 256, 512, 3)</code></pre>