인공지능 공부/딥러닝 논문읽기

파이썬 딥러닝 텐서플로 복잡한모델 생성

import tensorflow as tf
import numpy as np

mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_valid, y_valid) = mnist.load_data()

print(x_train.shape, y_train.shape)
print(x_valid.shape, y_valid.shape)

(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
y_train_odd = []
for y in y_train:
    if y%2 == 0:
        y_train_odd.append(0)      
    else:
        y_train_odd.append(1)
        
y_train_odd = np.array(y_train_odd)
y_train_odd.shape
(60000,)
print(y_train[:10])
print(y_train_odd[:10])
[5 0 4 1 9 2 1 3 1 4]
[1 0 0 1 1 0 1 1 1 0]
y_valid_odd = []
for y in y_valid:
    if y%2 == 0:
        y_valid_odd.append(0)      
    else:
        y_valid_odd.append(1)
        
y_valid_odd = np.array(y_valid_odd)
y_valid_odd.shape
(10000,)
x_train = x_train/255.0
x_valid = x_valid/255.0

x_train_in = tf.expand_dims(x_train, -1)
x_valid_in = tf.expand_dims(x_valid, -1)

print(x_train_in.shape, x_valid_in.shape)
(60000, 28, 28, 1) (10000, 28, 28, 1)
#Functional API를 사용하여 모델 생성

inputs = tf.keras.layers.Input(shape=(28,28,1))

conv = tf.keras.layers.Conv2D(32,(3,3), activation='relu')(inputs)
pool = tf.keras.layers.MaxPool2D((2,2))(conv)
flat = tf.keras.layers.Flatten()(pool)

flat_inputs = tf.keras.layers.Flatten()(inputs)
concat = tf.keras.layers.Concatenate()([flat, flat_inputs])
outputs = tf.keras.layers.Dense(10, activation='softmax')(concat)

model = tf.keras.models.Model(inputs = inputs, outputs = outputs)
model.summary()

from tensorflow.python.keras.utils.vis_utils import plot_model
plot_model(model, show_shapes = True, show_layer_names = True, to_file = 'functional_cnn.png')

 

model.compile(optimizer='adam', loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])

history = model.fit(x_train_in, y_train, validation_data=(x_valid_in, y_valid), epochs = 10)

val_loss, val_acc = model.evaluate(x_valid_in, y_valid)
print(val_loss, val_acc)

inputs = tf.keras.layers.Input(shape=(28,28,1), name='inputs')

conv = tf.keras.layers.Conv2D(32,(3,3),activation='relu', name='conv2d_layer')(inputs)
pool = tf.keras.layers.MaxPool2D((2,2), name='maxpool_layer')(conv)
flat = tf.keras.layers.Flatten(name='flatten_layer')(pool)

flat_inputs = tf.keras.layers.Flatten()(inputs)
concat = tf.keras.layers.Concatenate()([flat, flat_inputs])
digit_outputs = tf.keras.layers.Dense(10, activation='softmax', name='digit_dense')(concat)

odd_outputs = tf.keras.layers.Dense(1, activation='sigmoid', name='odd_dense')(flat_inputs)

model = tf.keras.models.Model(inputs = inputs, outputs=[digit_outputs, odd_outputs])

model.summary()

print(model.input)
print(model.output)
KerasTensor(type_spec=TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='inputs'), name='inputs', description="created by layer 'inputs'")
[<KerasTensor: shape=(None, 10) dtype=float32 (created by layer 'digit_dense')>, <KerasTensor: shape=(None, 1) dtype=float32 (created by layer 'odd_dense')>]
plot_model(model, show_shapes=True, show_layer_names=True, to_file='multi_output_cnn.png')

model.compile(optimizer='adam', loss={'digit_dense':'sparse_categorical_crossentropy', 'odd_dense':'binary_crossentropy'},
             loss_weights = {'digit_dense':1, 'odd_dense':0.5},
             metrics=['accuracy'])

history = model.fit({'inputs':x_train_in}, {'digit_dense':y_train, 'odd_dense':y_train_odd}, 
                    validation_data=({'inputs':x_valid_in}, {'digit_dense':y_valid, 'odd_dense':y_valid_odd}), epochs=10)

model.evaluate({'inputs':x_valid_in}, {'digit_dense':y_valid, 'odd_dense':y_valid_odd})
313/313 [==============================] - 3s 10ms/step - loss: 0.1884 - digit_dense_loss: 0.0606 - odd_dense_loss: 0.2555 - digit_dense_accuracy: 0.9844 - odd_dense_accuracy: 0.9009
[0.18837670981884003,
 0.06063273176550865,
 0.2554878294467926,
 0.9843999743461609,
 0.9009000062942505]
import matplotlib.pylab as plt

def plot_image(data, idx):
    plt.figure(figsize=(5,5))
    plt.imshow(data[idx])
    plt.axis("off")
    plt.show()
    
plot_image(x_valid,0)

digit_preds, odd_preds = model.predict(x_valid_in)

print(digit_preds[0])
print(odd_preds[0])
[3.4531422e-13 1.9672591e-10 4.3072221e-09 7.7706841e-07 1.4168223e-11
 9.1622952e-11 2.6664490e-20 9.9999917e-01 2.4213274e-09 1.3189391e-08]
[0.99957955]
digit_labels = np.argmax(digit_preds, axis=-1)
digit_labels[0:10]
array([7, 2, 1, 0, 4, 1, 4, 9, 5, 9], dtype=int64)
odd_labels = (odd_preds > 0.5).astype(np.int).reshape(1, -1)[0]
odd_labels[0:10]
array([1, 0, 1, 0, 0, 1, 0, 1, 0, 1])